簡體   English   中英

如何從SQL Server表讀取圖像數據(存儲Word文檔)並將其保存到本地文件夾

[英]How to Read Image Data (storing word document) from SQL Server Table and save it to local folder

我想提取在SQL中存儲為圖像類型字段的Word文檔,並將每個文檔保存在本地文件夾中。 存儲在sql中的圖像類型數據中的doc文件是經過特殊編碼的OLEObjects。 我先嘗試一個,但我需要對表中的每個記錄執行相同的操作。 到目前為止,這是我所做的:

Byte[] bytData = null;
string constring = @"mystirngconnection";

 SqlCommand command = new SqlCommand(@"SELECT LongDescription FROM SuUserReport 
                                WHERE ProductId = 53 AND UserReportId = 31525");

 command.CommandType = CommandType.Text;

 SqlConnection myconn = new SqlConnection(constring);

 command.Connection = myconn;

 myconn.Open();

 using (SqlDataReader dr = command.ExecuteReader())
  {
    while (dr.Read())
     {
       bytData = (byte[])dr["LongDescription"];
     }
  }

if (bytData != null)
 {
      FileStream fs = new FileStream("C:\\Temp\\Test1.doc", 
                                     FileMode.OpenOrCreate, FileAccess.Write);

                    BinaryWriter br = new BinaryWriter(fs);
                    br.Write(bytData, 0, bytData.Length);
                    fs.Dispose();
 }

我基本上有兩個問題:

  • 讀取此類數據非常慢
  • 使用上面的代碼可用於普通的Word文檔,但是我表中的信息具有OLEObject編碼的信息,該代碼保存了Word文檔,但該信息僅是編碼的字符

以前,使用鏈接到longDescription圖像類型字段的訪問綁定對象框架打開表單時,這些圖像(Word文檔)從SQL處直接打開。 用戶可以通過雙擊該特殊框架來編輯文檔。 以下代碼將打開文檔並使其可用於保存更改:

    With oleLongDescription
        .Verb = acOLEVerbOpen 'In a separate window
        .Action = acOLEActivate
    End With

請問有人能幫我解決這個問題嗎? 我不介意使用c#或vb,只要它可以工作=)。

這是我用來打開Blob的代碼。 byte [] myarray是數據庫中的blob字段,fileext是您正在創建的文件的擴展名,filename是您為其指定的名稱。 它將刪除該名稱的所有先前文件。

 public static string Openfilefrombyte(byte[] myarray, string fileext, string filename)
    {
        Computer myComputer = new Computer();

        string filenamef = myComputer.FileSystem.SpecialDirectories.Temp + @"\" + filename + "." + fileext;
        if (File.Exists(filenamef))
        {
            File.Delete(filenamef);
        }

        //save to file and open
        FileStream myfs = new FileStream(filenamef, FileMode.CreateNew);

        myfs.Write(myarray, 0, myarray.Length);
        myfs.Flush();
        myfs.Close();

        myfs = null;
        Process.Start(filenamef);

        return "OK";

    }

我基本上有兩個問題:

讀取此類數據非常慢

答案:是,它運行緩慢,但是如果將Image在sql數據庫中另存為VarBinary,它將很快。

我正在使用OpenFileDialog1帶來圖像或您想要的圖像(Rar,Pdf .World ...)

  If OpenFileDialog1.ShowDialog = DialogResult.OK Then
            Try
                T4.Text = OpenFileDialog1.FileName
                T5.Text = Path.GetExtension(OpenFileDialog1.FileName)
                T7.Text = Path.GetFileNameWithoutExtension(OpenFileDialog1.FileName)
            Catch ex As Exception
            End Try
        End If

在這里,我使用我的代碼將數據保存到我的Sql數據庫中:

 Dim SQLCON As New SqlConnection(MyDataBaseCon)
 Dim CMD As SqlCommand
 Try
        CMD = New SqlCommand("Insert Into TBLAtach (ID,AtachName,AtachMain,AtachFile,AtachNM,AtachDT,AtachAdres) Values (@ID,@AtachName,@AtachMain,@AtachFile,@AtachNM,@AtachDT,@AtachAdres)", SQLCON)
        SQLCON.Open()
        CMD.Parameters.Add(New SqlParameter("@ID", SqlDbType.Int)).Value = Val(T1.Text)
        CMD.Parameters.Add(New SqlParameter("@AtachName", SqlDbType.Int)).Value = Val(T2.Text)
        CMD.Parameters.Add(New SqlParameter("@AtachMain", SqlDbType.Int)).Value = Val(T3.Text)
        Dim FSTream As New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read)
        Dim BNStream As New BinaryReader(FSTream)
        Dim FAttach() As Byte = BNStream.ReadBytes(BNStream.BaseStream.Length)
        CMD.Parameters.Add(New SqlParameter("@AtachFile", SqlDbType.VarBinary)).Value = FAttach
        CMD.Parameters.Add(New SqlParameter("@AtachNM", SqlDbType.NVarChar, 50)).Value = T5.Text
        CMD.Parameters.Add(New SqlParameter("@AtachDT", SqlDbType.NVarChar, 50)).Value = TD1.Text
        CMD.Parameters.Add(New SqlParameter("@AtachAdres", SqlDbType.NVarChar, 250)).Value = T7.Text
        CMD.ExecuteNonQuery()
        SQLCON.Close()
        FSTream.Close()
        BNStream.Close()
        MsgBox("Ok ", MsgBoxStyle.Information)
        SearchID()
        ClearTxT()
    Catch ex As Exception
        MsgBox(ex.Message)
        SQLCON.Close()
        WaitPic.Visible = False
    End Try

使用上面的代碼,保存Word文檔,但信息僅是編碼字符

答案:要檢索數據(圖像,Pdf,RAR等),我正在使用此代碼:

   Try
        ItDataset.Clear()
        Flt = "Select ID ,  AtachAdres + AtachNM AS 'Fname' , AtachFile from TBLAtach where ID = " & T1.Text & ""
        ItDataset = GeneralDataManager.InquireData(ItDataset, Flt, "TBLAtach")
        If Me.BindingContext(ItDataset, "TBLAtach").Count > 0 Then
            Dim FName As String = ItDataset.Tables("TBLAtach").Rows(0).Item("Fname")
            Dim FAttach() As Byte = CType(ItDataset.Tables("TBLAtach").Rows(0).Item("AtachFile"), Byte())
            Dim FStream As New FileStream(FName.ToString, FileMode.OpenOrCreate, FileAccess.Write)
            FStream.Write(FAttach, 0, (FAttach.Length))
            Process.Start(FName)
            FStream.Close()
        End If
        WaitPic.Visible = False
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

並將您的連接更改為數據庫連接

我希望這個答案對你有好處。 謝謝 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM