ورود

View Full Version : سوال: جستجوی تصویر ذخیره شده در پایگاه داده



teymoorei
دوشنبه 03 مرداد 1390, 10:10 صبح
سلام
دوستان مشکل من دقیقا همون چیزی هست که در عنوان نوشتم (جستجوی تصویر ذخیره شده در پایگاه داده) لطفا کمک کنید پروژم به خاطر این موضوع تعطیله .
راستی توی سایت هم تاجایی که توان داشتم جسجو کردم اما چیزی که به درد من بخوره پیدا نکردم .
من خود تصویر رو توی پایگاه داده ذخیره کردم نه آدرس .
پایگاه داده هم SQL 2008 می باشد .

teymoorei
دوشنبه 03 مرداد 1390, 16:47 عصر
سلام
دوستان لطفا کمک کنید و قعا کارم گیره .

یوسف زالی
دوشنبه 03 مرداد 1390, 16:58 عصر
سلام.
منظورتون از اینکه تصویری رو جستجو می کنید چیه؟
پردازش تصویر؟
یا مثلا اسم تصویر رو می دی می خواهی خودش بیاد؟
یا...

به چه فرمتی ذخیره کردید؟
JPG ?

teymoorei
دوشنبه 03 مرداد 1390, 17:15 عصر
سلام ممنون از توجه تون
ببینید من یه رکورد رو جستجو می کنم ، داخل اون رکورد یک فیل از نوع Image دارم می خوام مثلا وقتی علی تیموری رو جستجو می کنم عکسش رو هم برام بیاره و لازم به ذکره که من این تصاویر رو قبلا ذخیره کردم .
باتشکر

pouyansaraf
دوشنبه 03 مرداد 1390, 18:58 عصر
جدول به نام Table1 با فیلدهای pic و name

Dim con As SqlConnection
Dim com As SqlCommand
Dim adap As SqlDataAdapter
con = New SqlConnection("Data Source=.\;Initial Catalog=نام دیتا بیس;Integrated Security=True;Pooling=False")

برای درج تصویر در sql


Dim image() As Byte = File.ReadAllBytes(picfilename)

com = New SqlCommand("insert into table1 (name,pic) values (@name,@pic)", con)

con.Open()

com.Parameters.AddWithValue("@name", safefilename)

com.Parameters.AddWithValue("@pic", image)

com.ExecuteNonQuery()

con.Close()

برای خواندن تضویر با شرط از sql

Dim mem As New MemoryStream

com.CommandText = "select pic from table1 where name='" & safefilename & "'"

con.Open()

com.Connection = con

Dim image1 As Byte() = com.ExecuteScalar

mem.Write(image1, 0, image1.Length)

PictureBox1.Image = Image.FromStream(mem)

con.Close()

teymoorei
دوشنبه 03 مرداد 1390, 21:08 عصر
سلام
واقعا ممنونم از کمکتون اما نمی دونم چرا میگه مرجع نیست احتمالا من دارم اشتباه کار می کنم .
من خودم یه کد دارم ولی یه مشکل کوچیک دارن ، اگه لغت رو دقیق و درست وارد کنم پیدا می کنه اما اگه کوچکترین اشتباهی بشه از dataset اشکال میگیره .
اینم کد من :
If txtSearch.Text = Nothing Then
Clear()
End If
If txtSearch.Text = String.Empty Then ReloadRecord() : Exit Sub
Dim sqlcmd As String = ""


sqlcmd = "Select * from tblMoshtari where Family like N'%" & txtSearch.Text & "%'"

da = New SqlDataAdapter(sqlcmd, Connection)
dt = New DataTable
da.Fill(dt)

ds = New DataSet()
da.Fill(ds, "tblMoshtari")
Display(ds)

Dim arrPicture() As Byte = CType(ds.Tables(0).Rows(0)("Image"), Byte())

Dim ms As New MemoryStream(arrPicture)

With PictureBox1
.Image = Image.FromStream(ms)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.Fixed3D
End With

DataGridView1.DataSource = dt
اینم خطی که با مشکل رو به رو میشه :
Dim arrPicture() As Byte = CType(ds.Tables(0).Rows(0)("Image"), Byte())
اینم تصویر Error :
72914
ببینید این مشکا فکر می کنم از اینه که من چند تا جول دارم و نمیتونه بره جدول های بعدی .
لطفا ببینید مشکل از چیه

pouyansaraf
سه شنبه 04 مرداد 1390, 00:08 صبح
ببین اصلا مشکل نیست می خوای قدم به قدم بریم جلو

1- این قطعه کد رو بردار اصلا بدردت نمیخوره

If txtSearch.Text = Nothing Then
Clear()
End If

اگر میخواهی چک کنی که اگر در تکس باکست چیزی نباشد بیاید بیرون فقط کد زیر کافیه
If txtSearch.Text = "" Then
Exit Sub
End If

2- قطعه کد زیر را باید در بالای بالای برنامه قبل از public class form1 بنویسی
Imports System.Data.SqlClient

3- مانند عکس اول ضمیمه شده باید دیتا بیست را مثلا اینطور درست کنی ولی بازم دست خودت هست هر فیلد دیگری را نیز میتوانی اضافه کنی

4- دستورات زیر برای استفاده از دیتا بیستون نیاز میشه
Dim con As SqlConnection
Dim com As SqlCommand
Dim adap As SqlDataAdapter

con :انکشنتون است
com: دستورات را مینویسید
adap: آداپتورتون است

5- با دستور زیر با بانکتون ارتباط برقرار کنید

con = New SqlConnection("Data Source=.\;Initial Catalog=نام دیتا بیس;Integrated Security=True;Pooling=False")




در اینجا من نام دیتا بیس رو picture1 گذاشته ام

5- با دستور زیر یک آرایه از بایت به نام image درست میکنید که عکستون را در آن میریزید
میتوانید از openfiledialog استفاده کنید و یا آدرس یک عکس را بدهید
حتما Imports System.IO را به اول صفحه اضافه کنید تا بتوانید از دستور file استفاده کنید
Dim image() As Byte = File.ReadAllBytes(picfilename)


6- با دستورات زیر یک رکورد با فیلد های اسم عکس و خود عکس که از نوع آرایه است در دیتا بیس میریزسد
com = New SqlCommand("insert into table1 (name,pic) values (@name,@pic)", con)

con.Open()

com.Parameters.AddWithValue("@name", safefilename)

com.Parameters.AddWithValue("@pic", image)

com.ExecuteNonQuery()

con.Close()

در اینجا از پارامتر استفاده کرده ام اگر از openfiledialog استفاده کرده باشید safefilename فقط اسم فایل را به شما میدهد که راحتر است
executenonquery هم برای دستور inserto هست
و بعدش دیتا بیستون را میبندید

--------------------------------------------
حال برای خواندن عکس کارهای مختلفی میتوانید انجام دهید
در زیر اولین جایی که اسم فایل با شرط where ما یکی شد برمیگرداند
شما میتوانید مثلا کلید اصلی درست کنید و اسم منحصر به فردی برای آن انتخواب کنید
بازم با نظر خودتون مختلف است
برای خواندن

1- یک متغیر با نام mem درست میکنیم که وقتی آرایه ای از بایت ها را خواند در آن بریزد
Dim mem As New MemoryStream


2- دیتا بیستون را باز میکنید
com.CommandText = "select pic from table1 where name='" & txtSearch & "'"

توجه که نام جدول ما table1 است و با دستور where name میگوییم هر چیزی که اسمش در تکس باکسی با نام txtsearch بود را برگرداند
در اینجا میتوانید شرط و یا try بگذارید که اگر اشتباه بود پیغام مناسب را بدهد
3- با دستورات زیر دیتا بیست را باز میکنی
con.Open()

com.Connection = con


4- با دستور زیر اولین عکس را با نام txtsearch در image1 میریزی
Dim image1 As Byte() = com.ExecuteScalar


5- با این دستور image1 را که به صورت آرایه ای از بایت ها هست در حافظه و متغیر memمیریزی
mem.Write(image1, 0, image1.Length)

6- با دستور زیر mem را که همان عکس ما در حافظه است به صورت عکس کرده و در picturebox1 میریزیم و دیتا بیس را میبندیم
PictureBox1.Image = Image.FromStream(mem)

con.Close()

teymoorei
سه شنبه 04 مرداد 1390, 00:14 صبح
سلام
فایده ای نداشت باز همون طوره .

pouyansaraf
سه شنبه 04 مرداد 1390, 00:56 صبح
برنامه ات را rar کن بفرست

pouyansaraf
سه شنبه 04 مرداد 1390, 01:31 صبح
میخواهی عکس در gridview باشد؟

teymoorei
سه شنبه 04 مرداد 1390, 01:47 صبح
متوجه منظورتون نمی شم اما من می خوام عکس رو همراه با بقیه ی فیلد ها بعد از جستجو داخل فرم نشون بدم همین .
راستی اگه ممکنه کدی که من خودم گذاشتم رو یه نگاه بکنید .
ممنون از لطفتون

pouyansaraf
سه شنبه 04 مرداد 1390, 01:55 صبح
خوب این پست آخرم همون کد شماست دیگه
خوب نگاه کن
الکی کدتو شلوغ مردی واسه چی ؟

teymoorei
سه شنبه 04 مرداد 1390, 02:11 صبح
باز از این خط Error میگیره :
Dim arrPicture() As Byte = Command.ExecuteScalar
اینم Error برنامه : Object reference not set to an instance of an object.

Alirezanet
سه شنبه 04 مرداد 1390, 02:44 صبح
سلام یه پروژه براتون گذاشتم با کد خودتون مقایسش کنید ببینید مشکل از کجاست ... فقط Connection String رو حتما تغییر بدین !
نکته : سعی کردم کاملا مشابه خودتون کد بزنم تا راحت تر متوجه مشکل بشید.
پیشنهاد : در ضمن 1 پیشنهاد هم دارم ... این روش برنامه نویسی رو من توضیه نمیکنم ... (استفاده از SqlClient) بدون برنامه نویسی 3لایه ... اگه قراره مستقیم توی برنامتون کدهاتون رو بنویسید از Framework های Microsoft استفاده کنید که هم راحت تره و هم سریع تر !مطمئن هم هست!
مثل entity framework و linq to sql !



اول دکمه save رو بزنید و یه فایل رو ذخیره کنید بعد اسم فایل رو تو Textbox بنویسید و Load کنید !
موفق باشید

لینک دریافت فایل : 1 (https://skydrive.live.com/?cid=1c30a4434ab7dd86&sc=documents&uc=1&id=1C30A4434AB7DD86%21321#) , ویا 2 (https://skydrive.live.com/?cid=1c30a4434ab7dd86#!/?cid=1c30a4434ab7dd86&sc=documents&uc=1&id=1C30A4434AB7DD86%21321)
حجم : 2.6 mg
چون حجمش زیاد بود توی drive خودم upload کردم !
Alirezanet

teymoorei
سه شنبه 04 مرداد 1390, 10:07 صبح
سلام
اینکه باز Error میده دیگه دارم دیونه میشم به خدا هر کاری میکنم راه نمیفته .
از این خط Error میگیره :
mem.Write(x, 0, x.Length)
اینم خطاش:
Object variable or With block variable not set.
راستی اگه برنامه رو با پروژه ی خودتون اجرا کنم Error های زیر رو میده .
http://dc400.4shared.com/img/LB2isql6/s3/0.9339860803150783/error.png

teymoorei
سه شنبه 04 مرداد 1390, 10:29 صبح
دوستان اگه میتونید کدی که من خودم گذاشتم رو دوباره ببینید .
وقتی من کد رو داخل Try قرار میدم کار میکنه اما وقتی از Try در میارم پیغم زیر رو میده :

72931

اینم کدی که من استفاده می کنم :

Dim sqlcmd As String = ""
sqlcmd = "Select * from tblMoshtari where Family like N'%" & txtSearch.Text & "%'"
da = New SqlDataAdapter(sqlcmd, Connection)
dt = New DataTable
da.Fill(dt)
ds = New DataSet()
da.Fill(ds, "tblMoshtari")
Display(ds)
Dim arrPicture() As Byte = CType(ds.Tables(0).Rows(0)("Image"), Byte())
Dim ms As New MemoryStream(arrPicture)
With PictureBox1
.Image = Image.FromStream(ms)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.Fixed3D
End With

Alirezanet
سه شنبه 04 مرداد 1390, 13:08 عصر
احتمالا دیتاستتون خالیه .... یه دیباگ کنید ببینید چرا رکوردی توش نیست !
فکر میکنم به این دلیل که شما دیتاستتون رو New کردید!

کدتون رو اگه خط به خط کنترل کنید متوجه مشکل میشید!


وقتی من کد رو داخل Try قرار میدم کار میکنه اما وقتی از Try در میارم پیغم زیر رو میده
این مشکل زمانی پیش میاد که کد اضافه ای تو برنامه باشه که اررور تولید کنه .... try باعث میشه اون اجرا نشه و برنامه ادامه پیدا کنه !


راستی اگه برنامه رو با پروژه ی خودتون اجرا کنم Error های زیر رو میده .
من دوباره تست کردم اررور نداد!! (اررور میده اگه اسم فایل رو کامل ندی بهش با پسوند (.jpg)!) اسم فایل رو از دیتابیس ببین مطمئن شی !

teymoorei
سه شنبه 04 مرداد 1390, 16:19 عصر
کارنمی کنه هر کاری می کنم درست نمیشه ، من بی خیال این مشکل شدم و توی try برنامه رو اجرا می کنم اما باز تو Table بعدی اصلا کار نمی کنه .

مشکل اصلی هم توی این خطه :
(ds.Tables(0).Rows(0)("Image"), Byte())
کمک کنید لطفا

salehbagheri
سه شنبه 04 مرداد 1390, 19:21 عصر
دوست عزیز! مثل روز روشنه که جدول مورد نظر خالیه یا سلولی به نام Image نداره! اون کدی که شما نوشتی کاملاً اشتباهه!

دوستان روش استخراج تصویر رو براتون گفتند! احتمالاً مشکل از دیتابیس شماست!

teymoorei
سه شنبه 04 مرداد 1390, 20:30 عصر
نه من می دونم که جدول پره چون اگه از Try استفاده کنم عکس رو نشون میده .
ببینید این کد نمیتونه به جدول مورد نظر من بره همین .

Alirezanet
سه شنبه 04 مرداد 1390, 22:16 عصر
نه من می دونم که جدول پره چون اگه از Try استفاده کنم عکس رو نشون میده .
ببینید این کد نمیتونه به جدول مورد نظر من بره همین .
Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged
Try
If txtSearch.Text = "" Then
Exit Sub
End If
If txtSearch.Text = String.Empty Then ReloadRecord() : Exit Sub
Dim sqlcmd As String = ""
sqlcmd = "Select * from tblProgram where Name like N'%" & txtSearch.Text & "%'"
da = New SqlDataAdapter(sqlcmd, Connection)
dt = New DataTable
da.Fill(dt)
ds = New DataSet()
da.Fill(ds, "tblProgram")
Display(ds)
Dim arrPicture() As Byte = CType(ds.Tables(0).Rows(0)("Image"), Byte())
Dim ms As New MemoryStream(arrPicture)
With PictureBox1
.Image = Image.FromStream(ms)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.Fixed3D
End With
DataGridView1.DataSource = dt
کدهاتون رو که برام ایمیل کردید رو خوندم ... شما اومدید و کدهاتون رو در رویداد TextChange تکست باکس نوشتید ... مسلمه که باید اررور بده !
چون زمانی که میخواید اسم فایل رو بنویسید بعد از تایپ اولین حرف اون کدتون اجرا میشه و چون رکوردی پیدا نمیکنه اررور میده !!
به همین دلیل هست که وقتی از Try استفاده میکنید اون اررورها رد میشن تا جایی که فایل مورد نظرتون از دیتابیس پیدا شه !
توی این مورد استفاده از Try صحیح نیست در این Event یعنی TextChange ! چون با تایپ هر حرف شما میرید یه سرچ توی دیتابیس میزنید ....
کدتون رو منتقل کنید به یک Button به عنوان سرچ تا اون این کار رو براتون انجام بده !
موفق باشید

teymoorei
چهارشنبه 05 مرداد 1390, 12:10 عصر
آی خداااااا این مشکلش کجاست ؟:گریه::گریه:

72966

pouyansaraf
چهارشنبه 05 مرداد 1390, 13:12 عصر
یه سوال تا حالا با دیتا بیس کار کرده اید یا این اولین برنامه تون هست
بابا با این همه توضیحات بازم مشکل دارید

salehbagheri
چهارشنبه 05 مرداد 1390, 13:13 عصر
دوست عزیز! برای رفع مشکل پروژه خودتون رو اینجا قرار بدید! در غیر این صورت پستهای بعدی شما به دلیل عدم تشریح مناسب سوال، Spam تلقی خواهد شد!

teymoorei
چهارشنبه 05 مرداد 1390, 13:23 عصر
سلام
ظاهرا باید یک توضیحی بدم که من با vb6 کار میکردم و تازه وارد محیط دانت نت شدم .
از همه ی دوستان هم ممنونم که کمک کردن اما تمام مشکل من همون چیزی هست که توی تصویر مشاهده کردید همین و بس .
درضمن پروژه ی من 35 mg حجم داره بعلاوه کلی کامپوننت ، به همین دلیل نمی تون اینجا بزارمش .
فقط فرمی که مشکل داره رو میزارم تا دوستان ببینند .
دانلود (http://www.4shared.com/get/FXSkvc7A/Form.html)

salehbagheri
چهارشنبه 05 مرداد 1390, 16:04 عصر
دوست عزیز من کد شما رو امتحان کردم و بدون هیچ مشکلی عملیات نمایش تصویر انجام شد!

100 در 100 مشکل از دیتابیس شماست! یا ستونی به نام Image ندارید یا ستون خالیه!

Alirezanet
چهارشنبه 05 مرداد 1390, 17:13 عصر
Dim arrPicture() As Byte = CType(ds.Tables(0).Rows(0)("Image"), Byte
این خط از کدتون رو اینجوری بنویسید شایدمشکل حل شه !
Dim field = ds.Tables(0).Rows(0)("Image")
if field isnot nothing then
Dim arrPicture() As Byte = field
With PictureBox1
.Image = Image.FromStream(ms)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.Fixed3D
End With
End if

teymoorei
پنج شنبه 06 مرداد 1390, 01:22 صبح
سلام
دوستان بازم کار نکرد و همون مشکل رو داره .
اینم کد برنامه با تغییرات جدید :
If txtSearch.Text = "" Then
Exit Sub
End If
If txtSearch.Text = String.Empty Then ReloadRecord() : Exit Sub
Dim sqlcmd As String = ""
sqlcmd = "Select * from tblProgram where id like N'%" & txtSearch.Text & "%'"
da = New SqlDataAdapter(sqlcmd, Connection)
dt = New DataTable
da.Fill(dt)
ds = New DataSet()
da.Fill(ds, "tblProgram")
Display(ds)

Dim field = ds.Tables(0).Rows(0)("Image")
If field IsNot Nothing Then
Dim arrPicture() As Byte = field
Dim ms As New MemoryStream(arrPicture)
With PictureBox1
.Image = Image.FromStream(ms)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.Fixed3D
End With
End If
DataGridView1.DataSource = dt

من چک کردم هم فیلد هست هم اطلاعات داخلش ذخیره شده .
اما دیگه بی خیالش شدم ولش کنید همون طور برنامه رو میدم دست مشتری .
درپناه حق