要点一:SqlConnection类和DataReader类相关
(1)ADO.Net中通过SqlConnection类创建到SQLServer的连接,SqlConnection代表一个数据库连接,ADO.Net中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理。
(2)SqlCommand表示向服务器提交的一个命令(SQL语句等),CommandText属性为要执行的SQL语句,ExecuteNonQuery方法执行一个非查询语句(Update、Insert、Delete等),ExecuteNonQuery返回值是执行的影响行数。
例如:
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "Insert intoT_Users(UserName,Password) values('admin','888888')";
cmd.ExecuteNonQuery();
(3)SqlCommand的ExecuteScalar方法用于执行查询,并返回查询所返回的结果集中第一行的第一列,因为不能确定返回值的类型,所以返回值是object类型。
例如:
• cmd.CommandText = "select count(*) from T_Users";int i =Convert.ToInt32 (cmd.ExecuteScalar())
• cmd.CommandText = "select getdate()"; DateTime dt =Convert.ToDateTime(cmd.ExecuteScalar());
得到自动增长字段的主键值,在values关键词前加上outputinserted.Id,其中Id为主键字段名。执行结果就试插入的主键值,用ExecuteScalar执行最方便。
例如:
• cmd.CommandText = "Insert into T_Users(UserName,Password)output inserted.Id value ('admin','888888')";
• int i = Convert.ToInt32(cmd.ExecuteScalar());
(4) 执行有多行结果集的用ExecuteReaderSqlDataReader reader = cmd.ExecuteReader();
例如:
while (reader.Read())
{
Console.WriteLine(reader.GetString(1));
}
(5)reader的GetString、GetInt32等方法只接受整数参数,也就是序号,用GetOrdinal方法根据列名动态得到序号。
(6)SqlCommand的Parameters中添加参数
例如:
• cmd.CommandText = "select * from T_Users whereUserName=@UserName andPassword=@Password";
• cmd.Parameters.Add(newSqlParameter("UserName","admin"));
• cmd.Parameters.Add(newSqlParameter("Password",password));
要点二: DataSet类和SqlDataAdapter类相关
(1)每次读取数据都创建连接、执行Command得到SqlDataReader太麻烦,SqlDataReader是连接相关的, SqlDataReader中的查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),只能读取当前游标指向的行,一旦连接断开就不能再读取。这样做的好处就是无论查询结果有多少条,对程序占用的内存都几乎没有影响。
SqlDataReader对于小数据量的数据来说带来的只有麻烦,优点可以忽略不计。ADO.Net中提供了数据集的机制,将查询结果填充到本地内存中,这样连接断开、服务器断开都不影响数据的读取。
例如:
DataSet dataset = new DataSet();
SqlDataAdapter adapter = newSqlDataAdapter(cmd); adapter.Fill(dataset);
SqlDataAdapter是DataSet和数据库之间沟通的桥梁。数据集DataSet包含若干表DataTable,DataTable包含若干行DataRow。
例如:
foreach(DataRow row in dataset.Tables[0].Rows) row["Name"]。
(2)可以更新行row["Name"] = "yzk"、删除行datatable.Rows.Remove()、新增行datatable. NewRow()。这一切都是修改的内存中的DataSet,没有修改数据库。
可以调用SqlDataAdapter的Update方法将对DataSet的修改提交到数据库,Update方法有很多重载方法,可以提交整个DataSet、DataTable或者若干DataRow。但是需要为SqlDataAdapter提供DeleteCommand、UpdateCommand、InsertCommand它才知道如何将对DataSet的修改提交到数据库,由于这几个Command要求的格式非常苛刻,因此开发人员自己写非常困难,可以用SqlCommandBuilder自动生成这几个Command,用法很简单:new SqlCommandBuilder(adapter)。查看生成的Command(没有直接赋值给SqlDataAdapter ,看SqlCommandBuilder的)。SqlCommandBuilder要求表必须有主键。
通过DataRow的RowState可以获得行的状态(删除、修改、新增等);调用DataSet的GetChanges()方法得到变化的结果集,降低传递的资源占用。
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://net.itheima.com/