SqlDataAdapter 的用法------不能进行更新
2012-06-14 11:57
393 查看
下面是Msdn给出的解释
更新是逐行进行的。对于每个已插入、修改和删除的行,Update 方法会确定已对其执行的更改的类型(插入、更新或删除)。根据更改类型,通过执行Insert、Update, 或Delete 命令模板将已修改的行传播给数据源。当应用程序调用Update 方法时,DataAdapter
根据DataSet 中配置的索引顺序为每一行检查RowState 属性,并迭代执行所需的 INSERT、UPDATE 或 DELETE 语句。例如,由于DataTable 中行的排序,Update
可能先执行一个 DELETE 语句,接着执行一个 INSERT 语句,然后再执行另一个 DELETE 语句。
应注意,这些语句不是作为批处理进程执行的;每一行都是单独更新的。在必须控制语句类型顺序的情况下(例如,INSERT 在 UPDATE 之前),应用程序可以调用GetChanges 方法。有关更多信息,请参见使用
DataAdapter 更新数据源。
如果未指定 INSERT、UPDATE 或 DELETE 语句,Update 方法会生成异常。但是,如果设置 .NET Framework 数据提供程序的SelectCommand 属性,则可以创建SqlCommandBuilder
或
OleDbCommandBuilder 对象来为单个表更新自动生成 SQL 语句。然后,CommandBuilder 将生成其他任何未设置的 SQL 语句。此生成逻辑要求DataSet 中存在键列信息。有关更多信息,请参见自动生成命令。
Update 方法在执行更新之前从第一个映射列出的表中检索行。然后,Update 使用
UpdatedRowSource 属性的值刷新该行。忽略返回的任何其他行。
在将任何数据加载回 DataSet 之后,将引发
OnRowUpdated 事件,从而允许用户检查经协调的 DataSet 行以及该命令返回的任何输出参数。在对一行成功进行更新之后,将接受对该行的更改。
当使用 Update 时,执行的顺序如下:
将
DataRow 中的值移至参数值。
引发
OnRowUpdating 事件。
执行命令。
如果该命令设置为 FirstReturnedRecord,返回的第一项结果将放置在 DataRow 中。
如果存在输出参数,它们将被放在 DataRow 中。
引发 OnRowUpdated 事件。
调用
AcceptChanges。
与 DataAdapter 关联的每个命令通常都有一个与其关联的参数集合。参数通过 .NET 数据提供程序的
Parameter 类的 SourceColumn 和 SourceVersion 属性映射到当前行。SourceColumn 引用DataTable 列,DataAdapter 引用该列来获取当前行的参数值。
下面给出例子
/// <summary>
/// 保存数据
/// </summary>
private bool Save()
{
DataLib.DataHelper myHelper = new DataLib.DataHelper();
DataLib.sysClass myClass = new DataLib.sysClass();
DataSet dsSave = ((DataTable)binMaster.DataSource).DataSet;
//极其重要否则不能进行修改
binMaster.EndEdit();
if (myHelper.SaveData(dsSave, "select * from t_SellStorage where F_BillID = '" + strBillID + "'")==0)
{
dsSave.AcceptChanges();
return true;
}
else
{
return false;
}
}
public string SaveData(string strDB,DataSet ds, string strSQL)
{
try
{
SqlConnection con = new SqlConnection(GetConStr(strDB));
SqlDataAdapter myAdt = new SqlDataAdapter(strSQL, con);
SqlCommandBuilder bd = new SqlCommandBuilder(myAdt);
myAdt.Update(ds);
con.Dispose();
myAdt.Dispose();
bd.Dispose();
return "";
}
catch (SqlException ex)
{
if (ex.Number == 2627)
return "数据重复,请检查!!";
else
return ex.Message;
}
}
其中如果 binMaster.EndEdit();这句不写的话是不能对数据库表进行更新的。
在同页面如果进行插入操作的话要把AcceptChanges();去掉否则会插入重复主键的值。
if (myHelper.SaveMuteData(dsData, strSQL).Length == 0)
{
DataLib.SysVar.SetLog(this.Text, "保存", "保存" + editControl1.GetValue().ToString());
MessageBox.Show("数据保存成功!!", "提示");
//DataBind();
//strBillID = editControl1.GetValue().ToString();
//decID = decID + 1;
//dsMaster.AcceptChanges();
//dsSlaver.AcceptChanges();
btNewStart();
Status(2);
return true;
}
else
{
return false;
}
public string SaveMuteData(string strDB,DataSet[] ds, string[] strSQL)
{
//string strCon = System.Configuration.ConfigurationManager.AppSettings["ConStr"];
SqlConnection con = new SqlConnection(GetConStr(strDB));
int intCnt, i;
intCnt = ds.Length;
con.Open();
SqlTransaction tran = con.BeginTransaction();
try
{
try
{
for (i = 0; i < intCnt; i++)
{
SqlCommand myComm = new SqlCommand();
myComm.Connection = con;
myComm.Transaction = tran;
myComm.CommandText = strSQL[i];
myComm.CommandTimeout = 0;
SqlDataAdapter myAdt = new SqlDataAdapter();
myAdt.SelectCommand = myComm;
SqlCommandBuilder bd = new SqlCommandBuilder(myAdt);
myAdt.Update(ds[i]);
}
tran.Commit();
return "";
}
catch (Exception ex)
{
tran.Rollback();
return ex.Message;
}
}
finally
{
tran.Dispose();
}
}
更新是逐行进行的。对于每个已插入、修改和删除的行,Update 方法会确定已对其执行的更改的类型(插入、更新或删除)。根据更改类型,通过执行Insert、Update, 或Delete 命令模板将已修改的行传播给数据源。当应用程序调用Update 方法时,DataAdapter
根据DataSet 中配置的索引顺序为每一行检查RowState 属性,并迭代执行所需的 INSERT、UPDATE 或 DELETE 语句。例如,由于DataTable 中行的排序,Update
可能先执行一个 DELETE 语句,接着执行一个 INSERT 语句,然后再执行另一个 DELETE 语句。
应注意,这些语句不是作为批处理进程执行的;每一行都是单独更新的。在必须控制语句类型顺序的情况下(例如,INSERT 在 UPDATE 之前),应用程序可以调用GetChanges 方法。有关更多信息,请参见使用
DataAdapter 更新数据源。
如果未指定 INSERT、UPDATE 或 DELETE 语句,Update 方法会生成异常。但是,如果设置 .NET Framework 数据提供程序的SelectCommand 属性,则可以创建SqlCommandBuilder
或
OleDbCommandBuilder 对象来为单个表更新自动生成 SQL 语句。然后,CommandBuilder 将生成其他任何未设置的 SQL 语句。此生成逻辑要求DataSet 中存在键列信息。有关更多信息,请参见自动生成命令。
Update 方法在执行更新之前从第一个映射列出的表中检索行。然后,Update 使用
UpdatedRowSource 属性的值刷新该行。忽略返回的任何其他行。
在将任何数据加载回 DataSet 之后,将引发
OnRowUpdated 事件,从而允许用户检查经协调的 DataSet 行以及该命令返回的任何输出参数。在对一行成功进行更新之后,将接受对该行的更改。
当使用 Update 时,执行的顺序如下:
将
DataRow 中的值移至参数值。
引发
OnRowUpdating 事件。
执行命令。
如果该命令设置为 FirstReturnedRecord,返回的第一项结果将放置在 DataRow 中。
如果存在输出参数,它们将被放在 DataRow 中。
引发 OnRowUpdated 事件。
调用
AcceptChanges。
与 DataAdapter 关联的每个命令通常都有一个与其关联的参数集合。参数通过 .NET 数据提供程序的
Parameter 类的 SourceColumn 和 SourceVersion 属性映射到当前行。SourceColumn 引用DataTable 列,DataAdapter 引用该列来获取当前行的参数值。
下面给出例子
/// <summary>
/// 保存数据
/// </summary>
private bool Save()
{
DataLib.DataHelper myHelper = new DataLib.DataHelper();
DataLib.sysClass myClass = new DataLib.sysClass();
DataSet dsSave = ((DataTable)binMaster.DataSource).DataSet;
//极其重要否则不能进行修改
binMaster.EndEdit();
if (myHelper.SaveData(dsSave, "select * from t_SellStorage where F_BillID = '" + strBillID + "'")==0)
{
dsSave.AcceptChanges();
return true;
}
else
{
return false;
}
}
public string SaveData(string strDB,DataSet ds, string strSQL)
{
try
{
SqlConnection con = new SqlConnection(GetConStr(strDB));
SqlDataAdapter myAdt = new SqlDataAdapter(strSQL, con);
SqlCommandBuilder bd = new SqlCommandBuilder(myAdt);
myAdt.Update(ds);
con.Dispose();
myAdt.Dispose();
bd.Dispose();
return "";
}
catch (SqlException ex)
{
if (ex.Number == 2627)
return "数据重复,请检查!!";
else
return ex.Message;
}
}
其中如果 binMaster.EndEdit();这句不写的话是不能对数据库表进行更新的。
在同页面如果进行插入操作的话要把AcceptChanges();去掉否则会插入重复主键的值。
if (myHelper.SaveMuteData(dsData, strSQL).Length == 0)
{
DataLib.SysVar.SetLog(this.Text, "保存", "保存" + editControl1.GetValue().ToString());
MessageBox.Show("数据保存成功!!", "提示");
//DataBind();
//strBillID = editControl1.GetValue().ToString();
//decID = decID + 1;
//dsMaster.AcceptChanges();
//dsSlaver.AcceptChanges();
btNewStart();
Status(2);
return true;
}
else
{
return false;
}
public string SaveMuteData(string strDB,DataSet[] ds, string[] strSQL)
{
//string strCon = System.Configuration.ConfigurationManager.AppSettings["ConStr"];
SqlConnection con = new SqlConnection(GetConStr(strDB));
int intCnt, i;
intCnt = ds.Length;
con.Open();
SqlTransaction tran = con.BeginTransaction();
try
{
try
{
for (i = 0; i < intCnt; i++)
{
SqlCommand myComm = new SqlCommand();
myComm.Connection = con;
myComm.Transaction = tran;
myComm.CommandText = strSQL[i];
myComm.CommandTimeout = 0;
SqlDataAdapter myAdt = new SqlDataAdapter();
myAdt.SelectCommand = myComm;
SqlCommandBuilder bd = new SqlCommandBuilder(myAdt);
myAdt.Update(ds[i]);
}
tran.Commit();
return "";
}
catch (Exception ex)
{
tran.Rollback();
return ex.Message;
}
}
finally
{
tran.Dispose();
}
}
相关文章推荐
- 如何利用SqlDataAdapter进行数据更新(转载)
- <转载>C#使用SqlDataAdapter.Update更新数据库
- SqlDataAdapter 更新插入 与 InsertBulkCopy
- 如何在 Visual C# .NET 中使用 SqlDataAdapter 对象更新 SQL Server 数据库
- SqlDataAdapter 更新实例
- SqlDataAdapter 对datagridview进行增删改(A)
- 【数据库连接】Sqlcommand与SqlDataAdapter用法摘录(待整理)
- SqlDataAdapter.RowUpdated事件用法
- C#使用SqlDataAdapter的Update方法更新数据
- SqlDataAdapter.update结合事务(SqlTransaction)批量更新数据
- C#使用SqlDataAdapter.Update更新数据库
- SqlDataAdapter 用法详解
- SqlDataAdapter的易错用法
- SqlDataAdapter使用存储过程不能使用参数?
- 用SqlDataAdapter更新数据库的方法介绍
- 利用SqlDataAdapter进行分页
- 通过 SqlDataAdapter.update 方法通过DataSet更新数据库
- SqlDataAdapter 用法详解
- Asp.net 用DataSet对象更新数据(SqlDataAdapter) DataTable加主键
- 第四课 ADO.NET 利用sqldataadapter来进行增,删,改操作。