SQL Server数据库连接。http://www.cnblogs.com/samwu/archive/2011/08/30/2159355.html
DataReader方式的插入数据行,删除数据行,查询数据行,更新数据行。
DataReader手工分页。http://www.cnblogs.com/samwu/archive/2011/06/16/2082313.html
DataReader和DataSet的比较。http://www.cnblogs.com/samwu/archive/2011/09/26/2191723.html
DataAdapter方式的插入数据行,删除数据行,查询数据行,更新数据行。
DataSet的基本使用。http://www.cnblogs.com/samwu/archive/2010/10/13/1850559.html
类型化DataSet。
ADO.NET使用存储过程。http://www.cnblogs.com/samwu/archive/2011/09/19/2181378.html
ADO.NET使用事务。http://www.cnblogs.com/samwu/archive/2011/08/30/2159380.html
ADO.NET连接池。http://www.cnblogs.com/waw/archive/2011/08/29/2158762.html和
http://jingyan.baidu.com/article/a3a3f811a5e2638da2eb8a02.html
SqlDataSource控件使用。
编写自己的SQLHelper类。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
DataReader方式的插入数据行 :
View Code
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public
partial
class _Default : System.Web.UI.Page
{
protected
void Page_Load(
object sender, EventArgs e)
{
}
protected
void Button1_Click(
object sender, EventArgs e)
{
string sqlconnstr = ConfigurationManager.ConnectionStrings[
"
ConnectionString
"].ConnectionString;
SqlConnection sqlconn =
new SqlConnection(sqlconnstr);
//
建立Command对象
SqlCommand sqlcommand =
new SqlCommand();
sqlcommand.Connection = sqlconn;
//
把SQL语句赋给Command对象
sqlcommand.CommandText =
"
insert into student(no,name,sex,birth,address,photo) values (@no,@name,@sex,@birth,@address,@photo)
";
sqlcommand.Parameters.AddWithValue(
"
@no
",TextBox1.Text);
sqlcommand.Parameters.AddWithValue(
"
@name
",TextBox2.Text);
sqlcommand.Parameters.AddWithValue(
"
@sex
",DropDownList1.Text);
sqlcommand.Parameters.AddWithValue(
"
@birth
",TextBox3.Text);
sqlcommand.Parameters.AddWithValue(
"
@address
",TextBox4.Text);
sqlcommand.Parameters.AddWithValue(
"
@photo
",FileUpload1.FileName);
try
{
//
打开连接
sqlconn.Open();
//
执行SQL命令,ExecuteNonQuery();返回值是执行的影响行数
sqlcommand.ExecuteNonQuery();
//
把学生的照片上传到网站的“image”文件夹中
if (FileUpload1.HasFile ==
true)
{
FileUpload1.SaveAs(Server.MapPath((
"
~/image/
") + FileUpload1.FileName));
}
Label1.Text =
"
成功增加记录
";
}
catch (Exception ex)
{
Label1.Text =
"
错误原因:
"+ex.Message;
}
finally
{
sqlcommand =
null;
sqlconn.Close();
sqlconn =
null;
}
}
}
DataReader方式的删除数据行:
View Code
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public
partial
class command : System.Web.UI.Page
{
protected
void Page_Load(
object sender, EventArgs e)
{
}
protected
void Button1_Click(
object sender, EventArgs e)
{
int intDeleteCount;
string sqlconnstr = ConfigurationManager.ConnectionStrings[
"
ConnectionString
"].ConnectionString;
SqlConnection sqlconn =
new SqlConnection(sqlconnstr);
//
建立Command对象
SqlCommand sqlcommand =
new SqlCommand();
//
Command对象的属性赋值
sqlcommand.Connection = sqlconn;
sqlcommand.CommandText =
"
delete from student where no=@no
";
sqlcommand.Parameters.AddWithValue(
"
@no
",TextBox1.Text);
try
{
sqlconn.Open();
intDeleteCount=sqlcommand.ExecuteNonQuery();
if (intDeleteCount>
0)
Label1.Text =
"
成功删除记录
";
else
Label1.Text =
"
该记录不存在
";
}
catch (Exception ex)
{
Label1.Text =
"
错误原因:
"+ex.Message;
}
finally
{
sqlcommand =
null;
sqlconn.Close();
sqlconn =
null;
}
}
}
DataReader方式的更新数据行:
View Code
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
public
partial
class _Default : System.Web.UI.Page
{
protected
void Page_Load(
object sender, EventArgs e)
{
}
protected
void Button1_Click(
object sender, EventArgs e)
{
int intUpdateCount;
string sqlconnstr = ConfigurationManager.ConnectionStrings[
"
ConnectionString
"].ConnectionString;
SqlConnection sqlconn =
new SqlConnection(sqlconnstr);
//
建立Command对象
SqlCommand sqlcommand =
new SqlCommand();
sqlcommand.Connection = sqlconn;
//
把SQL语句赋给Command对象
sqlcommand.CommandText =
"
update_student
";
//
说明命令类型为存储过程
sqlcommand.CommandType = CommandType.StoredProcedure;
sqlcommand.Parameters.AddWithValue(
"
@no
", TextBox1.Text);
sqlcommand.Parameters.AddWithValue(
"
@name
", TextBox2.Text);
sqlcommand.Parameters.AddWithValue(
"
@sex
", DropDownList1.Text);
sqlcommand.Parameters.AddWithValue(
"
@birth
", TextBox3.Text);
sqlcommand.Parameters.AddWithValue(
"
@address
", TextBox4.Text);
sqlcommand.Parameters.AddWithValue(
"
@photo
", FileUpload1.FileName);
try
{
//
打开连接
sqlconn.Open();
//
执行SQL命令
intUpdateCount=sqlcommand.ExecuteNonQuery();
//
把学生的照片上传到网站的“image”文件夹中
if (FileUpload1.HasFile ==
true)
{
FileUpload1.SaveAs(Server.MapPath((
"
~/image/
") + FileUpload1.FileName));
}
if (intUpdateCount >
0)
Label1.Text =
"
成功修改记录
";
else
Label1.Text =
"
该记录不存在
";
}
catch (Exception ex)
{
Label1.Text =
"
错误原因:
" + ex.Message;
}
finally
{
sqlcommand =
null;
sqlconn.Close();
sqlconn =
null;
}
}
}
从以上三个例子,可以看出,插入,删除,更新,都一个关键字,ExecuteNonQuery方法,返回的是影响行数。、
可以的话,来个ExecuteScalar 方法。
cmd.CommandText =
"
Insert into T_Users(UserName,Password)
output inserted.Id values(
'
admin
',
'
888888
')
"
;
int i = Convert.ToInt32(cmd.ExecuteScalar());
得到自动增长字段的主键值,在values关键词前加上output inserted.Id,其中Id为主键字段名。执行结果就试插入的主键值,用ExecuteScalar执行最方便。SqlCommand的ExecuteScalar方法用于执行查询,并返回查询所返回的结果集中第一行的第一列,因为不能确定返回值的类型,所以返回值是object类型。
DataReader方式的查询数据行:
View Code
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public
partial
class _Default : System.Web.UI.Page
{
protected
void Page_Load(
object sender, EventArgs e)
{
string sqlconnstr = ConfigurationManager.ConnectionStrings[
"
ConnectionString
"].ConnectionString;
SqlConnection sqlconn =
new SqlConnection(sqlconnstr);
SqlCommand sqlcommand =
new SqlCommand();
sqlcommand.Connection = sqlconn;
//
打开连接
sqlconn.Open();
//
建立Command对象
sqlcommand.CommandText =
"
select * from student
";
//
建立DataReader对象,返回查询结果
SqlDataReader sqldatareader=sqlcommand.ExecuteReader();
//
逐行遍历查询结果
while(sqldatareader.Read())
{
Label1.Text += sqldatareader.GetString(
0) +
"
";
Label1.Text += sqldatareader.GetString(
1) +
"
";
Label1.Text += sqldatareader.GetString(
2) +
"
";
Label1.Text += sqldatareader.GetDateTime(
3) +
"
";
Label1.Text += sqldatareader.GetString(
4) +
"
";
Label1.Text += sqldatareader.GetString(
5) +
"
<br />
";
};
sqlcommand =
null;
sqlconn.Close();
sqlconn =
null;
}
}
reader的GetString、GetInt32等方法只接受整数参数,也就是序号,用GetOrdinal方法根据列名动态得到序号。
参数在SQLServer内部不是简单的字符串替换,SQLServer直接用添加的值进行数据比较,因此不会有注入漏洞攻击。
DataAdapter方式的查询数据行
View Code
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public
partial
class adapter2 : System.Web.UI.Page
{
protected
void Page_Load(
object sender, EventArgs e)
{
string sqlconnstr = ConfigurationManager.ConnectionStrings[
"
ConnectionString
"].ConnectionString;
SqlConnection sqlconn =
new SqlConnection(sqlconnstr);
//
建立DataSet对象
DataSet ds =
new DataSet();
//
建立DataTable对象
DataTable dtable;
//
建立DataRowCollection对象
DataRowCollection coldrow;
//
建立DataRow对象
DataRow drow;
//
打开连接
sqlconn.Open();
//
建立DataAdapter对象
SqlDataAdapter sqld =
new SqlDataAdapter(
"
select * from student
", sqlconn);
//
用Fill方法返回的数据,填充DataSet,数据表取名为“tabstudent”
sqld.Fill(ds,
"
tabstudent
");
//
将数据表tabstudent的数据复制到DataTable对象
dtable = ds.Tables[
"
tabstudent
"];
//
用DataRowCollection对象获取这个数据表的所有数据行
coldrow = dtable.Rows;
//
逐行遍历,取出各行的数据
for (
int inti =
0; inti < coldrow.Count; inti++)
{
drow = coldrow[inti];
Label1.Text +=
"
学号:
" + drow[
0];
Label1.Text +=
"
姓名:
" + drow[
1];
Label1.Text +=
"
性别:
" + drow[
2];
Label1.Text +=
"
出生日期:
" + drow[
3];
Label1.Text +=
"
地址:
" + drow[
4] +
"
<br />
";
}
sqlconn.Close();
sqlconn =
null;
}
}
遍历数据行还可以,foreach(DataRow row in dataset.Tables[0].Rows) {row["Name"]}
DataAdapter方式的更新数据行
View Code
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
public
partial
class _Default : System.Web.UI.Page
{
protected
void Page_Load(
object sender, EventArgs e)
{
}
protected
void Button1_Click(
object sender, EventArgs e)
{
string sqlconnstr = ConfigurationManager.ConnectionStrings[
"
ConnectionString
"].ConnectionString;
SqlConnection sqlconn =
new SqlConnection(sqlconnstr);
//
建立DataSet对象
DataSet ds =
new DataSet();
//
建立DataTable对象
DataTable dtable;
//
建立DataRowCollection对象
//
DataRowCollection coldrow;
//
建立DataRow对象
DataRow drow;
//
打开连接
sqlconn.Open();
//
建立DataAdapter对象
SqlDataAdapter sqld =
new SqlDataAdapter(
"
select * from student
", sqlconn);
//
定义Update命令,其中@NAME,@NO是两个参数
sqld.UpdateCommand =
new SqlCommand(
"
UPDATE student SET NAME = @NAME WHERE NO = @NO
", sqlconn);
//
定义@NAME参数,对应于student表的NAME列
sqld.UpdateCommand.Parameters.Add(
"
@NAME
", SqlDbType.VarChar,
50,
"
NAME
");
//
定义@NO参数,对应于student表的NO列,而且@NO是修改前的原值
SqlParameter parameter = sqld.UpdateCommand.Parameters.Add(
"
@NO
", SqlDbType.VarChar,
10);
parameter.SourceColumn =
"
NO
";
parameter.SourceVersion = DataRowVersion.Original;
//
用Fill方法返回的数据,填充DataSet,数据表取名为“tabstudent”
sqld.Fill(ds,
"
tabstudent
");
//
将数据表tabstudent的数据复制到DataTable对象
dtable = ds.Tables[
"
tabstudent
"];
//
用DataRowCollection对象获取这个数据表的所有数据行
//
coldrow = dtable.Rows;
//
修改操作,逐行遍历,取出各行的数据
for (
int inti =
0; inti < dtable.Rows.Count; inti++)
{
drow = dtable.Rows[inti];
//
给每位学生姓名后加上字母A
drow[
1]=drow[
1]+
"
A
";
}
//
提交更新
sqld.Update(ds,
"
tabstudent
");
sqlconn.Close();
sqlconn =
null;
Label1.Text =
"
更新成功
";
}
}
这个例子是自己写的UpdateCommand方法。
可以调用SqlDataAdapter的Update方法将对DataSet的修改提交到数据库,Update方法有很多重载方法,可以提交整个DataSet、DataTable或者若干DataRow。但是需要为SqlDataAdapter提供DeleteCommand、UpdateCommand、InsertCommand它才知道如何将对DataSet的修改提交到数据库,由于这几个Command要求的格式非常苛刻,因此开发人员自己写非常困难,可以用SqlCommandBuilder自动生成这几个Command,用法很简单:new SqlCommandBuilder(adapter)。查看生成的Command(没有直接赋值给SqlDataAdapter ,看SqlCommandBuilder的)。SqlCommandBuilder要求表必须有主键。
下面这个例子就是SqlCommandBuilder自动生成的InsertCommand方法,也就是DataAdapter方式的插入数据行
View Code
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
public
partial
class _Default : System.Web.UI.Page
{
protected
void Page_Load(
object sender, EventArgs e)
{
}
protected
void Button1_Click(
object sender, EventArgs e)
{
string sqlconnstr = ConfigurationManager.ConnectionStrings[
"
ConnectionString
"].ConnectionString;
SqlConnection sqlconn =
new SqlConnection(sqlconnstr);
//
建立DataSet对象
DataSet ds =
new DataSet();
//
建立DataTable对象
DataTable dtable;
//
建立DataRow对象
DataRow drow;
//
打开连接
sqlconn.Open();
//
建立DataAdapter对象
SqlDataAdapter sqld =
new SqlDataAdapter(
"
select * from student
", sqlconn);
//
建立 CommandBuilder 对象来自动生成 DataAdapter 的 Command 命令,否则就要自己编写
//
Insertcommand ,deletecommand , updatecommand 命令。
SqlCommandBuilder cb =
new SqlCommandBuilder(sqld);
//
用Fill方法返回的数据,填充DataSet,数据表取名为“tabstudent”
sqld.Fill(ds,
"
tabstudent
");
//
将数据表tabstudent的数据复制到DataTable对象
dtable = ds.Tables[
"
tabstudent
"];
//
增加新记录
drow = ds.Tables[
"
tabstudent
"].NewRow();
//
给该记录赋值
drow[
0] =
"
19
";
drow[
1] =
"
陈峰
";
drow[
2] =
"
男
";
ds.Tables[
"
tabstudent
"].Rows.Add(drow);
//
提交更新
sqld.Update(ds,
"
tabstudent
");
sqlconn.Close();
sqlconn =
null;
Label1.Text =
"
增加成功
";
}
}
DataAdapter方式的删除数据行
View Code
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
public
partial
class _Default : System.Web.UI.Page
{
protected
void Page_Load(
object sender, EventArgs e)
{
}
protected
void Button1_Click(
object sender, EventArgs e)
{
string sqlconnstr = ConfigurationManager.ConnectionStrings[
"
ConnectionString
"].ConnectionString;
SqlConnection sqlconn =
new SqlConnection(sqlconnstr);
//
建立DataSet对象
DataSet ds =
new DataSet();
//
建立DataTable对象
DataTable dtable;
//
建立DataRowCollection对象
DataRowCollection coldrow;
//
建立DataRow对象
DataRow drow;
//
打开连接
sqlconn.Open();
//
建立DataAdapter对象
SqlDataAdapter sqld =
new SqlDataAdapter(
"
select * from student
", sqlconn);
//
建立 CommandBuilder 对象来自动生成 DataAdapter 的 Command 命令,否则就要自己编写
//
Insertcommand ,deletecommand , updatecommand 命令。
SqlCommandBuilder cb =
new SqlCommandBuilder(sqld);
//
用Fill方法返回的数据,填充DataSet,数据表取名为“tabstudent”
sqld.Fill(ds,
"
tabstudent
");
//
将数据表tabstudent的数据复制到DataTable对象
dtable = ds.Tables[
"
tabstudent
"];
//
用DataRowCollection对象获取这个数据表的所有数据行
coldrow = dtable.Rows;
//
逐行遍历,删除符合条件的记录
for (
int inti =
0; inti < coldrow.Count; inti++)
{
drow = coldrow[inti];
if (drow[
"
address
"].ToString()==
"")
drow.Delete();
}
//
提交更新
sqld.Update(ds,
"
tabstudent
");
sqlconn.Close();
sqlconn =
null;
Label1.Text =
"
删除成功
";
}
}