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