Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不允许从数据类型nvarchar(max)到varbinary(max)的隐式转换意味着什么?如何修复它?_C#_Sql Server_Winforms - Fatal编程技术网

C# 不允许从数据类型nvarchar(max)到varbinary(max)的隐式转换意味着什么?如何修复它?

C# 不允许从数据类型nvarchar(max)到varbinary(max)的隐式转换意味着什么?如何修复它?,c#,sql-server,winforms,C#,Sql Server,Winforms,我正在尝试使用picturebox和c#windows窗体应用程序上的save按钮将图像保存到我的sql数据库。以下是我用来保存图像的代码: private void btnsave_Click(object sender, EventArgs e) { MemoryStream ms = new MemoryStream(); pictureBox2.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); Byte[]

我正在尝试使用picturebox和c#windows窗体应用程序上的save按钮将图像保存到我的sql数据库。以下是我用来保存图像的代码:

private void btnsave_Click(object sender, EventArgs e)
{
   MemoryStream ms = new MemoryStream();
   pictureBox2.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
   Byte[] picarray = ms.ToArray();
   String picbase64 = Convert.ToBase64String(picarray);

   SqlConnection con = new SqlConnection("Data Source=LAPTOP-EUNPD14B;Initial Catalog=db;Integrated Security=True");
    
   SqlCommand cmd = new SqlCommand();
   con.Open();
   cmd.CommandType = CommandType.Text;

   cmd.CommandText = @"INSERT INTO tblreport([entrynum],[reportdate],[reporttime],[vicfirstname],[viclastname],[vicmidname], [vicage],[vicgender],[vicaddress],[incident],[time],[date],[place],[casefiled],[susfirstname],[suslastname],[susmidname],[susage],[susgender],[susaddress],[suspic]) VALUES(@value1,@value2,@value3,@value4,@value5,@value6,@value7,@value8,@value9,@value10,@value11,@value12,@value13,@value14,@value15,@value16,@value17,@value18,@value19,@value20,@value21)";

   cmd.Parameters.AddWithValue("@value1", entryno.Text);
   cmd.Parameters.AddWithValue("@value2", dtreport.Text);
   cmd.Parameters.AddWithValue("@value3", timereport.Text);
   cmd.Parameters.AddWithValue("@value4", txtcomfirst.Text);
   cmd.Parameters.AddWithValue("@value5", txtcomlast.Text);
   cmd.Parameters.AddWithValue("@value6", txtcommid.Text);
   cmd.Parameters.AddWithValue("@value7", txtcomage.Text);
   cmd.Parameters.AddWithValue("@value8", cbocomgen.Text);
   cmd.Parameters.AddWithValue("@value9", txtcomaddress.Text);
   cmd.Parameters.AddWithValue("@value10", txtincident.Text);
   cmd.Parameters.AddWithValue("@value11", timeincident.Text);
   cmd.Parameters.AddWithValue("@value12", dtincident.Text);
   cmd.Parameters.AddWithValue("@value13", txtincidentplace.Text);
   cmd.Parameters.AddWithValue("@value14", txtcase.Text);
   cmd.Parameters.AddWithValue("@value15", susfirst.Text);
   cmd.Parameters.AddWithValue("@value16", suslast.Text);
   cmd.Parameters.AddWithValue("@value17", susmid.Text);
   cmd.Parameters.AddWithValue("@value18", susage.Text);
   cmd.Parameters.AddWithValue("@value19", cbosusgender.Text);
   cmd.Parameters.AddWithValue("@value20", susadd.Text);
   cmd.Parameters.AddWithValue("@value21", picbase64);
   cmd.Connection = con;

   cmd.ExecuteNonQuery();
   MessageBox.Show("Report Saved");

   con.Close();
}
当我使用的数据类型是Varchar时,代码就工作了,但是图片不会显示在datagridview上,所以我在出错后将数据类型更改为varbinary

这就是错误:

System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常

附加信息:不允许从数据类型nvarchar(max)隐式转换为varbinary(max)。使用CONVERT函数运行此查询


请帮帮我!谢谢大家!

当您使用
AddWithValue()
时,它根据您要传递的参数类型采用数据库列类型

您将图片转换为base64字符串,该字符串在.NET中以Unicode字符的形式存储在内部,并以NVARCHAR的形式存储在数据库中。当您将其添加到参数中时,它假定您想要存储文本字符,这将是一个nvarchar,但实际的数据库类型是varbinary,正如错误所表明的,它们之间没有隐式转换。您希望将字节数组保存到字段中,而不是将其转换为base64


我还应该提到的是,在数据库中存储非常小的图片通常不是很有效。在大多数情况下,最好只存储图片的名称并将其保存在磁盘上。如果您坚持将它们存储在数据库中,那么您应该为您的blob创建一个单独的表。

您的@value21是一个字符串,请检查数据库中的该列,如果是nvarbinary(max),请将数据类型更改为nvarchar(max)以保存它,正如@Bridge在上一个答案的注释中所说,尝试指定数据类型

您的列之一是
VARBINARY(MAX)
类型吗?还有:请复制/粘贴错误,而不是屏幕截图。使用varbinary(max)的sql脚本是什么?错误文本是什么?@KannanKandasamy仅图片是使用(varbinary max)的图片错误是:System.Data.SqlClient.SqlException类型的未处理异常发生在System.Data.dll中其他信息:不允许从数据类型nvarchar(max)隐式转换为varbinary(max)。使用CONVERT函数运行此查询。请帮自己一个忙,并为参数指定一个不影响开发人员的名称。Value1、value2非常糟糕。此外,还需要指定参数的类型以避免任何歧义:
cmd.Parameters.Add(“@value21”,SqlDbType.VarBinary)。Value=ms.ToArray()谢谢!我会这么做的