SqlCommand 添加参数-与DataAdapter更新
SqlCommand 带参数,带事务。
【理论基础】
在2.0以前版本的 ADO.NET 中,使用 DataSet 中的更改来更新数据库时,DataAdapter 的 Update 方法每次更新数据库的一行。因为该方法循环访问指定 DataTable 中的行,所以,会检查每个 DataRow,确定是否已修改。如果该行已修改,将根据该行的 RowState 属性值调用相应的UpdateCommand、InsertCommand 或 DeleteCommand。每一次行更新都涉及网络与数据库之间的双向数据传输。
——注意这段话的意思是根据DataSet中每一行的RowState值,采取相应的数据操作:由DataAdapter 调用相应的命令执行。在ADO.NET 2.0版本中也是这样执行的。
在 ADO.NET 2.0 中,DataAdapter 公开了 UpdateBatchSize 属性。将 UpdateBatchSize 设置为正整数值将使对数据库的更新以指定大小的批次进行发送。例如,如果将 UpdateBatchSize 设置为 10,会将 10 个独立的语句组合在一起并作为一批提交。将 UpdateBatchSize 设置为 0 将导致 DataAdapter 使用服务器可以处理的最大批次的大小。如果将其设置为 1,则禁用批量更新,因为此时每次发送一行。
——UpdateBatchSize 属性是实现批量修改数据的关键。
————————————————
版权声明:本文为CSDN博主「wxlkeepmoving」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wxlkeepmoving/article/details/5093586
//打开两个连接:两个事务,当两个操作都没有问题的时候,两个事务才进行提交,否则回滚。
static void TestReturnDataSetThenUpdateDBWithTransaltionByTwoConn()
{
DataSet ds = TestReturnDB();
////////////////////////////////////////////
//封装成EnClosure
List<Shippers> Newshippers = EnClosure(ds);
String connectionSql1 = "Data Source=127.0.0.1;Initial Catalog=TSQLTemp;User ID=sa;Password=sa123456";
String connectionSql2 = "Data Source=127.0.0.1;Initial Catalog=TSQLFundamentals2008;User ID=sa;Password=sa123456";
///////////////////////////////////////////
SqlTransaction tran =null;
SqlTransaction strant2 = null;
SqlConnection conn;
SqlConnection conn2;
try
{
conn = new SqlConnection(connectionSql1);
conn.Open();
tran = conn.BeginTransaction(); //开启事务
string sqlStr = "Select top 1 * from dbo.Shippers";
SqlDataAdapter adapter=new SqlDataAdapter();
SqlCommand cmd=new SqlCommand(sqlStr,conn,tran);
adapter.SelectCommand=cmd;
SqlCommandBuilder thisBuilder = new SqlCommandBuilder(adapter); //一定要添加。。。 自动更改
adapter.Fill(ds, "newShippers"); //封装到ds 新的仓库中
foreach (Shippers item in Newshippers)
{
DataRow dr = ds.Tables["newShippers"].NewRow();
dr["companyname"] = item.Companyname;
dr["phone"] = item.Phone;
ds.Tables["newShippers"].Rows.Add(dr);
}
//new SqlCommand(Update,connection).Parameters.Add('@参数名','类型','长度','数据库表列名')
//插入到新表中
adapter.Update(ds.Tables["newShippers"]); //更新回数据库。。。。。
//更新源表的状态
DataRowCollection drc = ds.Tables["Shippers"].Rows;
int count = drc.Count;
for (int i = 0; i < count; i++)
{
drc[i]["companyname"] = "UpdateStatuskkkkkkkkkkkk";
}
conn2 = new SqlConnection(connectionSql2);
conn2.Open();
strant2 = conn2.BeginTransaction();
string sqlStr2 = "Select top 1 * from Sales.Shippers";
SqlDataAdapter adapter2 = new SqlDataAdapter();
cmd = new SqlCommand(sqlStr2, conn2, strant2);
adapter2.SelectCommand = cmd;
SqlCommandBuilder thisBuilder2 = new SqlCommandBuilder(adapter2); //自动更改
adapter2.Fill(ds, "OldShippers"); //封装到ds 新的仓库中
DataTable dt = ds.Tables["OldShippers"];
dt.Clear();
DataTable dt2 = ds.Tables["Shippers"];
foreach (DataRow dr in dt2.Rows)
{
dt.ImportRow(dr);
}
adapter2.Update(ds.Tables["OldShippers"]); //更新回数据库。。。。。
//没有问题就提交呗。
tran.Commit();
strant2.Commit();
conn.Close();
conn2.Close();
}
catch (Exception e)
{
tran.Rollback();
strant2.Rollback();
Console.WriteLine(e);
}
}
TestReturnDB();
static DataSet TestReturnDB()
{
String connectionSql1 = "Data Source=127.0.0.1;Initial Catalog=TSQLFundamentals2008;User ID=sa;Password=sa123456";
SqlConnection conn = new SqlConnection(connectionSql1);
DataSet ds = new DataSet();
conn.Open();
string sqlStr = "Select * from Sales.Shippers";
SqlDataAdapter adapter = new SqlDataAdapter(sqlStr, conn); //拿着令牌去 那个大仓库读取数据
adapter.Fill(ds, "Shippers");
conn.Close();
return ds;
}
////////////////////////////////////////////
//封装成EnClosure
EnClosure(ds);
static List<Shippers> EnClosure(DataSet ds)
{
List<Shippers> shippers = new List<Shippers>();
DataRowCollection drc = ds.Tables["Shippers"].Rows;
Shippers ship = null;
foreach (DataRow dr in drc)
{
ship = new Shippers();
ship.Companyname = dr["companyname"] + "1738";
ship.Phone = dr["phone"] + "1738";
shippers.Add(ship);
}
return shippers;
}
方法2:使用 TransactionScope,需要打开一些服务:Distributed Transaction Coordintor
static void TestReturnDataSetThenUpdateDBWithTransaltionByTransactionScope()
{
DataSet ds = TestReturnDB();
////////////////////////////////////////////
//封装成EnClosure
List<Shippers> Newshippers = EnClosure(ds);
String connectionSql1 = "Data Source=127.0.0.1;Initial Catalog=TSQLTemp;User ID=sa;Password=sa123456";
String connectionSql2 = "Data Source=127.0.0.1;Initial Catalog=TSQLFundamentals2008;User ID=sa;Password=sa123456";
///////////////////////////////////////////
try
{
using (TransactionScope tsCope = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(connectionSql1))
{
// SqlDataAdapter sda = new SqlDataAdapter("select * from dbo.Shippers", conn);
string sqlStr = "Select top 1 * from dbo.Shippers";
SqlDataAdapter adapter = new SqlDataAdapter(sqlStr, conn); //拿着令牌去 那个大仓库读取数据
SqlCommandBuilder thisBuilder = new SqlCommandBuilder(adapter); //一定要添加。。。 自动更改
adapter.Fill(ds, "newShippers"); //封装到ds 新的仓库中
foreach (Shippers item in Newshippers)
{
DataRow dr = ds.Tables["newShippers"].NewRow();
dr["companyname"] = item.Companyname;
dr["phone"] = item.Phone;
ds.Tables["newShippers"].Rows.Add(dr);
}
//new SqlCommand(Update,connection).Parameters.Add('@参数名','类型','长度','数据库表列名')
//插入到新表中
adapter.Update(ds.Tables["newShippers"]); //更新回数据库。。。。。
}
//更新源表的状态
DataRowCollection drc = ds.Tables["Shippers"].Rows;
int count = drc.Count;
for (int i = 0; i < count; i++)
{
drc[i]["companyname"] = "UpdateStatusxxxxxxxxxxxxxx";
}
using (SqlConnection conn2 = new SqlConnection(connectionSql2))
{
conn2.Open();
string sqlStr2 = "Select top 1 * from Sales.Shippers";
SqlDataAdapter adapter2 = new SqlDataAdapter(sqlStr2, conn2); //拿着令牌去 那个大仓库读取数据
SqlCommandBuilder thisBuilder2 = new SqlCommandBuilder(adapter2); //自动更改
adapter2.Fill(ds, "OldShippers"); //封装到ds 新的仓库中
DataTable dt = ds.Tables["OldShippers"];
dt.Clear();
DataTable dt2 = ds.Tables["Shippers"];
foreach (DataRow dr in dt2.Rows)
{
dt.ImportRow(dr);
}
adapter2.Update(ds.Tables["OldShippers"]); //更新回数据库。。。。。
}
tsCope.Complete();
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
本文地址:https://blog.csdn.net/qq_33606071/article/details/107139351
下一篇: python工作自动化(二)
推荐阅读
-
php批量添加数据与批量更新数据的实现方法
-
C#_Excel数据读取与写入_自定义解析封装类_支持设置标题行位置&使用excel表达式收集数据&单元格映射&标题映射&模板文件的参数数据替换(第二版-增加深度读取和更新功能)
-
python 实现数据库中数据添加、查询与更新的示例代码
-
MySQL----MySQL数据库入门----第三章 添加、更新与删除数据
-
MySQL与Oracle查询一条语句,如果有则更新,无则添加的实例讲解
-
SqlCommand 添加参数-与DataAdapter更新
-
php批量添加数据与批量更新数据的实现方法
-
php批量添加数据与批量更新数据的实现方法,php添加数据
-
C#_Excel数据读取与写入_自定义解析封装类_支持设置标题行位置&使用excel表达式收集数据&单元格映射&标题映射&模板文件的参数数据替换(第二版-增加深度读取和更新功能)
-
php批量添加数据与批量更新数据的实现方法_php技巧