Операторы вставки не работают при запуске с SQL Server 2008 - PullRequest
0 голосов
/ 29 января 2012

Мне нужно развернуть свое приложение VB.NET, разработанное в VB.NET и Visual Studio 2005. Заказчик использует SQL Server 2008, а приложение строится на основе SQL Server 2000.

Я получил следующую ошибку в SQL Server 2008:

Явное значение для столбца идентификаторов в таблице «Outgoing_Invoice» можно указывать только в том случае, если используется список столбцов и «Идентификационная вставка» включена

Вот мой запрос на вставку данных в две таблицы:

Dim cmd1 As New SqlCommand("Insert into Stock values(@invoice_no, @gate_pass, @exp_no, @clm_no, @category, @item_name, @weight, @units_case, 0, 0, @crtns_removed, @pieces_removed, 0, 0, @date_added, @date_removed, @inc_total_price, @out_total_price,  @discount, @amount, 'Sold', @expiry_date) Insert into Outgoing_Invoice values(@invoice_no, @exp_no, @party_name, @party_code, @city, @contact, @category, @item_name, @weight, @units_case, @crtns_issued, @pieces_issued, @crtns_removed, @pieces_removed, 0, 0, @scheme, @unit_price, @out_total_price, @discount, @amount, @date_removed, @expiry_date, @order_booker, @salesman)", con)

Сообщение об ошибке отображается на cmd1.executenonquery. Обе эти таблицы Stock и Outgoing_Invoice имеют столбец идентификаторов, помеченный как serial перед @ invoice.

Проблема возникла только при попытке вставки в SQL Server 2008. При запуске в SQL Server 2000 он работает как положено.

В чем может быть причина этой проблемы и как ее можно решить?

Ответы [ 3 ]

4 голосов
/ 29 января 2012

Ваш запрос INSERT должен указывать имена столбцов перед предложением VALUES, в противном случае они будут выполняться в порядке столбцов, как определено в БД (который может быть изменен - ​​это , а не исправлено).

Поскольку вы получаете сообщение об ошибке, похоже, что INSERT пытается вставить в столбец идентификаторов.

В общем случае, если не вставлять в все столбцы, вы должны указать имена столбцов.Я бы всегда указывал имена столбцов в качестве наилучшей практики.

Итак - укажите список столбцов:

INSERT INTO aTable
(col1, col2)
VALUES
(@val1, @val2)
2 голосов
/ 29 января 2012

Вставка в Outgoing_Invoice имеет один ко многим параметрам.

Это будет отлично работать. Значения 1 и 2 переходят в C1 и C2, и ID присваивается автоматически.

declare @T table
(
  ID int identity,
  C1 int,
  C2 int
)

insert into @T values (1, 2)

Это даст вам точную ошибку

insert into @T values (1, 2, 3)

Проверьте структуру таблицы в SQL Server 2000. Возможно, у нее есть одно дополнительное поле. Это объясняет, почему он там работает.

0 голосов
/ 29 января 2012

Вы должны явно указать список полей, если хотите изменить / вставить значения столбца IDENTITY таблицы.

Т.е.Ваш запрос должен выглядеть так:

Insert into Stock 
(
  here,
  comes,
  your,
  real,
  column,
  names
)
values
(
  @invoice_no, 
  @gate_pass, 
  @exp_no, 
  @clm_no, 
  @category, 
  @item_name, 
  @weight, 
  @units_case, 
  0, 
  0, 
  @crtns_removed, 
  @pieces_removed, 
  0, 
  0, 
  @date_added, 
  @date_removed, 
  @inc_total_price, 
  @out_total_price,  
  @discount, 
  @amount, 
  'Sold', 
  @expiry_date
) 

Insert into Outgoing_Invoice 
(
  here,
  comes,
  your,
  real,
  column,
  names,
  too
)
values
(
  @invoice_no, 
  @exp_no, 
  @party_name, 
  @party_code, 
  @city, 
  @contact, 
  @category, 
  @item_name, 
  @weight, 
  @units_case, 
  @crtns_issued, 
  @pieces_issued, 
  @crtns_removed, 
  @pieces_removed, 
  0, 
  0, 
  @scheme, 
  @unit_price, 
  @out_total_price, 
  @discount, 
  @amount, 
  @date_removed, 
  @expiry_date, 
  @order_booker, 
  @salesman
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...