当我尝试将新人添加到我的列表框并进入我的数据库时,我收到此错误。
我的代码:
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)设置为增加一个。
答案 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字符串!请改用参数。