我想在SQL表中保存新记录。 其中一个表字段是“用户名”,我想通过使用会话添加记录,其他字段来自用户。 这是我在C#asp.net中的代码:
protected void savesubmit_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=Khayati;Integrated Security=True");
string qu = string.Format("insert into Ordertb (nokar,modeledokht,tozihat,username) values('{0}','{1}',N'{2}',N'{3}')", DropDownList1.Text, DropDownList2.Text, tozihtxt.Text, Convert.ToString(Session["username1"]));
SqlDataAdapter da = new SqlDataAdapter(qu, con);
DataSet ds = new DataSet();
da.Fill(ds, "ordertbl");
}
但是当我运行它时,我看到了这个错误:
INSERT语句中的列多于VALUES子句中指定的值。 VALUES子句中的值数必须与INSERT语句中指定的列数相匹配。
描述:执行当前Web请求期间发生了未处理的异常。 请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。
异常详细信息:System.Data.SqlClient.SqlException:INSERT语句中的列多于VALUES子句中指定的值。 VALUES子句中的值数必须与INSERT语句中指定的列数相匹配。
答案 0 :(得分:3)
您的问题是您正在尝试插入3个值:
values('{0}','{1}',N'{2}')
分为4栏:
(nokar,modeledokht,tozihat,username)
我相信你的意思是这样做:
values('{0}','{1}',N'{2}','{3}')
旁注:
始终使用Command.Parameters
而不是将您的命令解析为string
!将命令解析为string
时,您将受到SQL注入和错误的影响,就像您所拥有的那样。使用Command.Parameters
可以更安全,更轻松。
示例:
SqlCommand Command = new SqlCommand();
Command.CommandText = "insert into tbl (col) values (@val)";
Command.Parameters.Add(new SqlParameter("val", valueVariable));
Command.ExecuteNonQuery();
或者,在您的情况下:
SqlCommand Command = new SqlCommand();
Command.CommandText = @"insert into Ordertb
(nokar,modeledokht,tozihat,username)
values
(@nokar,@modeledokht,@tozihat,@username)";
Command.Parameters.Add(new SqlParameter("nokar", DropDownList1.Text));
Command.Parameters.Add(new SqlParameter("modeledokht", DropDownList2.Text));
Command.Parameters.Add(new SqlParameter("tozihat", tozihtxt.Text));
Command.Parameters.Add(new SqlParameter("username", Convert.ToString(Session["username1"])));
Command.ExecuteNonQuery();
答案 1 :(得分:0)
insert into Ordertb (nokar,modeledokht,tozihat,username) values('{0}','{1}',N'{2}')
您已指定设置四列但仅提供3个值。
(并且有一个针对SQL注入漏洞的暗示:总是参数化您的查询。)
答案 2 :(得分:0)
基本上你只需要在SQL语句中添加第四个值。
testuser
然而你应该考虑使用SQL参数。
答案 3 :(得分:0)
要避免此错误,请确保VALUES子句中指定的值的数量与INSERT INTO子句中指定的列数相匹配:
确保所有值或不为空或为空。
(或)
尝试这种方式:
INSERT INTO Ordertb(nokar,modeledokht,tozihat,用户名) VALUES('Mickey','Mouse','M','XYZ')
答案 4 :(得分:0)
使用using
来建立连接也很好,所以你不必担心以后关闭它。
using (SqlCommand commandInsert = new SqlCommand(YourQuery, YourConnectionString))
{
commandInsert.Parameters.Add(parameterAccount);
commandInsert.Parameters.Add(parameterPassword);
commandInsert.Parameters.Add(parameterBalance);
commandInsert.Parameters.Add(parameterAccountStatus);
commandInsert.Parameters.Add(parameterDateOfCreation);
commandInsert.ExecuteNonQuery();
connection.Close();
};