PDA

View Full Version : سوال: بازیابی عکس از database



sorenamusic
پنج شنبه 29 مهر 1389, 18:05 عصر
سلام دوستان
من به این صورت یک عکس رو در دیتابیس ذخیره کردم


MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrbyte = ms.GetBuffer();
ms.Close();

SqlConnection objConnection1 = new SqlConnection();
objConnection1.ConnectionString = "Data Source=.;Initial Catalog=Album;Integrated Security=True";
SqlCommand objCommand1 = new SqlCommand();
objCommand1.Connection = objConnection1;
 
objCommand1.Parameters.AddWithValue("@image", arrbyte);
string a = "Insert Into picimage(ax) Values(@image)";
objCommand1.CommandText = a;
objConnection1.Open();
objCommand1.ExecuteNonQuery();
objConnection1.Close();


حالا نمی دونم چطوری باید بازیابی کنم.
توی فروم 2 جا جواب دیدم اما وقتی نوشتم جواب نداد .
ممنون میشم بگین چطوری باید این کارو انجام بدم.

shahin_sharifi
پنج شنبه 29 مهر 1389, 21:26 عصر
این کد عکس رو از دیتابیس بازیابی و در مسیر انتخابی شما در دیالوگ باکس ذخیره میکنه:

void SavePhoto(){
System.Data.OleDb.OleDbDataReader reader = null;
System.IO.FileStream fileStream = null;
System.IO.BinaryWriter writer = null;
int bufferSize = 1000;

byte[] buffer = new byte[bufferSize];

long startIndex = 0;
long numberOfBytes = 0;

OleDbConnection obj_connect = new OleDbConnection("DataBase Path");


if (saveFileDialog1.ShowDialog() == DialogResult.OK && saveFileDialog1.FileName != "")
{


OleDbCommand cmd = new OleDbCommand("SELECT [photo] FROM MESSAGES WHERE [numbers]=" + ab.dataGridView6.SelectedCells[0].Value);
cmd.Connection = obj_connect;

obj_connect.Open();


reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess );

reader.Read();

fileStream = new System.IO.FileStream(saveFileDialog1.FileName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite);

writer = new System.IO.BinaryWriter(fileStream);


do
{
numberOfBytes = reader.GetBytes(0, startIndex, buffer, 0, bufferSize);
if (numberOfBytes == 0)
{
break;
}
writer.Write(buffer, 0, (int)numberOfBytes);
startIndex += numberOfBytes;

} while (true);
writer.Flush();
}
}

sorenamusic
پنج شنبه 29 مهر 1389, 21:50 عصر
دوست عزیز
من میخوام شماره ی عکس رو که توی دیتابیس کلید هست رو توی یک textbox وارد کنم
و بر اون اساس برم توی جدول برگردم و عکس رو پیدا کنم .
تا اینجا که موردی نداره .
اما من عکسی رو که به شیوه بالا ذخیره کردم رو چطوری توی
picturebox1.image قرار بدم ؟


من نمی خوام از dialog استفاده کنم . لطفا طریقه ی تبدیل اطلاعات ذخیره شده در بانک به image کمک کنید
ممنون

shahin_sharifi
جمعه 30 مهر 1389, 00:53 صبح
به این صورت میشه:


void GetPhoto()
{
System.Data.OleDb.OleDbDataReader reader = null;
System.IO.FileStream fileStream = null;
System.IO.BinaryWriter writer = null;
int bufferSize = 1000;

byte[] buffer = new byte[bufferSize];

long startIndex = 0;
long numberOfBytes = 0;

OleDbConnection obj_connect = new OleDbConnection("DataBase Path");




OleDbCommand cmd = new OleDbCommand("SELECT [photo] FROM MESSAGES WHERE [id]="Your id selected";

obj_connect.Open();


reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess );
reader.Read();



do
{
numberOfBytes = reader.GetBytes(0, startIndex, buffer, 0, bufferSize);
if (numberOfBytes == 0)
{
break;
}
startIndex += numberOfBytes;

} while (true);

MemoryStream ms = new MemoryStream(buffer);
Image returnImage = Image.FromStream(ms);
picturebox1.image = returnImage;


}

sorenamusic
جمعه 30 مهر 1389, 02:41 صبح
اینجا error داره

reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess );

sorenamusic
جمعه 30 مهر 1389, 04:04 صبح
اینطور که search کردم.
این کد برای sql جواب نمی ده .
تغییرات رو که انجام بدیم و بر حسب sql بنویسیم error میده

shahin_sharifi
جمعه 30 مهر 1389, 11:40 صبح
این رو من الان نوشتم تست هم کردم درسته:



SqlConnection Connection1 = new SqlConnection();
SqlCommand Command1 = new SqlCommand();
SqlDataAdapter DataAdapter1 = new SqlDataAdapter();
DataSet DataSet1 = new DataSet();

private void button4_Click(object sender, EventArgs e)
{
Command1.CommandText = "SELECT * FROM MyTable1";
Command1.Connection = Connection1;
DataAdapter1.SelectCommand = Command1;
DataSet1.Clear();
DataAdapter1.Fill(DataSet1);
dataGridView1.DataSource = DataSet1.Tables[0];
}

private void Form1_Load(object sender, EventArgs e)
{
Connection1.ConnectionString = "SERVER=(Local);Initial Catalog=MyBank;Integrated Security=True";
Connection1.Open();
}

private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{


MemoryStream Memory = new MemoryStream();
byte[] ByteArray1 = (byte[])dataGridView1.Row [e.RowIndex].Cells[0].Value;
Memory.Write(ByteArray1, 0, ByteArray1.Length);
pictureBox2.Image = Image.FromStream(Memory);
}

sorenamusic
جمعه 30 مهر 1389, 17:25 عصر
byte[] ByteArray1 = (byte[])dataGridView1.Row [e.RowIndex].Cells[0].Value;

سلام
دست شما درد نکنه .
درست بود و اجرا شد . میشه این خط رو توضیح بدید؟
با این کد من باید حتما یک datagridview داشته باشم . در حالی که نمیخوام داشته باشم.
فقط یک textbox که شماره را وارد کنم و عکس رو توی picturebox نمایش بده .
آیا راهی هست که از datagrid استفاده نشه؟

shahin_sharifi
جمعه 30 مهر 1389, 23:29 عصر
نه لزومی نداره از گرید استفاده کنید, بلکه همون دیتا رو در یک DataRow میریزید و در پیکچر باکس نشون میدید:

SqlConnection Connection1 = new SqlConnection();
SqlCommand Command1 = new SqlCommand();
SqlDataAdapter DataAdapter1 = new SqlDataAdapter();
DataSet DataSet1 = new DataSet();
DataTable dt = new DataTable();

private void button4_Click(object sender, EventArgs e)
{
Command1.CommandText = "SELECT * FROM MyTable1 WHERE ID="+textbox.text;
Command1.Connection = Connection1;
DataAdapter1.SelectCommand = Command1;
DataSet1.Clear();
DataAdapter1.Fill(DataSet1);
DataRow dr = DataSet1.Tables[0].Rows[0];
MemoryStream Memory = new MemoryStream();
byte[] ByteArray1 = (byte[])dr["ColumnName"];
Memory.Write(ByteArray1, 0, ByteArray1.Length);
pictureBox2.Image = Image.FromStream(Memory);

}

private void Form1_Load(object sender, EventArgs e)
{
Connection1.ConnectionString = "SERVER=(Local);Initial Catalog=MyBank;Integrated Security=True";
Connection1.Open();
}