Что означает неявное преобразование из типа данных nvarchar(max) в varbinary(max) и как это исправить?
Я пытаюсь сохранить изображение в моей базе данных SQL с помощью Picturebox и кнопку Сохранить в приложении формы C# Windows. это коды, которые я использовал для сохранения изображения:
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, но изображение не показывалось в сетке данных, поэтому я изменил тип данных на varbinary, после чего у меня возникла ошибка.
и это ошибка:
Произошло необработанное исключение типа "System.Data.SqlClient.SqlException" в System.Data.dll
Дополнительная информация: неявное преобразование из типа данных nvarchar(max) в varbinary(max) не допускается. Используйте функцию CONVERT, чтобы выполнить этот запрос.
Пожалуйста, помогите мне! Спасибо!
3 ответа
Когда вы используете AddWithValue()
он предполагает тип столбца базы данных в зависимости от типа передаваемого вами параметра.
Вы преобразовали свою картинку в строку base64, которая в.NET хранится внутри как символы Юникода и хранится в базе данных как nvarchars. Когда вы добавляете это к параметрам, предполагается, что вы хотите сохранить текстовые символы, которые будут nvarchar, но реальный тип базы данных - varbinary, который, как предполагает ошибка, не имеет неявного преобразования между ними. Вы хотите сохранить свой байтовый массив в поле, а не конвертировать его в base64.
Следует также отметить, что хранить в базе данных что-либо, кроме очень маленьких картинок, как правило, не очень эффективно. В большинстве случаев лучше хранить только имя картинки и хранить ее на диске. Если вы настаиваете на том, чтобы хранить их в БД, то вам следует создать отдельную таблицу только для ваших блобов.
Ваш @value21 является строкой, проверьте этот столбец в базе данных, если это nvarbinary(max), измените тип данных на nvarchar(max), чтобы сохранить его, как сказал @Bridge в комментарии предыдущего ответа, попробуйте указать тип данных
cmd.Parameters.AddWithValue("@value1" , entryno.Text == DBNull.Value ? System.Data.SqlTypes.SqlBinary.Null : entryno.Text);
Использовать это. Думаю Ваша проблема решена.