【问题标题】:ADO .net 2.0: PrimaryKey not updated after calling DataAdapter.Update()ADO .net 2.0:调用 DataAdapter.Update() 后未更新 PrimaryKey
【发布时间】:2009-11-25 17:21:48
【问题描述】:

我在更新具有主键列的类型化 DataTable 时遇到了问题。 在我的代码中的某个时刻,我填充了 DataTables(其中一些具有主键列和外键列),然后我使用 DataAdapters 和 Update() 将所有 DataTables 的数据插入到一个事务中。因为键入的 DataTables 不允许 PrimaryKey 表为空,所以我在其中插入了一些整数值。调用 Update() 后,我希望 PK 列会使用数据库 PK 进行更新。

    public void UpdateMethod(DbTransaction transaction)
{
 DbDataAdapter dataAdapter = mDbProviderFactory.CreateDataAdapter();
 using (DbCommand insertCommand = CreateCommand())
 {
  insertCommand.Connection = mDbConnection;
  insertCommand.Transaction = transaction;
  dataAdapter.InsertCommand = insertCommand;
  dataAdapter.Update(dataTable);
 }

 // not sure if i need to do this:
 dataTable.AcceptChanges();

 // I would expect that databaseId is now the Id used in the database,
 // but it is the original Id which I set while creating the row entry
 databaseId = (int)dataTable.Rows[0]["Id"];
}

private DbCommand CreateCommand()
{
 // Make command object.
 DbCommand cmd = mDbProviderFactory.CreateCommand();

 // add command input parameters
 DbParameter parameter1 = mDbProviderFactory.CreateParameter();
 parameter1.ParameterName = mDatabaseParameterPrefix + "someColumn";
 parameter1.SourceColumn = "someColumn";
 parameter1.Size = 255;
 parameter1.DbType = DbType.String;

 // Output parameter
 DbParameter idParameter = mDbProviderFactory.CreateParameter();
 idParameter.ParameterName = mDatabaseParameterPrefix + "ID";
 idParameter.SourceColumn = "ID";
 idParameter.Direction = ParameterDirection.InputOutput;
 idParameter.DbType = DbType.Int32;

 // setup sql command
 cmd.Parameters.Add(parameter1);
 cmd.Parameters.Add(idParameter)
 cmd.CommandText = @"INSERT INTO [SomeTable] ([someColumn], ...) VALUES(@someColumn, ... ) SELECT CAST(SCOPE_IDENTITY() AS int) AS 'ID'";
 cmd.UpdatedRowSource = UpdateRowSource.Both;

 return cmd;
}

感谢任何提示!

【问题讨论】:

    标签: c# .net datatable ado


    【解决方案1】:

    当您在填充数据表时设置了主键时,它不会覆盖已经存在的行(但是,如果遇到匹配的主键,它可能会也可能不会更新非键元素,具体取决于您的loadoption 设置为)

    我相信你必须先清除你的数据表,然后再填充它。

    【讨论】:

    • 你是对的,这可能是原因。但是我的测试数据库已经是空的。我还使用负数作为临时私钥,然后填充 DataTable。
    【解决方案2】:

    解决了。问题是 SQL 语句:而不是

    INSERT INTO [SomeTable] ([someColumn], ...) VALUES(@someColumn, ... ) SELECT CAST(SCOPE_IDENTITY() AS int) AS 'ID'

    一定是:

    插入 [SomeTable] ([someColumn], ...) VALUES(@someColumn, ... ) SELECT @ID = SCOPE_IDENTITY()

    否则主键的值不会赋给输出参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多