C# ADO.net 2.0:调用DataAdapter.Update()后未更新PrimaryKey
我在更新具有主键列的类型化数据表时遇到了一个问题。 在代码中的某个时刻,我填充数据表(其中一些有主键列和外键列),然后使用DataAdapters和Update()在一个事务中插入所有数据表的数据。因为类型化数据表不允许PrimaryKey表为空,所以我在其中插入了一些整数值。调用Update()后,我希望PK列可以用数据库PKs更新C# ADO.net 2.0:调用DataAdapter.Update()后未更新PrimaryKey,c#,.net,datatable,ado,C#,.net,Datatable,Ado,我在更新具有主键列的类型化数据表时遇到了一个问题。 在代码中的某个时刻,我填充数据表(其中一些有主键列和外键列),然后使用DataAdapters和Update()在一个事务中插入所有数据表的数据。因为类型化数据表不允许PrimaryKey表为空,所以我在其中插入了一些整数值。调用Update()后,我希望PK列可以用数据库PKs更新 public void UpdateMethod(DbTransaction transaction) { DbDataAdapter dataAdap
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;
}
谢谢你的提示 当您在填充数据表时设置了主键时,它不会覆盖已经存在的行(但是,如果遇到匹配的主键,它可能会更新,也可能不会更新非键元素,具体取决于loadoption的设置)
我相信,在填充数据表之前,您必须先清除数据表 解决了它。问题是SQL语句:而不是 插入[SomeTable]([someColumn],…)值(@someColumn,…)选择强制转换(SCOPE_IDENTITY()为int)作为“ID” 它必须是: 插入[SomeTable]([someColumn],…)值(@someColumn,…)选择@ID=SCOPE\u IDENTITY()
否则,主键的值不会分配给输出参数。您是对的,这可能是原因所在。但是我的测试数据库已经空了。我还使用负数作为临时私钥,然后填充数据表。