【问题标题】:ASP.NET: Identity_Insert set to OFF - How do I fix this?ASP.NET:Identity_Insert 设置为 OFF - 我该如何解决这个问题?
【发布时间】:2014-05-10 14:46:16
【问题描述】:

我的错误如下:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“Snacks”中的标识列插入显式值。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详情:

System.Data.SqlClient.SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Snacks”中插入标识列的显式值。

我创建了一个带有 SQL 数据库的表,该表具有唯一的 ID、描述和价格选项,主键是 ID。

如何在 Visual Web Developer 2010 中修复此错误?

<asp:SqlDataSource ID="sdsSnacks" runat="server" 
        ConnectionString="<%$ ConnectionStrings:cs3201 %>" 
        DeleteCommand="DELETE FROM [Snacks] WHERE [SID] = @SID" 
        InsertCommand="INSERT INTO [Snacks] ([Price], [Description]) VALUES (@Price, @Description)" 
        SelectCommand="SELECT [Price], [Description], [SID] FROM [Snacks]" 

        UpdateCommand="UPDATE [Snacks] SET [Price] = @Price, [Description] = @Description WHERE [SID] = @SID">
        <DeleteParameters>
            <asp:Parameter Name="SID" Type="Int32" />
        </DeleteParameters>
        <InsertParameters>
            <asp:Parameter Name="Price" Type="Decimal" />
            <asp:Parameter Name="Description" Type="String" />
        </InsertParameters>
        <UpdateParameters>
            <asp:Parameter Name="Price" Type="Decimal" />
            <asp:Parameter Name="Description" Type="String" />
            <asp:Parameter Name="SID" Type="Int32" />
        </UpdateParameters>
    </asp:SqlDataSource>`

【问题讨论】:

  • 这是一个 SQL 错误,而不是 ASP.NET 错误。您是否有正在运行的特定 SQL 查询可以向我们展示?
  • 我不知道,有没有办法检查?我是初学者。
  • 您使用的是什么技术?某些东西(您或您正在使用的工具)正在创建一个INSERT 命令,该命令试图为identity 列设置一个值。要么改变查询,所以它不会,或者(正如人们所回答的那样)为特定表使用SET IDENTITY_INSERT
  • 我正在使用 Visual-Web-Developer 2010 和 Asp.Net

标签: sql sql-server


【解决方案1】:

这并不是一个 ASP.NET 问题,而是一个 SQL 错误。

当您有 identity 列时,每次添加新行时,该列都应包含一个新值(通常递增 1)。

您显示的错误是因为您或您正在使用的技术试图告诉 SQL Server identity 列中应该是什么值。

您可以使用以下选项(据我所知)...

如果您编写了 SQL 查询并列出了所有列,那么您应该删除 identity 列。比如……

INSERT INTO [MYTABLE] ([IDENTCOLUMN],[MYVAL]) VALUES (1,1)

应该变成……

INSERT INTO [MYTABLE] ([MYVAL]) VALUES (1)

如果您编写了 SQL 查询并且没有列出所有列,那么您应该编写没有 identity 列的所有列。比如……

INSERT INTO [MYTABLE] VALUES (1,1)

应该变成……

INSERT INTO [MYTABLE] ([MYVAL]) VALUES (1)

否则,如果您真的想专门设置 identity 列的值,您需要告诉 SQL Server 您正在使用以下内容覆盖正常的 identity 处理。 .

SET IDENTITY_INSERT [MYTABLE] ON
INSERT INTO [MYTABLE] ([IDENTCOLUMN],[MYVAL]) VALUES (1,1)
SET IDENTITY_INSERT [MYTABLE] OFF

【讨论】:

  • 这很有意义,但是我没有为这部分编写任何代码。我添加了表格,配置了数据源,然后手动将 3 列输入到表格中。
  • 查看您更新的问题,我不得不承认您的 INSERT 命令看起来不错,因为您肯定没有在其中设置 [SID]。很奇怪
  • 您能否在您的问题中向我们展示 CREATE TABLE[Snacks],以便我们准确确认这些列是什么?
  • 我认为这成功了!我现在很好奇如何让我的详细信息视图显示为“空模板”,而不是在加载页面时将我的第一个选择放在 dv 中。有什么建议吗?
  • 这是一个完全不同的问题,所以请创建一个新问题。我的回答对你有什么帮助,问题是什么?请记住 SO 在reputation 的系统下运行。如果我的回答有帮助,请考虑upvoting it。如果我的回答是您问题的解决方案,请考虑 marking it as accepted - 它向社区表明您的问题已得到解答。
【解决方案2】:

您需要设置 IDENTITY_INSERT ON:

语法是:

SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }

【讨论】:

  • 我在哪里插入这个?
  • 插入查询之前。
【解决方案3】:

您在数据库中将 ID 列指定为 Identity。之后,您尝试向该列插入一个特定值,这很可能是您不想做的事情。

在插入时删除 ASP.NET 代码中 ID 的值,它将为您自动生成。

【讨论】:

  • 会是“身份种子:1”吗?
  • 不,这是将为您生成的第一个数字。请在您尝试添加数据的地方发布代码,我会更新我的答案。
  • 我还没有发布照片的声誉,我正在使用 Visual Web Developer
  • 我把我认为你需要的东西贴在上面了!
  • 这很有帮助,但它似乎并没有进行身份插入,除非您的列价格或描述在您的数据库中被定义为身份。如果您不确定发布定义表格的代码。
【解决方案4】:

在插入一个 ID 号已存在于数据库中的对象后,我收到了该错误。从 asp.net 项目插入代码优先方法 db 时发生。 只是在尝试更复杂的建议之前检查一下。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-03-25
  • 2020-02-14
  • 2021-10-23
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多