ADO .net 2.0: PrimaryKey не е актуализиран след извикване на DataAdapter.Update()

Попаднах на проблем, докато актуализирах въведена DataTable, която има колона с първичен ключ. В даден момент от моя код попълвам DataTables (някои от тях имат колони с първичен и външен ключ) и след това вмъквам данните от всички DataTables в една транзакция, използвайки DataAdapters и Update(). Тъй като въведените 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;
}

Благодаря за всякакви съвети!


person phatoni    schedule 25.11.2009    source източник


Отговори (2)


Когато имате зададен първичен ключ, когато попълвате таблицата с данни, той няма да презапише редове, които вече съществуват (обаче, ако попадне на съвпадащ първичен ключ, той може или не може да актуализира неключови елементи в зависимост от зададената опция за зареждане да се)

Вярвам, че първо трябва да изчистите таблицата си с данни, преди да я попълните.

person Mike Park    schedule 25.11.2009
comment
Прав си, това може да е причината. Но тестовата ми база данни вече е празна. Също така използвам отрицателни числа като временни частни ключове, след което попълвам DataTable. - person phatoni; 26.11.2009

Реших го. Проблемът беше SQL изразът: Вместо

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

Трябва да е:

INSERT INTO [SomeTable] ([someColumn], ...) VALUES(@someColumn, ... ) SELECT @ID = SCOPE_IDENTITY()

В противен случай стойността на първичния ключ не се присвоява на изходния параметър.

person phatoni    schedule 15.12.2009