列名称无效节点名称(如果有)=,列名称= d

时间:2013-04-17 04:01:52

标签: c# sql-server-2008 sql-insert

我花了好几个小时试图解决这个错误,但我做不到。如果有人能帮我解决这个问题,我会很高兴的。

代码:

FileStream fs;
fs = new FileStream(@imagename, FileMode.Open, FileAccess.Read);
byte[] picbyte = new byte[fs.Length];
fs.Read(picbyte, 0, System.Convert.ToInt32(fs.Length));
fs.Close();
string query;
SqlCeConnection conn = new SqlCeConnection(@"Data Source=C:\Users\admin\documents\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\hotel.sdf");
conn.Open();
SqlParameter picparameter = new SqlParameter();
picparameter.SqlDbType = SqlDbType.Image;
picparameter.ParameterName = "pic";
picparameter.Value = picbyte;
query = "insert into Staffs(name, age, qualification, mobile, landline, salary, salary_type, address, work_type, reference, picture) values(" + textBox16.Text + ", " + textBox15.Text + "," + textBox14.Text + "," + textBox13.Text + "," + textBox12.Text + "," + textBox11.Text + "," + comboBox2.Text + "," + richTextBox2.Text + "," + textBox10.Text + "," + textBox9.Text + ", " + " @pic)";
SqlCeCommand cmd = new SqlCeCommand("insert into Staffs(name, age, qualification, mobile, landline, salary, salary_type, address, work_type, reference, picture) values(" + textBox16.Text + ", " + textBox15.Text + "," + textBox14.Text + "," + textBox13.Text + "," + textBox12.Text + "," + textBox11.Text + "," + comboBox2.Text + "," + richTextBox2.Text + "," + textBox10.Text + "," + textBox9.Text + ", " + " @pic)", conn);
cmd.ExecuteNonQuery();
MessageBox.Show("Profile Added");
cmd.Dispose();
conn.Close();
conn.Dispose();

错误:

列名称无效节点名称(如果有)=,列名= d

到目前为止我发现了:

错误中的“列名= d”是文本字段的值。如果我在文本字段中键入a,则错误将更改为“column name = a”。

如果我在文本字段中放入数字而不是字符,则错误会更改为此 “缺少参数[参数ordinal = 1]。列的数据类型为nvarchar。

我尝试编辑数据库架构,但什么都没发生。

我检查了数据库的重复副本并找不到,所以我想问题是代码。

列的数据类型为nvarchar,int或image。

为了确保我检查数据库以查看插入是否有效,数据库仍为空。

3 个答案:

答案 0 :(得分:2)

您需要使用SQL参数来避免SQL注入问题。

但是你的东西现在失败的原因是你没有在查询中引用你的字符串值。如果你调试并查看命令的文本,你会看到像values(abc,def,ghi...)这样的东西,而不是字符串周围的单引号。

该查询尝试运行,当然它失败了。除了使代码更安全,更易于阅读外,SQL参数不再需要单引号。

答案 1 :(得分:1)

您的参数名称不正确。它应该是@pic,而不是pic

顺便说一句,您连接文本框值的方式让您对SQL注入攻击持开放态度。当然,我不知道你的上下文,但考虑用参数值设置替换字符串连接。

答案 2 :(得分:0)

我通过删除整个数据库并重新创建它来解决了这个问题。

很明显,如果您在数据库中使用的旧版本比您想要使用的那样,则会发生这种情况,因此该表中不存在该列。