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