Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从SQL Server表中读取图像数据(存储word文档)并将其保存到本地文件夹_C#_Sql Server_Vb.net - Fatal编程技术网

C# 如何从SQL Server表中读取图像数据(存储word文档)并将其保存到本地文件夹

C# 如何从SQL Server表中读取图像数据(存储word文档)并将其保存到本地文件夹,c#,sql-server,vb.net,C#,Sql Server,Vb.net,我想提取存储为SQL中图像类型字段的word文档,并将每个文档保存在本地文件夹中。存储在sql中图像类型数据中的文档文件是特殊的编码对象。 我首先尝试使用一条,但我需要对表中的每条记录执行相同的操作。这就是我到目前为止所做的: Byte[] bytData = null; string constring = @"mystirngconnection"; SqlCommand command = new SqlCommand(@"SELECT LongDescription FROM SuU

我想提取存储为SQL中图像类型字段的word文档,并将每个文档保存在本地文件夹中。存储在sql中图像类型数据中的文档文件是特殊的编码对象。 我首先尝试使用一条,但我需要对表中的每条记录执行相同的操作。这就是我到目前为止所做的:

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文档,但是我的表中的信息包含对象编码信息,代码保存word文档,但信息仅为
以前,当使用链接到longDescription图像类型字段的Access绑定对象框打开表单时,这些图像(word文档)直接从SQL打开。用户可以通过双击此特殊框架来编辑文档。以下代码打开文档并使其可用于保存更改:

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

有谁能帮我解决这个问题吗?我不介意使用c#或vb,只要它能工作=)。

以下是我用来打开blob的代码。byte[]myarray是数据库中的blob字段,fileext是您正在创建的文件的扩展名,文件名是您为其指定的名称。它将删除此名称以前的任何文件

 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";

    }

我基本上有两个问题:

读取这种类型的数据非常慢

答:是的,速度很慢,但如果将图像以VarBinary格式保存在sql数据库中,速度会很快

我使用OpenFileDialog1带来图像或你想要的东西(Rar,Pdf.World…)

这里是我的代码,我使用它在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
并将连接更改为数据库Con连接

我希望这个答案对你有好处。
谢谢。

的可能重复您是否尝试使用其他文件以确保文件未损坏?OLEObjects的问题在于它们不是合适的Word文件,而是具有额外页眉和页脚的Word文件。本文解释了导出的“word文件”无法打开的原因,并给出了一些有关查找位置的提示:谢谢Alex是的,我发现它们是存储在sql中图像列中的对象,而不是普通的word文档,这就是为什么其他人可以用c#或vba直接读取他们的文件,但我不能,我需要使用这个可怕的ole对象以某种方式获取信息。非常感谢您的链接,它看起来非常类似于我试图实现的=)。谢谢Haim,我保存文件没有问题。问题是字节或数据是经过编码的。我还使用控制台应用程序,因此没有FileSystem.SpecialDirectories.Temp=(很明显,你可以使用你想要的任何目录而不是临时目录,但是你的主要问题是将所有的OleObject转换为word对象。我建议你添加这些标记词,也许你可以得到一些帮助。谢谢Aladein,你在使用Crystal reports吗?请原谅我的无知,但我不理解你的代码=(.我不确定你的代码将如何发挥作用,显示信息而不是编码信息。也许我没有很好地解释我自己。不..我没有使用Crystal reports..这是vb.net代码。这是我使用它的最后一个项目。(存档项目)谢谢Aladein我在上面解释了一点=)
   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