2013-11-06 3 views
4

Я работаю над визуальной программой для обработки изображений. Я пытаюсь добавить изображение в базу данных sql с помощью Visual C# (формы Windows) и ADO.NET.Добавление изображения в базу данных SQL с помощью Visual C#

Я преобразовал изображение в двоичную форму с помощью метода фильтрации, но байты изображения не сохраняются в базе данных. В столбце изображения базы данных сказано: < Двоичные данные> и данные не сохраняются!

Я пробовал много методов для вставки (с хранимыми процедурами и без них), но всегда получал то же самое в базе данных.

private void button6_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     byte[] image = null; 
     pictureBox2.ImageLocation = textBox1.Text; 
     string filepath = textBox1.Text; 
     FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read); 
     BinaryReader br = new BinaryReader(fs); 
     image = br.ReadBytes((int)fs.Length); 
     string sql = " INSERT INTO ImageTable(Image) VALUES(@Imgg)"; 
     if (con.State != ConnectionState.Open) 
     con.Open(); 
     SqlCommand cmd = new SqlCommand(sql, con); 
     cmd.Parameters.Add(new SqlParameter("@Imgg", image)); 
     int x= cmd.ExecuteNonQuery(); 
     con.Close(); 
     MessageBox.Show(x.ToString() + "Image saved"); 
    } 
} 

Я не получаю ошибку в коде. изображение было преобразовано, а запись выполнена в базе данных, но сообщает < Двоичные данные> в базе данных sql.

+3

Почему вы не просто сохранить изображение на диск? – Arran

+0

Непонятно, каким образом это не работает. Если в базе данных хранятся двоичные данные, это не так успешно? Или вы имеете в виду, что он хранит строку * literal * «»? Покажите код, который вы используете для хранения данных, и укажите, где вы заметили, что есть проблема. – David

+0

Показать код. Если вы покажете нам, как вы конвертируете изображение в байты и как вы его вставляете, есть больше шансов, что мы сможем найти проблему. – Tobberoth

ответ

4

Выбранный поток файлов должен быть преобразован в массив байтов.

 FileStream FS = new FileStream(filepath, FileMode.Open, FileAccess.Read); //create a file stream object associate to user selected file 
     byte[] img = new byte[FS.Length]; //create a byte array with size of user select file stream length 
     FS.Read(img, 0, Convert.ToInt32(FS.Length));//read user selected file stream in to byte array 

Теперь это нормально работает. База данных по-прежнему показывает < Двоичные данные> но она может быть преобразована обратно в изображение с использованием метода memystream.

Спасибо всем ...

2

Попробуйте с чем-то вроде этого:

byte[] fileBytes=System.IO.File.ReadAllBytes("path to file"); 
System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand("insert into table(blob,filename) values (@blob,@name)"); 
command.Parameters.AddWithValue("blob", fileBytes); 
command.Parameters.AddWithValue("name", "filename"); 
command.ExecuteNonQuery(); 
0

Предполагая, что вы используете VARBINARY для хранения изображений (which you should be), вам может понадобиться, чтобы сделать ваш SqlParameter более сильно типизированных:

Так вместо

cmd.Parameters.Add(new SqlParameter("@Imgg", image)); 

Вы могли бы использовать:

cmd.Parameters.Add("@Imgg", SqlDbType.VarBinary).Value = (SqlBinary)image; 

Вы также можете использовать System.IO.File.ReadAllBytes, чтобы сократить код, превратив путь к файлу в массив байтов.

0

Выполнить эту хранимую процедуру:

create procedure prcInsert 
(
    @txtEmpNo varchar(6), 
    @photo image 
) 
as 
begin 
    insert into Emp values(@txtEmpNo, @photo) 
end 

Таблица EMP:

create table Emp 
(
    [txtEmpNo] [varchar](6) NOT NULL, 
    imPhoto image 
) 
Смежные вопросы