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

时间:2017-01-30 18:54:03

标签: c# mysql insert

我检查了我的价值观,但仍然说我没有足够的价值。我有一个值不在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);

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

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

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

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