Мне нужна функция, которая выполняет инструкцию INSERT в базе данных и возвращает первичный ключ Auto_Increment. У меня есть следующий код C#, но, хотя оператор INSERT работает нормально (я вижу запись в базе данных, PK генерируется правильно, а строки == 1), значение id всегда равно 0. Любые идеи о том, что может произойти неправильно?@@ IDENTITY после инструкции INSERT всегда возвращает 0
public int ExecuteInsertStatement(string statement)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement;
int rows = cmdInsert.ExecuteNonQuery();
if (rows == 1)
{
IDbCommand cmdId = connection.CreateCommand();
cmdId.CommandText = "SELECT @@Identity;";
id = (int)cmdId.ExecuteScalar();
}
return id;
}
private void InitializeAndOpenConnection()
{
if (connection == null)
connection = OleDbProviderFactory.Instance.CreateConnection(connectString);
if(connection.State != ConnectionState.Open)
connection.Open();
}
В ответ на ответы, я попробовал:
public int ExecuteInsertStatement(string statement, string tableName)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement + ";SELECT OID FROM " + tableName + " WHERE OID = SCOPE_IDENTITY();";
id = (int)cmdInsert.ExecuteScalar();
return id;
}
, но сейчас я получаю сообщение об ошибке «символов, обнаруженных после окончания SQL заявления»
Я использую MS Access база данных с соединением OleDb, Provider = Microsoft.Jet.OLEDB.4.0
Не могли бы вы уточнить, что сервер базы данных вы используете и, возможно, INLINE ссылки на InitializeAndOpenConnection/connection.CreateCommand, как они могут повлиять на наши ответы ты? :) – Rob 2008-10-09 10:00:54
Также - весь «SELECT OID FROM x, где OID = SCOPE_IDENTITY()« thins несколько более сложный, как вы говорите (для записи, вставленной с идентификационным значением 3): «SELECT 3 FROM table_x WHERE 3 = 3 "- kinda redundant – Rob 2008-10-09 10:02:21
@Rob: может показаться избыточным, но OID набирается int, где scope_identity() нет, поэтому вы можете напрямую использовать (int) cmd.ExecuteScalar() – devio 2008-10-09 13:03:50