【问题标题】:An explicit value for the identity column in table 'Users' can only be specified when a column list is used and IDENTITY_INSERT is ON只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表“用户”中的标识列指定显式值
【发布时间】:2018-05-04 19:42:08
【问题描述】:

我一直在尝试使我的 SQL Server 数据库与我的 aspx 项目一起工作。我为从我的网络表单文本字段中读取数据的用户创建了一个表格。但是,无论出于何种原因,它都会尝试将我的 Usersid 列分配给我的 Web 项目中的第一个文本框。我似乎想不出办法来解决它。你能帮帮我吗?

CREATE TABLE [dbo].[Users]
(
    [Id] INT NOT NULL PRIMARY KEY, 
    [Username] NVARCHAR(MAX) NULL, 
    [Password] NVARCHAR(MAX) NULL, 
    [Email] NVARCHAR(MAX) NULL, 
    [Name] NVARCHAR(MAX) NULL
)

在这里我从 webform 分配值:

SqlCommand cmd = new SqlCommand("insert into Users values('" + tbUname.Text + "','" + tbPass.Text + "','" + tbEmail.Text + "','" + tbName.Text + "','u')", con);

网络表单标记:

        <div class="center-page">
            <label class="col-xs-11">Username</label>
            <div class="col-xs-11">
                <asp:TextBox ID="tbUname" runat="server" CssClass="form-control" placeholder="Username"></asp:TextBox>

            </div>
            <label class="col-xs-11">Password</label>
            <div class="col-xs-11">
                <asp:TextBox ID="tbPass" runat="server" CssClass="form-control" placeholder="Password"></asp:TextBox>
            </div>
            <label class="col-xs-11">Confirm Password</label>
            <div class="col-xs-11">
                <asp:TextBox ID="tbCPass" runat="server" CssClass="form-control" placeholder="Confirm Password"></asp:TextBox>
            </div>
            <label class="col-xs-11">Name</label>
            <div class="col-xs-11">
                <asp:TextBox ID="tbName" runat="server" CssClass="form-control" placeholder="Name"></asp:TextBox>
            </div>

            <label class="col-xs-11">E-Mail</label>
            <div class="col-xs-11">
                <asp:TextBox ID="tbEmail" runat="server" CssClass="form-control" placeholder="Email"></asp:TextBox>
            </div>
            <br />
            <br />
            <br />
            <div class="col-xs-11 space-vert">
                <asp:Button ID="btSignup" runat="server" class="btn btn-success" Text="Sign Up" OnClick="btSignup_Click" />
            </div>
        </div>

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看Little Bobby Tables
  • 在您的插入语句中,您需要提供列列表。插入用户(用户名、密码、..)值(..)
  • 另外:不要只是简单地将表格的每一列设为NVARCHAR(MAX),因为您懒得考虑合适的大小 - 投入时间 并确保使用正确的数据类型和长度!
  • 如前所述,这是非常可怕的代码,因为它对 sql 注入非常开放。但是发生错误是因为您在插入语句的末尾有一个额外的值 'u'。那是为了什么?
  • 密码永远不应该以纯文本形式存储。始终对您的密码进行散列和加盐并存储加密值。

标签: sql sql-server


【解决方案1】:

您只需要在INSERT 命令中明确指定要插入的列 - 如下所示:

INSERT INTO dbo.Users(Username, Password, Email, Name)
VALUES (@val1, @val2, @val3, @val4);

【讨论】:

  • 我明白了,谢谢。认为这会奏效。但无论出于何种原因,它说它想将空值添加到 id 字段 SqlCommand cmd = new SqlCommand("insert into Users(Username, Password, Email, Name) values('" + tbUname.Text + "','" + tbPass .Text + "','" + tbEmail.Text + "','" + tbName.Text + "')", con);
  • 必须声明标量变量“@tbUname”。我不明白为什么它认为我想将 id 设置为 varchar
  • @janekjan 当您只发布代码的 sn-ps 和部分 DDL(这与报告的错误不一致)时,很难提供帮助。如果你需要帮助,你需要付出更多的努力来提供信息。此外,学习调试代码。您通过代码生成一条 sql 语句 - 要对其进行调试,您需要实际查看它(并发布它),以便其他人可以了解您的代码在做什么并将其与您声称在做什么进行比较。
【解决方案2】:

您的 ID 字段是自动递增的身份字段吗? 我想这不是因为我没有看到你使用

IDENTITY(1,1)

在你的创建表中,那么你需要在你的插入语句中使用它

INSERT INTO dbo.Users(Id,Username, Password, Email, Name)
VALUES (@val1, @val2, @val3, @val4,@val5);

【讨论】:

    【解决方案3】:

    解决问题: 替换此查询...

    SqlCommand cmd = new SqlCommand("插入用户值('" + tbUname.Text + "','" + tbPass.Text + "','" + tbEmail.Text + "','" + tbName.文本 + "','u')", con);

    这里有这个

    SqlCommand cmd = new SqlCommand("INSERT INTO [dbo].[Users] ([Username], [Password], [Email],[Name])VALUES('" + tbUname.Text + "','" + tbPass.Text + "','" + tbEmail.Text + "','" + tbName.Text + "')", con);

    【讨论】:

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