使用SqlDataAdapter更新行无效

时间:2017-05-15 13:05:19

标签: c# sql

我写了这个函数来更新一行(我将信息存储在T类中):

public void Update(T model)
{
    if (!Exist(model))
    {
        throw new Exception("Object Not Found");
    }
    DataRow row = Convert(model);
    row.Table.Rows.Add(row);
    row.AcceptChanges();
    row.SetModified();
    _dataAdapter.Update(new[] { row });
}

(DataRow分离)

SqlDataAdapter配置如下:

SqlDataAdapter da = new SqlDataAdapter("Select * From " + tableName, 
        ConnectedDAL.GetConnection());
SqlCommandBuilder builder = new SqlCommandBuilder(da);
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

由于某种原因,我的插入和删除工作,但更新没有。 对Update()的调用完成没有错误,但数据库没有收到更新。

帮助?

更新

命令构建器中的更新命令文本很奇怪:

对于城市(CityID,CityName,CountryID)

"更新[城市]设置[CityName] = @ p1,[CountryID] = @ p2 WHERE(([CityID] = @ p3 AND([CityName] = @ p4)AND([CountryID] = @ P5))

第一个条件是有道理的,但其余条件不合适。此外,该调用返回1,这意味着它认为它进行了更改。

1 个答案:

答案 0 :(得分:0)

我有办法让它发挥作用。

public void Update(T model)
{
    if (!Exist(model))
    {
        throw new Exception("Object Not Found");
    }

    DataRow tmp = GetRow(model);
    _dataAdapter.Update(new []{ tmp });
}

private DataRow GetRow(T model)
{
    DataRow row = Convert(model);
    var schem = Schema;
    string[] keys = new string[schem.PrimaryKey.Length];
    for (var i = 0; i < schem.PrimaryKey.Length; i++)
    {
        DataColumn column = schem.PrimaryKey[i];
        keys[i] = row[column.ColumnName].ToString();
    }
    DataRow dr = Convert(Select(keys));
    dr.Table.Rows.Add(dr);
    dr.AcceptChanges();
    for (var i = 0; i < row.ItemArray.Length; i++)
    {
        if (!schem.Columns[i].AutoIncrement)
        {
            dr[i] = row.ItemArray[i];
        }
    }
    return dr;
 }

这很有效。