我必须部署在VB.NET和Visual Studio 2005中开发的VB.NET应用程序。客户正在使用SQL Server 2008,而应用程序是针对SQL Server 2000构建的。
我收到了针对SQL Server 2008的以下错误:
'Outgoing_Invoice'表中的标识列的显式值只能在使用列列表并且标识插入为ON时指定
以下是我在两个表中插入数据的查询:
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
在@invoice之前都有一个标记为serial的标识列。
只有在SQL Server 2008上尝试插入时才会出现此问题。在针对SQL Server 2000运行时,它会按预期工作。
这个问题的可能原因是什么?如何解决?
答案 0 :(得分:4)
您的INSERT
查询需要在VALUES
子句之前指定列名称,否则将按照DB中定义的列顺序尝试这些列名(可能会发生变化 - 这是 not 已修复)。
由于您收到错误,INSERT
会尝试插入标识列。
通常 - 如果不插入所有列,则必须指定列名称。我总是指定列名作为最佳实践。
所以 - 指定列列表:
INSERT INTO aTable
(col1, col2)
VALUES
(@val1, @val2)
答案 1 :(得分:2)
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中的表结构。它可能有一个额外的字段。这可以解释为什么它在那里工作。
答案 2 :(得分:0)
如果要修改/插入表的IDENTITY列值,则应明确指定字段列表。
IE中。您的查询应如下所示:
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
)