码迷,mamicode.com
首页 > Web开发 > 详细

ADO.NET开发技巧(5)-第二种方法

时间:2015-06-02 12:49:15      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

第二种用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 ename=@name,ecode=@code where eid=@id";
                    //构造用于修改的命令对象
                    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。

ADO.NET开发技巧(5)-第二种方法

标签:

原文地址:http://www.cnblogs.com/blackerXHunter/p/4545833.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!