Как добавить команду / оператор SQL в строго типизированную команду обновления / вставки TableAdapter? - PullRequest
1 голос
/ 25 января 2010

См. этот вопрос . У меня есть следующий код, который выполняется для базы данных SQLIte с использованием строго типизированного набора данных.

        messagesAdapter.Update(messages);//messages is a DataTable
        var connection = messagesAdapter.Connection;
        var retrieveIndexCommand= connection.CreateCommand();
        retrieveIndexCommand.CommandText = @"Select last_insert_rowid()";
        connection.Open();
        var index = retrieveIndexCommand.ExecuteScalar();
        connection.Close();

Это не работает, так как last_inser_rowid () всегда возвращает ноль. Это вызвано тем, что он должен вызываться во время того же соединения, которое используется командой Update адаптера таблицы. Как изменить команду «Вставить или обновить» адаптера таблицы, чтобы она возвращала индекс?

1 Ответ

3 голосов
/ 25 января 2010

Если вы вставляете одну строку, вы можете использовать это:

// cast if necessary
using (var insert = (SQLiteCommand)this.Adapter.InsertCommand.Clone()) { 
    insert.CommandText += "; SELECT last_insert_rowid()";
    foreach (SQLiteParameter parameter in insert.Parameters) {
        parameter.Value = row[parameter.SourceColumn];
    }
}
var index = Convert.ToInt32(insert.ExecuteScalar());

Вы также можете использовать его для вставки нескольких строк и назначения каждого идентификатора:

using (var insert = (SQLiteCommand)this.Adapter.InsertCommand.Clone())
{
    insert.CommandText += "; SELECT last_insert_rowid()";
    // this filter only added rows
    foreach (MyDataSet.MessageRow row in messages.GetChanges(DataRowState.Added))
    {
        foreach (SQLiteParameter parameter in insert.Parameters)
        {
            parameter.Value = row[parameter.SourceColumn];
        }
        // use the name of your rowid column
        row.ID = Convert.ToInt32(insert.ExecuteScalar());
        row.AcceptChanges();
    }
}
// then you can perfom the other updates
messagesAdapter.Update(messages);

Примечание: обязательно откройте / закройте ваше соединение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...