Что означает неявное преобразование из типа данных 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);

Использовать это. Думаю Ваша проблема решена.

Другие вопросы по тегам