您的位置:首页 > 数据库

SqlDataAdapter 的用法------不能进行更新

2012-06-14 11:57 393 查看
下面是Msdn给出的解释

更新是逐行进行的。对于每个已插入、修改和删除的行,Update 方法会确定已对其执行的更改的类型(插入、更新或删除)。根据更改类型,通过执行InsertUpdate,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
类的 SourceColumnSourceVersion 属性映射到当前行。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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: