错误:INSERT语句中的列多于VALUES子句中指定的值

问题描述 投票:-1回答:2

我检查了我的价值观,但它仍然说我没有足够的价值。我有一个不在insert-statement中的值,但它是一个标识值,所以我想我不必在我的代码中指定它?!?!

无论如何这里是代码:

string Fname = tbFIRSTNAME.Text.Trim();
                string Lname = tbLASTNAME.Text.Trim();
                string Sname = tbStreetName.Text.Trim();
                string SSN = tbSSN.Text.Trim();
                string CrimeID = cmbCRIMEID.Text.ToString();
                string DangerLVL = cmbDANGERLEVEL.Text.ToString();
                string CrimeDesc = rtbCrimeInfo.Text.Trim();

                string str = "insert into Crooks (FirstName, LastName, StreetName, SSN, CrimeID, DangerLevel, CrimeDescription) values ('" + Fname + '"' + Lname + '"' + Sname + '"' + SSN + '"' + DangerLVL + '"' + CrimeID + '"' + CrimeDesc + "')";

                clsDB.InsUpDel(str);
c# mysql insert
2个回答
1
投票

问题是你没有在你的值之间设置逗号(所以你实际输入的值不是7):

string str = "insert into Crooks (FirstName, LastName, StreetName, SSN, CrimeID, DangerLevel, CrimeDescription) values ('" + Fname + "','" + Lname + "','" + Sname + "'," + SSN + "," + DangerLVL + "," + CrimeID + ",'" + CrimeDesc + "')";

显然,一些varchar类型也没有包含在''之间。现在情况并非如此,但在添加逗号之后,由于类型不匹配,您可能会遇到其他错误


2
投票

正如其他人所说,您的基本错误是您没有用逗号分隔所有值。除此之外,你有一个很大的安全漏洞。这就是直接从文本框中使用您的值。这是软件设计中最不安全和最常见的安全漏洞,可能会导致您对应用程序进行SQL注入攻击。为避免这种情况,您应该使用参数化查询。这是一个恢复的代码,但你应该这样:

using(MySqlConnection conn = new MySqlConnection("YourConnectionString"))
{
        conn.Open();
        MySqlCommand command = conn.CreateCommand();
        command.CommandText = "insert into Crooks (FirstName, LastName, StreetName, SSN, CrimeID, DangerLevel, CrimeDescription) VALUES (@FirstName, @LastName, @StreetName, @SSN, @CrimeID, @DangerLevel, @CrimeDescription)";

        command.Parameters.AddWithValue("@FirstName", tbLASTNAME.Text.Trim());
        command.Parameters.AddWithValue("@LastName", tbStreetName.Text.Trim());
        /*
        ...
        AND SO ON WITH OTHER PARAMETERS
        ...
        */    
        command.ExecuteNonQuery();
        conn.Close();
}
© www.soinside.com 2019 - 2024. All rights reserved.