【问题标题】:Problem with a sql statementsql语句的问题
【发布时间】:2011-06-06 14:11:18
【问题描述】:
string insertCommand = 
    "INSERT INTO Users (UserID) VALUES" + "" + "(CONVERT(uniqueidentifier, '" + 
    UsersIdentityToinsert + "'),'"+ userName+",0,null')";  

它告诉我:

There are fewer columns in the INSERT statement than values specified

在 VALUES 子句中。的数量 VALUES 子句中的值必须匹配 中指定的列数 INSERT 语句。

但我有四列?

【问题讨论】:

    标签: c# asp.net sql


    【解决方案1】:

    在插入列表中只有 UserID,但在值列表中,您有两个值 - 一个唯一标识符和一个用户名

    这样会更好:(假设您的用户名列的名称)

    string insertCommand = 
        "INSERT INTO Users (UserID, username) VALUES" + "" + 
        "(CONVERT(uniqueidentifier, '" + UsersIdentityToinsert + "'),'"+ userName+"')";
    

    编辑:

    我觉得我需要更清楚地解决这部分问题:

    但我有四列?

    您收到的错误指的是 INSERT 语句中指定的列数 - 而不是实际的表,因此如果您使用以下方式启动 INSERT:

    INSERT INTO AnyTable (ColumnA, ColumnB)
    

    您需要匹配 VALUES 子句中的列数

    VALUES ("Value1", "Value2")
    

    【讨论】:

    • 如果我们使用参数会更好,这样我们就可以防止sql注入和丑陋的代码。 :)
    • 嗯。你是说我需要声明@Username,UniqueIdentifier..然后将它们设置为值..这样可以防止sql攻击吗?
    • sql 注入是一个有效点,但不仅仅是声明它们 - 您还应该验证您获得的任何值
    • 哇,好像需要不止一个sql语句啊
    • 可能,是的。但想象一下,如果有人要使用用户名注册:usr');drop database aaa;。你需要确保没有人可以做到这一点。 (请注意,我真的不知道这是否可行,但这是一个极端的例子)
    【解决方案2】:

    您在列名称中缺少“用户名”,即列名称和值不匹配。

    string insertCommand = 
        "INSERT INTO Users (UserID,UserName) VALUES" + "" + 
        "(CONVERT(uniqueidentifier, '" + UsersIdentityToinsert + "'),'"+ userName+"')";
    

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2010-10-11
      • 2018-02-27
      • 1970-01-01
      • 2011-09-12
      相关资源
      最近更新 更多