对SQL Server 2008运行时插入语句失败

时间:2012-01-28 20:42:48

标签: vb.net sql-server-2008

我必须部署在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。这两个表StockOutgoing_Invoice在@invoice之前都有一个标记为serial的标识列。

只有在SQL Server 2008上尝试插入时才会出现此问题。在针对SQL Server 2000运行时,它会按预期工作。

这个问题的可能原因是什么?如何解决?

3 个答案:

答案 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
)