2012-01-30 1 views
0

Мой код для вставки изображения в базе данных выглядит следующим образом:магазин изображений в базе данных и получить его

MemoryStream ms =new MemoryStream(); 
byte[] PhotoByte=null; 
PhotoByte=ms.ToArray(); 
pictureBox1.Image.Save(ms, ImageFormat.Jpeg); 
PhotoByte =ms.ToArray(); 
Str = "insert into Experimmm Values('" + PhotoByte + "','" + textBox1.Text + "')"; 
Conn.Open(); 
cmd.Connection = Conn; 
cmd.CommandText = Str; 
cmd.ExecuteNonQuery(); 
Conn.Close(); 

Который идет хорошо. Я могу видеть двоичные данные в таблице базы данных ма как <Binary Data> Мой код для извлечения данных является:

Str ="select * from Experimmm where id = '" +textBox2.Text + "'"; 
Conn.Open(); 
cmd.Connection = Conn; 
cmd.CommandText = Str; 
dr = cmd.ExecuteReader(); 
if (dr.Read()) 
{ label1.Text = dr.GetValue(1).ToString(); 
byte[] PhotoByte = (byte[])dr.GetValue(0); 
MemoryStream mem = new MemoryStream(PhotoByte, 0, PhotoByte.Length); 
//but an error takes place on next line "Parameter is not valid."    
pictureBox2.Image = Image.FromStream(mem); 
} Conn.Close(); 

Я использую Visual Studio 10, C#, SQL Server 2005

+1

пути PLZ магазин, а затем изображения - тогда вы не будете нуждаться все это. – JonH

+0

Параметр _which_ недействителен? Пожалуйста, опубликуйте все исключение, а не перефразируя его. –

+2

Мои глаза! Они горят! –

ответ

1

Возможно, конечно, чтобы сохранить ваши изображения в db. Однако это не рекомендуется. Лучше хранить их в файловой системе.

Ваш код немного грязный. Ниже приведен лучший пример.

MemoryStream ms =new MemoryStream(); 
byte[] PhotoByte=null; 
pictureBox1.Image.Save(ms, ImageFormat.Jpeg); 
PhotoByte =ms.ToArray(); 
// I'm not sure whether you are able to create an sql by simply concating the string 
Str = "insert into Experimmm Values('@PhotoBytes','@MyTextValue')"; 
// You have to parametrize your query 
cmd.Parameters.AddWithValue("PhotoBytes", PhotoByte); 
// This also helps you to avoid syntactical corruption in case of ' and sql injection 
cmd.Parameters.AddWithValue("MyTextValue", textBox1.Text); 
Conn.Open(); 
cmd.Connection = Conn; 
cmd.CommandText = Str; 
cmd.ExecuteNonQuery(); 
Conn.Close(); 

При получении вы могли бы использовать двоичный писатель в некотором обработчике

namespace TestNS 
{ 
    public class MyHttpHandler : IHttpHandler 
    { 
     // Override the ProcessRequest method. 
     public void ProcessRequest(HttpContext context) 
     { 
     // Your preparations, i.e. querystring or something 
     var conn = new SqlConnection("Your connectionstring"); 
     var command = new SqlCommand("Your sql for retrieval of the bytes", conn); 
     conn.Open(); 
     var data = (Byte[])command.ExecuteScalar(); 
     conn.Close(); 
     context.Response.BinaryWrite(data);  } 

     public Boolean IsReusable 
     { 
     get { return false; } 
     } 
    } 
} 
+0

Спасибо, сэр, действительно благодарю .... –

+0

Сэр я начинаю плз простить меня, если я прошу глупую очередь ... "" что такое пространство имен для контекста "" произошла ошибка, когда я скопировал cod –

+0

@DineshGehlot 'System.Web' – Oybek

0

Вы должны использовать parameterized query вместо конкатенации строки SQL.

Помимо исправления очевидной уязвимости SQL Injection, это позволит вам правильно вставить изображение в базу данных.

Есть много вопросов и ответов на how to insert into a SQL Server image/binary field - вы должны посмотреть на них.

4

У вас есть несколько проблем с вашим кодом. Я расскажу об этом по очереди:

MemoryStream ms =new MemoryStream(); 
byte[] PhotoByte=null; 
PhotoByte=ms.ToArray(); 
pictureBox1.Image.Save(ms, ImageFormat.Jpeg); 
PhotoByte =ms.ToArray(); 

Хотя это не проблема, здесь у вас есть ненужные задания. Вышеприведенный код может быть более четко написан следующим образом:

MemoryStream ms =new MemoryStream(); 
pictureBox1.Image.Save(ms, ImageFormat.Jpeg); 
byte[] PhotoByte =ms.ToArray(); 

Следующий, следующий код не использует параметры. Всегда, всегда, ВСЕГДА параметризуйте свои SQL-запросы вместо динамического построения SQL. Нет, серьезно, всегда. Да, даже тогда. (Кроме того, что это Str переменная Своего рода повторно используемой переменной экземпляра Не ​​надо этого делать?.)

Str = "insert into Experimmm Values('" + PhotoByte + "','" + textBox1.Text + "')"; 
Conn.Open(); 
cmd.Connection = Conn; 
cmd.CommandText = Str; 
cmd.ExecuteNonQuery(); 
Conn.Close(); 

Вместо этого, он должен быть таким:

Conn.Open(); 
using(SqlCommand cmd = connection.CreateCommand()) 
{ 
    cmd.CommandText = "insert into Experimmm (column list) values(@data, @name)"; 

    cmd.Parameters.Add("@data", SqlDbType.VarBinary).Value = PhotoByte; 
    cmd.Parameters.Add("@name", SqlDbType.VarChar, yourlength).Value = textBox1.Text; 

    cmd.ExecuteNonQuery(); 
} 
Conn.Close(); 

Далее мы перейдите на ваш поиск. Опять же с переменной Str, не делайте этого. Кроме того, вам необходимо также параметризовать этот запрос.

byte[] data; 
string name; 

Conn.Open(); 
using(SqlCommand cmd = Conn.CreateCommand()) 
{  
    cmd.CommandText = "select column_list from Experimmm where id = @id"; 

    cmd.Parameters.Add("@id", SqlDbType.VarChar, field_length).Value = textBox2.Text; 

    using(SqlDataReader dr = cmd.ExecuteReader()) 
    { 
     if (dr.Read()) 
     { 
      data = (byte[])dr.GetValue(0); 
      name = (string)dr.GetValue(1); 
     } 
    } 
} 
Conn.Close(); 

label1.Text = name; 
pictureBox2.Image = Image.FromStream(new MemoryStream(data)); 
+0

спасибо Адам сэр –

1
OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\KUTTY\Real_Project\Royalty_Pro\DbRoyalty_Access\Buzz_Loyalty.mdb"); 
DataSet ds = new DataSet(); 
con.Open(); 
OleDbCommand cmd = new OleDbCommand("select pic from test_table where id_image='123'",con); 
OleDbDataAdapter da=new OleDbDataAdapter(cmd); 
da.Fill(ds,"test_table"); 
//con.Close(); 

//ds = new DataSet(); 
//da.Fill(ds, "test_table"); 
FileStream FS1 = new FileStream("image.jpg", FileMode.Create); 
if (ds.Tables["test_table"].Rows.Count > 0) 
{ 
    byte[] blob = (byte[])ds.Tables["test_table"].Rows[0]["pic"]; 
    FS1.Write(blob, 0, blob.Length); 
    FS1.Close(); 
    FS1 = null; 

    byte[] imageData = (byte[])cmd.ExecuteScalar(); 
    MemoryStream ms = new MemoryStream(imageData, 0, imageData.Length); 
    pictureBox2.Image = Image.FromStream(ms); 



    pictureBox2.Image = Image.FromFile("image.jpg"); 
    pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; 
    pictureBox2.Refresh(); 

    pictureBox2.Image = Image.FromStream(new MemoryStream(blob)); 
    pictureBox2.Image = Image.FromFile("image.jpg"); 
    pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; 
    pictureBox2.Refresh(); 
} 
Смежные вопросы