ذخيره عكس در sql با استفاده از vb.net

mehdirahimi

New Member
سلام،
من مي‌خواستم در Vb.net يك عكس را در Sql ذخيره و بازيابي كنم. لطفا هر كي مي‌دونه من رو راهنمايي كنه.
مرسي
 

m_ziba

Member
سلام
این پرسش در این انجمن خیلی پرسیده شده. اگه یه جستجو می کردی حتماً پیدا می کردی.
-----

اما ... باید آدرس عکس رو در DB ذخیره کنی نه خود عکس رو .
بعد خود عکس رو از طریق متد upload توی اون مسیر قرار بدی.
در مورد upload file در ASP.NET لینک زیر می تونه کمکت کنه البته این c# هست اما به راحتی خودت می تونی رو VB بیاریش:
http://www.codeproject.com/aspnet/fileupload.asp
 

mehdirahimi

New Member
سلام،
مرسي از اينكه جوابمو دادي ولي من مي‌خوام كه خود عكس رو در sql ذخيره كنم.
باور كن كه خيلي search كردم هم در اين Site و هم در Siteهاي ديگه ولي..........
فقط مي‌دونم كه بايد
Dim imgstream As New MemoryStream()
img.Save(imgstream, System.Drawing.Imaging.ImageFormat.Jpeg
با استفاده از كد بالا عكسم رو به صورت يك memorystream ذخيره كنم بعد بايد اين stream رو در يك آرايه‌ايي از نوع بايت ذخيره كنم و بعد اين آرايه رو در SQL ذخيره كنم ولي نمي‌دونم كه چه جوري اين كار رو انجام بدم.
 

fereshte22

Member
سلام
این پرسش در این انجمن خیلی پرسیده شده. اگه یه جستجو می کردی حتماً پیدا می کردی.
-----

اما ... باید آدرس عکس رو در DB ذخیره کنی نه خود عکس رو .
بعد خود عکس رو از طریق متد upload توی اون مسیر قرار بدی.
در مورد upload file در ASP.NET لینک زیر می تونه کمکت کنه البته این c# هست اما به راحتی خودت می تونی رو VB بیاریش:
http://www.codeproject.com/aspnet/fileupload.asp

من این برنامه را به vb.net تبدیل کردم ولی هنوز بعضی قسمت هایش error میدهد.(قسمت هایی که با * مشخص شده.)
میشه لطف کنید یه نگاهی به این برنامه بندازید .خطا هایش را مشخص کنید.
کد:
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
Imports System.IO
Imports System.Data
Imports System.Data.SqlClient

Imports System.Collections
Imports System.ComponentModel
Imports System.Drawing
Imports System.Web.SessionState

Partial Class _Default
    Inherits System.Web.UI.Page
    Protected Overrides Sub OnInit(ByVal e As EventArgs)
        InitializeComponent()
        MyBase.OnInit(e)
    End Sub

    Private Sub InitializeComponent()
        * Me.Load += New System.EventHandler(Me.Page_Load)
       * Me.cmdSend.Click += New System.EventHandler(Me.cmdSend_Click)
    End Sub


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If (Request.QueryString("fileid") <> "") Then
            ShowTheFile(Convert.ToInt32(Request.QueryString("fileid")))
        End If
    End Sub

    Protected Sub cmdSend_Click1(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdSend.Click


        Dim myFile As HttpPostedFile = filMyFile.PostedFile
        Dim nFileLen As Integer = myFile.ContentLength
        If nFileLen > 0 Then
            Dim myData() As Byte = New Byte(nFileLen) {}
            myFile.InputStream.Read(myData, 0, nFileLen)
            Dim strFilename As String = System.IO.Path.GetFileName(myFile.FileName)
           * WriteToFile(Server.MapPath(strFilename), myData)
           
            Dim nFileID As Integer

            nFileID = WriteToDB(strFilename, myFile.ContentType, myData)

            lblInfo.Text = "Filename: " + strFilename + "<br>" + "Size: " + nFileLen.ToString() + "<p>"

            imgFile.ImageUrl = strFilename
            imgFile.ToolTip = "This file was stored to as file."
            lblText1.Text = imgFile.ImageUrl
            imgDB.ImageUrl = GetMyName() + "?fileid=" + nFileID.ToString()
            imgDB.ToolTip = "This file was stored in database."
            lblText2.Text = imgDB.ImageUrl
            imgFile.Visible = True
            imgDB.Visible = True
            lblText1.Visible = True
            lblText2.Visible = True
        End If
    End Sub

    Private Sub WriteToFile(ByRef Buffer As Byte(), ByVal strpath As String)
        Dim newfile As FileStream
        newfile = New FileStream(strpath, FileMode.Create)
        newfile.Write(Buffer, 0, Buffer.Length)
        newfile.Close()
    End Sub

    Private Function WriteToDB(ByVal strname As String, ByVal strType As String, ByRef Buffer As Byte()) As Integer
        Dim nFileID As Integer
        nFileID = 0
        Dim dbConn As SqlConnection
        dbConn = New SqlConnection("Data Source=SEPAHAN-BD5CB18\SQLEXPRESS;Initial Catalog=ssgshop;Integrated Security=True")
        Dim dbAdapt As SqlDataAdapter
        dbAdapt = New SqlDataAdapter("SELECT * FROM kala", dbConn)
        dbAdapt.MissingSchemaAction = MissingSchemaAction.AddWithKey
        Dim dbCB As SqlCommandBuilder
        dbCB = New SqlCommandBuilder(dbAdapt)
        dbConn.Open()
        Dim dbSet As DataSet
        dbSet = New DataSet()
        dbAdapt.Fill(dbSet, "kala")
        Dim dbTable As DataTable
        dbTable = dbSet.Tables("kala")
        Dim dbRow As DataRow
        dbRow = dbTable.NewRow()
        dbRow("FileName") = "D:/Inetpub/wwwroot/FileUpload_demo"
        dbRow("FileSize") = Buffer.Length
        dbRow("ContentType") = strType
        dbRow("picture") = Buffer
        dbTable.Rows.Add(dbRow)
        dbAdapt.Update(dbSet, "kala")
        If Not (dbRow.IsNull("fileid")) Then
            nFileID = dbRow("fileid")
        End If
        dbConn.Close()
        Return (nFileID)
    End Function
    Private Function ShowTheFile(ByVal FileID As Integer)
        Dim sql As String
        sql = "SELECT FileSize, picture, ContentType FROM kala WHERE fileid = " + FileID.ToString()
        Dim dbConn As SqlConnection
        dbConn = New SqlConnection("Data Source=SEPAHAN-BD5CB18\SQLEXPRESS;Initial Catalog=ssgshop;Integrated Security=True")
        Dim dbComm As SqlCommand
        dbComm = New SqlCommand(sql, dbConn)
        dbConn.Open()
        Dim dbRead As SqlDataReader
        dbRead = dbComm.ExecuteReader()
        dbRead.Read()
        Response.Clear()
        Response.ContentType = dbRead("ContentType")
*Response.OutputStream.Write((byte())dbRead("picture"), 0, (int)dbRead("FileSize"));
        dbConn.Close()
        Response.End()

    End Function
    Private Function GetMyName() As String
        Dim strScript As String
        strScript = Request.ServerVariables("SCRIPT_NAME")
        Dim nPos As Integer
        nPos = strScript.LastIndexOf("/")
        If (nPos > -1) Then
            strScript = strScript.Substring(nPos + 1)
        End If
        Return (strScript)
    End Function
End Class
 

ssj

Member
این مشکل من هم هست ... چند روزه که فکرمو مشغول کرده ....
اگه کدشو پیدا کردم به شما هم میدم ،شما هم اگه کدشو نوشتی به من هم بده ...
من البنه می خوام که عکس از طریق وبـــکم گرفنه بشــه ، سپس در دیتابیس sql ذخیره یشه ....
شما هم اگه کدش رو داری برای من و بقیه بذارین .... با تشـــکر .
 

m_ziba

Member
سلام
من Vb.net کار نکردم مشکل شما رو نمی دونم. اما شاید =+ در این زبان وجود نداره. در مرود دو خط دیگه ای هم که گفتی می تونی جستجو کنی ببینی معادلش تو Vb چیه؟ یا اگه کسی می دونه راهنمایی کنه
 

MDP

Well-Known Member
خوب با اجازه

اولا که vb.net یه مشکل کوچیک با =+ داره بهتر از همون روش قدیمی استفاده کنی.

دوما معادل اون هم اینه
کد:
 Dim writer As New System.IO.StreamWriter("Masoud.txt")
        writer.WriteLine("!!!SOME VALUE!!!!")
        writer.Flush()
        writer.Close()
 

fereshte22

Member
دوست عزیز منظورتون از روش قدیمی چیه؟میتونید برام بنویسید.
راستش من این کد را با قسمت converterیک سایت تبدیل کردم.
در مورد راهنمایی دومتون یعنی باید به جای
کد:
Response.OutputStream.Write((byte())dbRead("picture"), 0, (int)dbRead("FileSize"));
از کد زیر استفاده کنم؟
کد:
Dim writer As New System.IO.StreamWriter("picture")
        writer.WriteLine("FileSize")
        writer.Flush()
        writer.Close()
.در ضمن اگه شما یا هر کدام از دوستان یه برنامه با vb.net بفرستند که مسیر عکس را در دیتا بیس وخود عکس را در یک پوشه ذخیره کند ممنون میشوم.
 

ehsan_evil

New Member
واسه ذخیره عکس در دیتابیس با VB از این دستور استفاده کن
البته در ویندوز :

ذخیره در بانک:
برای این کار ابتدا باید یک Stream تعریف میکنیم.


Dim Fs As New System.IO.FileStream("Temp.jpg", IO.FileMode.Create)



آرگومان دوم بستگی به نوع کار، ممکنه تغییر کنه.
اگه یک فایلی رو که (هر فایلی) میخواهید در DB ذخیره کنید، در هارد وجود داره، آرگومان دوم رو باید IO.FileMode.Open انتخاب کنید.
در این مثال میخواهیم محتویات یک PictureBox رو مستقیما در بانک ذخیره کنیم.


PictureBox.Image.Save(Fs, System.Drawing.Imaging.ImageFormat.Jpeg)



سپس باید یک آرایه ای از Byte تعریف کنیم و طول آرایه باید به اندازه محتویات Stream باشد. بعد با خواندن Stream، آرایه رو پر میکنیم.



Dim aArray(CType(Fs.Length, Integer) - 1) As Byte
Fs.Position = 0
Fs.Read(aArray, 0, aArray.Length)
Fs.Close()



و در آخر حتما باید Stream رو ببندیم.
حالا Object مورد نظرمون در یک آرایه ذخیره شده. حالا باید بوسیله یک دستور Insert آرایه رو در بانک ذخیره کنیم. به این صورت عمل مینماییم.
در زمان ساختن دستور INSERT باید فیلدی رو که حاوی Object مورد نظرمونه رو بصورت پارامتری مقدار دهی کنیم.




CommandSQL.CommandText = "INSERT INTO TableName (FieldName) VALUES (@Pic)"
CommandSQL.Parameters.Add("@Pic", aArray)



حالا با اجرا کردن Command، فایل (Object) در بانک ذخیره میشه.

خواندن از بانک:
برای خواندن از بانک، پس از تعریف یک Byte (برای دخیره کردن Object مورد نظر که در بانک وجود دارد) محتویات فیلد حاوی Object مورد نظر رو در این متغیر میریزیم. بعد به روش زیر عمل میکنیم:


Dim Bt() As Byte = CType(ds.Tables(0).Rows(0).Item("Pic"), Byte())
Dim MS As New System.IO.MemoryStream(Bt)
picTShakhs.Image = Image.FromStream(MS)

«برگرفته از مطالب استاد خوبم آقای بابک زواری»
 

جدیدترین ارسال ها

بالا