从c#到SQL Server的插入查询的异常

时间:2015-08-31 13:22:54

标签: c# sql-server visual-studio-2010 sql-server-2008

我的应用程序运行良好,但客户希望我添加一些功能。 现在,当我运行应用程序时,任何事情都有效,但通过单击执行插入查询的按钮,此消息会发生异常:

The parameterized query '(@ID int,@Subj nvarchar(50),@Pic varbinary(8000),@LetDate date,@' expects the parameter '@Pic', which was not supplied.
那些愚蠢的括号是什么? 这部分程序的代码:

conn.Open();
string sqlcmd = "Insert into Pictures (ID, Subj, Pic, LetDate, LetTitle) Values (@ID, @Subj, @Pic, @LetDate, @LetTitle)";
insertCommand = new SqlCommand(sqlcmd, conn);
// For image data, we save the bytes into the database. We save the image to the JPG format bytes. 
insertCommand.Parameters.Add("ID", SqlDbType.Int).Value = (++lastID);
insertCommand.Parameters.Add("Subj", SqlDbType.NVarChar, 50).Value = textBox1.Text;
insertCommand.Parameters.Add("Pic", SqlDbType.VarBinary).Value = dynamicDotNetTwain1.SaveImageToBytes(lastIndex, Dynamsoft.DotNet.TWAIN.Enums.DWTImageFileFormat.WEBTW_JPG);
insertCommand.Parameters.Add("LetDate", SqlDbType.Date).Value = dateTimeSelector1.Value.Value.Date;
insertCommand.Parameters.Add("LetTitle", SqlDbType.NText).Value = titleTextBox1.Text;
index++;
int queryResult = insertCommand.ExecuteNonQuery();
if (queryResult == 1)
    MessageBox.Show("تصویر با موفقیت در پایگاه داده ذخیره شد", "پیغام", MessageBoxButtons.OK, MessageBoxIcon.Information);
conn.Close();

2 个答案:

答案 0 :(得分:1)

这是程序中其他位置发生的错误,与存储过程执行代码无关。

SQL错误消息“需要参数'@VariableName',这是未提供的。”通常表示您将参数值设置为null。如果您确实打算将NULL传递给查询,则必须使用DBNull.Value值。但是,看起来您正在尝试传递实际值。因此,您的问题来源就是这一行:

insertCommand.Parameters.Add("Pic", SqlDbType.VarBinary).Value =  dynamicDotNetTwain1.SaveImageToBytes(lastIndex, Dynamsoft.DotNet.TWAIN.Enums.DWTImageFileFormat.WEBTW_JPG);

如果你能弄清楚为什么dynamicDotNetTwain1.SaveImageToBytes()函数返回null并使该函数按预期工作,那么你的存储过程将按预期工作。

答案 1 :(得分:-1)

我认为你忘了把@放在变量名的前面......

insertCommand.Parameters.Add("@ID", SqlDbType.Int).Value = (++lastID);
insertCommand.Parameters.Add("@Subj", SqlDbType.NVarChar, 50).Value = textBox1.Text;
insertCommand.Parameters.Add("@Pic", SqlDbType.VarBinary).Value = dynamicDotNetTwain1.SaveImageToBytes(lastIndex, Dynamsoft.DotNet.TWAIN.Enums.DWTImageFileFormat.WEBTW_JPG);
insertCommand.Parameters.Add("@LetDate", SqlDbType.Date).Value = dateTimeSelector1.Value.Value.Date;
insertCommand.Parameters.Add("@LetTitle", SqlDbType.NText).Value = titleTextBox1.Text;