【问题标题】:An explicit value for the identity column in table 'tableX' can only be specified when a column list is used and IDENTITY_INSERT is ON."只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表 'tableX' 中的标识列指定显式值。”
【发布时间】:2016-07-21 20:20:06
【问题描述】:

我收到上面的错误,说如果不执行这些操作,我无法显式定义标识列,但是,我并没有尝试设置标识列的值。我只是试图使用用户输入执行一个基本的插入语句。我真的被困住了,需要克服这个问题。想法?

 Public Sub ExecuteSQL(ByVal sql As String)

    Using myConnection As New Data.SqlClient.SqlConnection(connString)
        myConnection.Open()
        Using cdmDatabaseCommand As New Data.SqlClient.SqlCommand(sql, myConnection)
            cdmDatabaseCommand.ExecuteNonQuery()
        End Using
    End Using
End Sub

  Dim insertSpray As String = ""
  insertSpray = "INSERT INTO Spray VALUES ('" & sprayDate & "','" & timeStart & "','" & timeFinish & "','" & tankVolumeStart & "','" & tankVolumeFinish & "','" & comment & "','" & vehicleId & "','" & vehicleTime & "','" & siteType & "','" & area & "','" & applicatorOneId & "','" & applicatorTwoId & "','" & sprayLocationFeature & "','" & sprayStartLocationDescription & "','NULL','NULL','NULL','NULL','" & sprayEndLocationDescription & "');"

  ExecuteSQL(insertSpray)

【问题讨论】:

  • 好吧,您没有指定要插入这些值的列和顺序,因此sprayDate 可能会尝试挤入 Identity 列。您还应该使用 SQL 参数。一切都不是字符串/文本吗?
  • 不将insert_list 包含在insert 语句中是非常糟糕的做法。表架构中的任何更改都会导致应用程序崩溃。
  • 如果您的 comment 变量包含撇号,此代码将如何工作? (提示:不会)。

标签: sql sql-server vb.net


【解决方案1】:

您没有指定列列表,因此 SQL Server 假定您要按表顺序插入所有列。

您需要更改语法以指定要插入的列的名称(显然要省略标识列):

insert into Spray (SprayDate, TimeStart, ...) 
values (...

另请注意,您的代码容易受到SQL injection 攻击。你应该考虑使用parameterized queries

【讨论】:

  • 感谢您的快速回答。我不知道为什么我没有想到这样做。还要感谢您对 SQL 注入的警告。我现在正在研究参数化查询。
【解决方案2】:

尝试显式地使表格Spray的列不带标识列。

类似这样的:

insertSpray = "INSERT INTO Spray(Column1, Column2,...) VALUES (Value1,Value2,..)"

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2013-06-05
    • 2023-04-08
    • 1970-01-01
    • 2016-10-21
    相关资源
    最近更新 更多