Я пытаюсь использовать SqlDataAdapter для вставки строки, а затем сразу же получить ту же строку. Я последовал совету в этом сообщении и использовал SCOPE_IDENTITY, но это не работает. Вот мой код...
using (var conn = _db.OpenConnection())
{
var sqlQuery = "SELECT * FROM RotationItem WHERE [RotationItemId] = SCOPE_IDENTITY()";
var adapter = new SqlDataAdapter(sqlQuery, conn);
var builder = new SqlCommandBuilder(adapter);
var dataSet = new DataSet();
adapter.Fill(dataSet);
Debug.WriteLine("First fill, rows " + dataSet.Tables[0].Rows.Count);
var table = dataSet.Tables[0];
table.Rows.InsertAt(table.NewRow(), 0);
CopyJsonToRow(table, 0, item);
if (adapter.Update(dataSet) != 1)
{
throw new InvalidOperationException("Insert failed");
}
// After insert, fetch the new record
dataSet.Clear();
adapter.Fill(dataSet);
Debug.WriteLine("Second fill, rows " + dataSet.Tables[0].Rows.Count);
}
Мой вывод:
- Первая заливка, строки 0
- Второе заполнение, строки 0 ‹== это НЕ то, что я ожидаю
Почему вторая заливка не работает? Разве он не должен получить строку, которую я только что вставил?!
Я не использую никаких транзакций. Определение таблицы ниже...
CREATE TABLE [dbo].[RotationItem] (
[RotationItemId] INT NOT NULL IDENTITY(1,1),
[RotationScheduleId] INT NOT NULL,
[QuestionnaireId] INT NOT NULL,
[Order] INT NOT NULL,
PRIMARY KEY CLUSTERED ([RotationItemId] ASC)
);
IDENT_CURRENT('RotationItem')
вместоSCOPE_IDENTITY()
, он работает!! Однако часто это дает неправильный ответ, если несколько вставок выполняются одновременно в разных потоках. Это отстой. - person John Henckel   schedule 15.10.2018SqlCommandBuilder
. Вы полагаете, что это невозможно с помощью SqlCommandBuilder? Я попытался добавить ;SELECT SCOPE_IDENTITY() в конецbuilder.GetInsertCommand().CommandText
, но это не безрезультатно. Я пытался установитьadapter.InsertCommand
, но это не дало результата. Как только я создаю SqlCommandBuilder, я вообще не могу его настроить. - person John Henckel   schedule 15.10.2018