第二种用ado.net操作数据的方式是采用DataSet和DataAdapter。它是用Adapter类读取数据在把数据存储在DataSet中。具体代码如下:
private void BindData() { string comnStr = @"data source=BLACKERXHUNTER\SQLEXPRESS;initial catalog=StudyUse; integrated security = True;"; using (SqlConnection conn = new SqlConnection()) { string sql = "select * from Department"; SqlDataAdapter adpter = new SqlDataAdapter(); DataSet ds = new DataSet(); conn.Open(); adpter.Fill(ds); } }
这些代码会将Department表中的所有数据填充到ds变量中(也就是DataSet类)。这个DataSet类中包含了DataTable,DataColumn和DataRows,也就是说查询到的所有数据都被表示了出来。其实我们也可以推测出他的原理,即把数据库的所有行列用一个循环遍历填充到结构中,Fill方法大概执行了下面这些命令:
#region 通过sqldatareader获取表的结构信息 SqlCommand sqlCommand = new SqlCommand(sql, conn); conn.Open(); DataTable table = new DataTable(); SqlDataReader reader = sqlCommand.ExecuteReader(); for (int i = 0; i < reader.FieldCount; i++) { DataColumn column = new DataColumn(reader.GetName(i)); column.DataType = reader.GetFieldType(i); table.Columns.Add(column); } while (reader.Read()) { DataRow row = table.NewRow(); for (int i = 0; i < reader.FieldCount; i++) { row[0] = reader[0]; } table.Rows.Add(row); } set.Tables.Add(table); #endregion
除此之外,SqlDataAdapter类还可以用来更新数据库中的数据:
using (SqlConnection conn = new SqlConnection(connStr)) { //构造适配器对象 SqlDataAdapter adapter = new SqlDataAdapter(); //构造修改语句 string sql = "update employee set [email protected],[email protected] where [email protected]"; //构造用于修改的命令对象 SqlCommand cmdUpdate = new SqlCommand(sql, conn); cmdUpdate.Parameters.Add("@name", SqlDbType.NVarChar, 10, "ename"); cmdUpdate.Parameters.Add("@code", SqlDbType.VarChar, 18, "ecode"); cmdUpdate.Parameters.Add("@id", SqlDbType.Int, 4, "eid"); //构造适配器的修改命令属性 adapter.UpdateCommand = cmdUpdate; conn.Open(); //完成数据更新,会逐条的对比数据 //情况1:dt中有的数据,而数据库中没有,则会调用InsertCommand执行 //情况2:dt中没有的数据,而数据库中有,则会调用DeleteCommand执行 //情况3:都有,但是不一样,则会调用UpdateCommand执行 adapter.Update(dt); }
但是,使用Fill方法是将所有数据全部填充到DataSet结构中,这其中可能会发生很多问题,一个建议是使用异步来写。另一个要考虑的是假如内存不够,还会出现不可预知的错误,对于这个问题,我们可以考虑使用分页或流来完成来完成Fill。
时间: 2024-09-28 01:26:27