C#列名称或提供的值数与表定义错误不匹配

时间:2017-01-08 13:17:38

标签: c# visual-studio

当我尝试将新人添加到我的列表框并进入我的数据库时,我收到此错误。

我的代码

public void AddSpeler(string name, string club)
        {




        conn.Open();


            Speler speler = new Speler();
            speler.Name = name;
            speler.Club = club;


            string query = "INSERT INTO Speler OUTPUT Inserted.ID VALUES ('" + speler.Name + "', '" + speler.Club + "')";
            SqlCommand cmd = new SqlCommand(query, conn);


            speler.ID = (int)cmd.ExecuteScalar();

            conn.Close();
        }

我得到了错误:

 "speler.ID = (int)cmd.ExecuteScalar();

是的,我将主键(ID)设置为增加一个。

2 个答案:

答案 0 :(得分:2)

正如上面的评论所说,你不应该写一个连接字符串的sql命令。众所周知,这是一个错误来源和一个名为Sql Injection的巨大安全风险。

要修复的第二点是使用的语法。在INSERT INTO语句中,您应该提供与插入的值匹配的列。如果您没有提供列名,那么您需要为表中的每一列写入值,并按照列的确切顺序编写

void AddSpeler(string name, string club)
{
    conn.Open();
    Speler speler = new Speler();
    speler.Name = name;
    speler.Club = club;
    string query = @"INSERT INTO Speler (Name, Club) OUTPUT Inserted.ID 
                     VALUES (@name, @club)";
    SqlCommand cmd = new SqlCommand(query, conn);
    cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = speler.Name;
    cmd.Parameters.Add("@club", SqlDbType.NVarChar).Value = speler.Club;
    speler.ID = (int)cmd.ExecuteScalar();
    conn.Close();
}

这里我假设您的表Speler包含名为Name和Club的列,当然会将它们更改为您的实际名称。

修改
如果要从另一个类调用此方法,则需要将其设置为public,以便创建定义方法的类实例的每个调用者都可以使用它。

顺便说一句,如果你不将它们返回给调用者,AddSpeler中的代码会做一些浪费的事情(void ??)可能你想返回代码中创建的Speler类的实例将方法更改为

public Speler AddSpeler(string name, string club)
{
    try
    {
       conn.Open();
       Speler speler = new Speler();
       .....

       ....
       return speler;
    }
    catch(Exception ex)
    {
        // display the ex.Message to know why your code fails
        MessageBox.Show(ex.Message);
        conn.Close();
        return null; // no Speler returned if code fails
    }
}

答案 1 :(得分:0)

问题是您要跳过提供的值中的ID列,因此您需要指定它。

    string query = "INSERT Speler (Name, Club) OUTPUT Inserted.ID VALUES ('" + speler.Name + "', '" + speler.Club + "')";

虽然这样可以解决错误,但绝对不能连接SQL字符串!请改用参数。