日期:2014-05-17  浏览次数:20420 次

DataSet更新到数据库的问题
使用以下代码更新数据库
 SqlCommand sqlCmd = new SqlCommand();
  sqlCmd.CommandText = strSql;
  sqlCmd.Connection = connection;

  if (ConnectionState.Closed == connection.State)
  {
  connection.Open();
  }

  SqlDataAdapter Ad = new SqlDataAdapter(sqlCmd.CommandText, connection);

  Ad.ContinueUpdateOnError = true; //继续存储没有错的行

  SqlCommandBuilder builder = new SqlCommandBuilder(Ad); //自动生成update,insert,delete语句

   
  builder.QuotePrefix = "[";
  builder.QuoteSuffix = "]";

  Ad.Fill(ds, strTable);

   
  Ad.UpdateCommand = builder.GetUpdateCommand();  

  int updateRows = Ad.Update(ds, strTable);
  bRun = (updateRows > 0) ? true : false;

  Ad.Dispose();
  ds.Dispose();

赋strSql="select * from tb where id=0";
但发现只新增数据,没有更新到数据,设置断点获取UpdateCommand 的更新语句发现是update tb set id=@sp1,c2=@sp2,c3=@sp3 where id=@sp1 and c2=@sp2 and c3=@sp3;也就是说自动生成的更新条件是所有字段的,这也就造成了更新不到数据了,怎么设置它的更新条件只能取第一个字段或者关键字id呢?

------解决方案--------------------
直接用 SqlCommand.ExecuteNonQuery 更新呗。或者直接修改 UpdateCommand.CommandText
------解决方案--------------------
探讨
直接用 SqlCommand.ExecuteNonQuery 更新呗。或者直接修改 UpdateCommand.CommandText

------解决方案--------------------
一般情况都用实体类来做ORM
------解决方案--------------------
int updateRows = Ad.Update(ds, strTable);
在执行这句之前,ds里的内容跟预想的一样吗
------解决方案--------------------
SqlCommandBuilder builder = new SqlCommandBuilder(Ad); 
sb.ConflictOption = ConflictOption.OverwriteChanges;
sb.SetAllValues = false;

试试看,我记得是通用的。

可以控制 GetUpdateCommand 方法生成的命令。
------解决方案--------------------
应该是表没有设置主键吧
------解决方案--------------------
表里面有主键吗,用ExecuteNonQuery 执行不就可以了。
------解决方案--------------------
SQL code

DECLARE @nct int

select @nct=........... 

if(@nct>0)
begin
    --更新语句
end
else
begin
--添加添加
end