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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误:INSERT语句中的列多于VALUES子句中指定的值相关的知识,希望对你有一定的参考价值。

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

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

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

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

另一答案

正如其他人所说,您的基本错误是您没有用逗号分隔所有值。除此之外,你有一个很大的安全漏洞。这就是直接从文本框中使用您的值。这是软件设计中最不安全和最常见的安全漏洞,可能会导致您对应用程序进行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();
}

以上是关于错误:INSERT语句中的列多于VALUES子句中指定的值的主要内容,如果未能解决你的问题,请参考以下文章

ORA-38101: INSERT VALUES 子句中的列无效:

4数据更新

SQL基础教程(第2版)第4章 数据更新:4-1 数据的插入(INSERT)

SQL语法 之 操作语句

Oracle 19C学习

INSERT + SELECT + ON DUPLICATE KEY 与 SELECT 子句中的列别名