C#与数据库连接及基本操作2(DataAdapter和DataSet访问数据库)

DataAdapter提供连接DataSet对象和数据源的桥梁。 DataSet相当于一个小型数据库,里面含有多张表(table),并且可直接通过操作DataSet这个小型数据库中的值,最后可将所有操作直接将返回到数据库中。


每一个DataSet都是一个或多个DataTable 对象的集合(DataTable相当于数据库中的表),这些对象由数据行(DataRow)、数据列(DataColumn)、字段名(Column Name)、数据格(Item),以及约束(Constraint)和有关DataTable对象中数据的关系(Relations)与数据显示排序(DataView)信息组成。


步骤: 1、连接并Open数据库connection(与Sqlcommand相同)

           2、adapterSqlDataAdapter adapter = new SqlDataAdapter(commandTestQuery, sqlCon);                                                     //其中commandTestQuery为string型查询语句 (select * from 表)

           3、 DataSet ds = new DataSet();  adapter.Fill(ds, "infor");    

                //初始化一个DataSet,暂存数据库,并进行填充      (其中""中为暂存数据库的暂时表名,可有可无 

           4、若进行增删改的操作,并更新到数据库,需要多加一条语句,如下问题所描述

                a、若对某个表中的行进行操作:                                                                                                                                                                  DataTable dtInfor = ds.Tables["暂存表名"]/ ds.Tables[0];     dtInfor.Rows.add(); 

               b、若添加一个新表 ds.Tables.Add("新表名")

           5、adapter.Update(ds, "暂存表名/table[0]");    //更新到数据库中


问题:出现异常:  System.InvalidOperationException: 当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand

解决:    添加  SqlCommandBuilder thisBuilder = new SqlCommandBuilder(adapter);

              利用SqlCommandBuilder来配置数据适配器,进而来更新数据

解释:  SqlCommandBuilder作用:发现"SqlDataAdapter不会自动生成实现DataSet的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。但是,如果设置了 SqlDataAdapter 的SelectCommand属性,则可以创建一个 SqlCommandBuilder 对象来自动生成用于单表更新的 Transact-SQL 语句。然后,SqlCommandBuilder 将生成其他任何未设置的 Transact-SQL 语句。",原来想进行批量数据的操作还得进行一下"包装"

 (即这个SqlCommandBuilder用来自动生成添加、删除、修改的SQL语句


//注意! 若进行增删改, 要设置表中的主键

例子:

 static SqlConnection SQLServerDB()
        {
            string cnString = @"data source=(local);initial catalog=Exp7;integrated security=SSPI";
            SqlConnection sqlCn = new SqlConnection(cnString);
            return sqlCn;
        }

  //查询:

     static void QueryMessage2()
        {
            using (SqlConnection sqlCon=SQLServerDB())
            {
                sqlCon.Open();
                string commandTextQuery = "select * from information";
                SqlDataAdapter adapter = new SqlDataAdapter(commandTextQuery, sqlCon);
                DataSet ds = new DataSet();
                adapter.Fill(ds, "infor");
                Console.WriteLine("要查询的表的内容如下:");
                Console.WriteLine("姓名       编号    电话");
                foreach(DataRow dr in ds.Tables["infor"].Rows)
                { Console.WriteLine("{0}  {1}     {2}", dr["name"], dr["id"], dr["number"]); }
            }

        }

//插入

 static void InsertMessage2()
        {
            using (SqlConnection sqlCon=SQLServerDB())
            {
                sqlCon.Open();
                string commandTestQuery = "select * from information";
                SqlDataAdapter adapter = new SqlDataAdapter(commandTestQuery, sqlCon);
                SqlCommandBuilder thisBuilder = new SqlCommandBuilder(adapter);
                DataSet ds = new DataSet();
                adapter.Fill(ds, "infor");
                DataTable dtInfor = ds.Tables["infor"];
                object[] r = new object[] { "Jane", 09, 85102 };
                dtInfor.Rows.Add(r);
                adapter.Update(ds,"infor");
            }

        }

// 更新      dtInfor.Rows[i][ij] = (新的值);

//删除       dtInfor.Rows[i].Delete();  

//最后:更新到数据库中 :  adapter.Update(ds, "infor");


参考资料:https://blog.csdn.net/lxj1137800599/article/details/51900419

                https://blog.csdn.net/zhangchen124/article/details/51339489  

猜你喜欢

转载自blog.csdn.net/ymnl_gsh/article/details/80790671
今日推荐