# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  اضافه کردن عکس به دیتابیس اکسس

## art2000ir

من کد اضافه کردن عکس به دیتابیس اکسس رو میخوام البته گشتم کدهای موچوذ با بانک اس کیو ال کار می کنه که تو تبدیل به اکسس ارور میده و مشکلات زیادی داره ممنوم میشم کسی بتونه کمک کنه

----------


## مهدی نان شکری

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

  Dim fs As IO.FileStream = New IO.FileStream("D:\1.gif", IO.FileMode.OpenOrCreate, IO.FileAccess.Read)
        Dim rawData() As Byte = New Byte(fs.Length) {}
        fs.Read(rawData, 0, System.Convert.ToInt32(fs.Length))
        fs.Close()
        OleDbDataAdapter1.InsertCommand.Parameters.Add("im  age", OleDb.OleDbType.VarBinary).Value = rawData
        Me.OleDbConnection1.Open()
        OleDbDataAdapter1.InsertCommand.CommandText = "Insert Into tImages Values(@image)"
        OleDbDataAdapter1.InsertCommand.ExecuteNonQuery()
        MsgBox("Image saved to database")
        Me.OleDbConnection1.Close()

----------


## art2000ir

با تشکر از راهنمائی شما 
من کد شمارو به شکل زیرکار کردم

s3 = "provider=microsoft.jet.oledb.4.0;data source =" + Application.StartupPath + "\db1.mdb; jet oledb:database password=;"
con = New OleDbConnection(s3)
con.Open()
s4 = "select * from regist "
da = New OleDbDataAdapter(s4, con)
da.Fill(ds, "regist")
 
 
 
Dim fs As IO.FileStream = New IO.FileStream("c:\1.jpg", IO.FileMode.OpenOrCreate, IO.FileAccess.Read)
Dim rawData() AsByte = NewByte(fs.Length) {}
 
fs.Read(rawData, 0, System.Convert.ToInt32(fs.Length))
fs.Close()
da.InsertCommand.Parameters.Add("image", OleDb.OleDbType.VarBinary).Value = rawData
Me.con.Open()
da.InsertCommand.CommandText = "Insert Into tImages Values(@image)"
da.InsertCommand.ExecuteNonQuery()
MsgBox("Image saved to database")

اما ارور میده 
من تیبلم یک فیلد از نوع oleb هستش به نام picture در تیبل regist از دیتابیس db1
حالا نمیدونم اشکال کحاست 
امکان اضافه کردن از طریق دیتاست نیستش ؟

----------


## saeed_rezaei

Dim ms AsNew MemoryStream
PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
 
Dim arrImage() AsByte = ms.GetBuffer
ms.Close()
 

Dim isConnecting AsBoolean = True
Dim imageStream As MemoryStream = New MemoryStream()
 
While isConnecting
Try

Dim northwindConnection AsNew OleDbConnection(connectionstring)
Dim strSQL AsString = _
"INSERT INTO table1 (img)" & _
"VALUES (@image)"
Dim cmd AsNew OleDbCommand(strSQL, northwindConnection)
With cmd

.Parameters.Add(New OleDbParameter("@image", arrImage)) '.Value = arrImage
EndWith

northwindConnection.Open()
cmd.ExecuteNonQuery()
northwindConnection.Close()
isConnecting = False
MessageBox.Show(arrFilename(0) & " saved to the database.", _
"Image Save Status", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
Catch sqlExc As OleDbException
MessageBox.Show(sqlExc.ToString, "SQL Exception Error!", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
ExitWhile
Catch exc As Exception
EndTry
EndWhile

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

----------


## art2000ir

ممکنه بگین اسم دیتابیس ،جدول ، فیلد بانک شما چیه که من بتونم عوض کنم و کچای این کد شما به بانک متصل میشید ؟
ایا جدول باید دارای یک فیلد باشد ؟یا می توان فیلدهای متعدد داشت و عکس را به یک فیلد مشخص نسبت داد ؟
در ضمن این کد مربوط به بانک اسکیو ال هست ؟

----------


## مهدی نان شکری

با سلام 
می بخشید کمی دیر جواب می دم
اگه مشکلتون حل نشده می شه پیغام خطا رو بنویسید؟

----------


## saeed_rezaei

> ممکنه بگین اسم دیتابیس ،جدول ، فیلد بانک شما چیه که من بتونم عوض کنم و کچای این کد شما به بانک متصل میشید ؟
> ایا جدول باید دارای یک فیلد باشد ؟یا می توان فیلدهای متعدد داشت و عکس را به یک فیلد مشخص نسبت داد ؟
> در ضمن این کد مربوط به بانک اسکیو ال هست ؟


سلام
این رو من برای بانک اطلاعاتی اکسس کار کردم. مشکلی نداره. البته بازیابیش رو نمی دونم می تونید انجام بدید یا نه. 
اسم بانک اطلاعاتی رو توی کانکشن استرینگ می یارید و البته من اینجا تعریف نکردم. من فقط cn رو تعریف کردم که نماینده همون کانکشن استرینگ هست. رشته اتصال من اینه:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=I:\db1.mdb"

اسم بانک اطلاعاتی در رشته بالا مشخصه.
Data Source=I:\db1.mdb

اگه هم در کد زیر دقت کنی مبینی که اسم جدول table1 هست. می تونی اسم جدول خودت رو بنویسی.  نام فیلد هم img  هستش. من برای شفافیت مثال، فقط یه فیلد در نظر گرفتم. شما می تونید هر چند تا که بخواید اضافه کنید. فقط باید نوع فیلد عکستون رو ole در نظر بگیرید که مثل اینکه همین کار رو هم کرده اید. 
این مثال رو من قبلا برای sql نوشته بودم اما چون وقت نداشتم، خیلی سریع تغییراتی توش دادم که با اکسس کار می کنه اگه به استرینگ دقت کنی متوجه می شی. 
اما اگه جایی از کلمه sql نام بردم، دقت کنید متوجه می شید که فقط یه رشته بوده و نه چیز دیگه.
اصلا اجازه بده کد رو شفاف تر واست بنویسیم. 

PrivateSub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click

 
Dim ms AsNew MemoryStream
PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
Dim arrImage() AsByte = ms.GetBuffer
 
ms.Close()
 
Dim isConnecting AsBoolean = True
Dim imageStream As MemoryStream = New MemoryStream()
While isConnecting
   Try

      Dim Connection AsNew OleDbConnection(connectionstring)
      Dim str_insert AsString = _
      "INSERT INTO table1 (img)" & _
      "VALUES (@image)"
 
 
     Dim cmd AsNew OleDbCommand(str_insert, Connection)
cmd.Parameters.Add(New OleDbParameter("@image", arrImage)) '.Value = arrImage

   Connection.Open()
   cmd.ExecuteNonQuery()
   Connection.Close()

   
  isConnecting = False
 
   msgbox ("image saved")
 
  Catch Exc As OleDbException
                 MessageBox.Show(Exc.ToString, " Exception Error!", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)
  ExitWhile
      Catch exc As Exception

    EndTry
 EndWhile
EndSub

----------


## art2000ir

با تشکر از همه دوستان 
مشکل من خل شد و انشاالله راهی که استفاده کردم (که البته دوستان کمک کردند)را برای دوستان می نویسم البته بدون کوئری وبا دیتاست که بازیابی هم اسان باشد

----------


## __H2__

سلام
کد سورس تحت به دو زبان VB و #C با اتصال به اکسس و تحت وب:
http://www.h-two.info/Download.aspx?...timeImages.zip

----------


## art2000ir

این کد برای اضافه کردن عکس به دیتابیس اکسس از طریق دیتاست 
لازم به ذکر است که تمام این کد توسط دوستان در این تاپیک و تاپیک های دیگز نوشته شده و من صرفا کدها را برای برنامه خودم مرتب کردم(بابا حق کپی رایت  :چشمک:  ) 




Imports System.Data
Imports System.Data.OleDb
Public Class Form1
  Dim con, con2 As OleDbConnection
    Dim da, da2 As OleDbDataAdapter
    Dim ds, ds2 As New DataSet
    Dim s1, s2, s3, s4, s5 As String
    Dim newrow, row1, row2 As DataRow
    Dim cb As OleDbCommandBuilder
    Dim adr1, adr2, ograt As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   ‘در این قسمت شما به دیتابیس متصل می شوید اسم دیتابیس gldb.mdb
  ds.Clear()
        s1 = "provider=microsoft.jet.oledb.4.0;data source =" + Application.StartupPath + "\gldb.mdb; jet oledb:database password=;"
        con = New OleDbConnection(s1)
        con.Open()
        s2 = "select * from regist"
        da = New OleDbDataAdapter(s2, con)
        da.Fill(ds, "regist")
 
        newrow = ds.Tables("regist").NewRow
 
‘در این قسمت شما یک پیکچرباکس حاوی یک عکس دارید 
‘فیلدی است که عکس درونش ذخیره می شود temp1       
 Dim fs As New IO.FileStream("adr1", System.IO.FileMode.Create)
        PictureBox1.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg)
        Dim aArray(CType(fs.Length, Integer) - 1) As Byte
        fs.Position = 0
        fs.Read(aArray, 0, aArray.Length)
        newrow.Item("temp1") = aArray
        fs.Close()
‘و در اخر اطلاعات را از دیناست به جدول بر می گردانم 
 
  ds.Tables("regist").Rows.Add(newrow)
        cb = New OleDbCommandBuilder(da)
        da = cb.DataAdapter
        da.Update(ds, "regist")
        MsgBox("اطلاعات ثبت شد")

----------


## zarrin_306

اینم یک پروژه برای شما

----------


## nasser_p

لطفا در مورد عکسی (که از پایگاه select شده )میخواهیم در picturebox قرار دهیم اگر کسی در vb.net اطلاعی دار ه توضیح بده

----------


## art2000ir

منظور اینه که عکس در بانک است یا ادرس عکس ؟

----------


## saeed_rezaei

> لطفا در مورد عکسی (که از پایگاه select شده )میخواهیم در picturebox قرار دهیم اگر کسی در vb.net اطلاعی دار ه توضیح بده


بازیابی تصویر ذخیره شده بستگی داره به نوع ذخیره.
همونطور که دوستمون عزیزمون اشاره کرده اند، دو روش بازیابی وجود دارد. بازیابی تصویری که مسیرش در بانک ذخیره شده و بازیابی تصویری که خودش در بانک ذخیره شده. 
روش اول خیلی سادس. 
کد روش دوم اینجوری هستش.


Dim arrPicture() AsByte = CType(dsPictures.Tables(0).Rows(X)(Y), Byte())
Dim ms AsNew MemoryStream(arrPicture)
With PictureBox2
.Image = Image.FromStream(ms)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.Fixed3D
EndWith
ms.Close()

----------


## m_diamond67

> سلام
> کد سورس تحت به دو زبان VB و #C با اتصال به اکسس و تحت وب:
> http://www.h-two.info/Download.aspx?...timeImages.zip


دوست عزیز دانلود نمی شه.در صورت امکان تو سایت آپلود کنید.
با تشکر

----------


## parsehvb

اولاً اگر تاریخ تاپیک رو ملاحظه می فرمودید متوجه می شدید که علت این امر چیست با این حال برای نمونه این برنامه رو تست کنید

----------


## mohsen200339

سلام
من می خواهم در فرم اکسس دکمه (Buttom) ای را تعریف کنم که با زدن آن پنجره Browsers باز شده و عکسی را انتخاب کرده و آن را در قسمتی از فرم که مشخص کرده ایم نشان دهد و درون اکسس ذخیره شود همچنین دکمه ای برای حذف آن نیز تعریف کنم .
مشابها برای فیلم نیز این کار را انجام دهد به صورتی که فیلم در مکان مورد نظر قرار گرفته و مدیا پلیر آن را اجرا کند . مشابه عکس 
من اطلاعاتی در مورد برنامه نویسی ندارم لطفا به طور کامل راهنمایی کنید .
ممنون

----------


## mreza1983

سلام به همگی
من یه دیتابیس اکسس درست کردم واسه تنظیم فاکتور که توی اون یه Table به اسم فروشنده - یکی به اسم خریدار- و یکی هم به اسم صدور فاکتور تنظیم کردم بعد توی relationships بین خریدار و صدور فاکتور یک ارتباط یک به چند درست کردم و ارتباط بین فروشنده و صدور فاکتور یک به یک هست. یک به چند نمیشه.
بعد یه Query از صدور فاکتور گرفتم و هرسه جدول صدور فاکتور - خریدار و فروشنده رو گذاشتم .حالا که میخوام چند تا فاکتور صادر کنم به تکرار کد فروشنده ایراد می گیره. 
لطفا راهنماییم کنین که چطوری میتونم ارتباط رو یک به چند کنم یا اینکه بتونم یه فروشنده واسه همه فاکتورام به عنوان سربرگ داشته باشم.

----------


## __H2__

سلام



> من می خواهم در فرم اکسس دکمه (Buttom) ای را تعریف کنم که با زدن آن پنجره Browsers باز شده و عکسی را انتخاب کرده


شاید تاپیک زیر کمک کند:
https://barnamenevis.org/showthread.php?p=369669

دانلود مستقیم نمونه کد:
http://support.h02.ir/fwlink/?LinkId=1000198547




> ... ارتباط بین فروشنده و صدور فاکتور یک به یک هست. یک به چند نمیشه.
> ...حالا که میخوام چند تا فاکتور صادر کنم به تکرار کد فروشنده ایراد می گیره.


اگر فیدهای خود را به درستی index و primarykey کنید رابطه درست برقرار خواهد شد.
اگر نیازمند یک رابطه یک به چند هستید، باید primarykey جدول "فروشنده" را به فیلدی غیر primarykey (و ترجیحاً index دار) از جدول "فاکتور" متصل کنید.

برای خطا هم لطفاً متن کامل خطا را به همراه نام و نوع تک تک فیلدهای جدول اینجا قرار دهید تا بتوان بهتر متوجه دلیل خطا شد و کمک دقیقتری کرد.
موفق باشید.

----------


## rasekhi

سلام میشه کد ذخیره و بازیابی عکس در بانک را به زبان C#‎ هم بذارید من خیلی لازم دارم

----------

