none
我们知道,在从数据库中读取Image字段的二进制数据时, 可以用Byte[]设定大小分次写入到文件流中,读取完毕后 就是一个完整文件了.....可是,把文件分段读取到Image 字段中,怎么办呢? RRS feed

  • 问题

  • 我们知道,在从数据库中读取Image字段的二进制数据时, 可以用Byte[]设定大小分次写入到文件流中,读取完毕后 就是一个完整文件了.....可是,把文件分段读取到Image 字段中,怎么办呢?
    2011年4月13日 16:55

答案

  • 大文件建议你保存到硬盘上,数据库中记录路径,否则后期对数据库文件会后很大对数据的维护会带来麻烦。
    知识改变命运,奋斗成就人生!
    2011年4月14日 6:45
    版主
  • 一个替代的方法是先用 StreamReader 打开文件,读一段,然后 INSERT 到数据库对应的字段,然后再读一段,然后 UPDATE 相应的字段。这样做减少了一次向 SQL Server 提交的包的大小,从而不会造成用户界面上的长期无响应。

    但是,对于比较大的文件,我不建议放入数据库,读取/保存都需要大量的网络带宽,建议像上面各位所述,保存到文件系统,然后数据库存路径。直接从硬盘上都肯定比从 MDF 的 B+ 节点读要快。


    Mark Zhou
    2011年4月14日 9:14
  • 您好,

    这里有个链接说的是把image转换成Byte[] 然后保存到数据库里, 你可以参考一下:
    http://apps.hi.baidu.com/share/detail/10601059


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Aspen VJ 2011年4月21日 0:55
    2011年4月18日 5:28

全部回复

  • 参考一段代码:

    if(reader.Read())//SqlDataReader对象读取Image类型

    {
         int bufferSize=100;//缓冲区大小

         byte[] bytes=new byte[buffersize];//缓冲区bytes

         long bytesRead;读取字节

         long readFrom=0;开始大小

         do{

              bytesRead=r.GetBytes(0,readFrom,bytes,0,bufferSize);//返回bytes

              Response.BinaryWrite(bytes)//response

              readFrom+=bufferSize;//逐一读取

         }while(bytesRead==bufferSize);
    }

    reader.Close();


    胡超
    2011年4月13日 21:27
  • 你好!

    把文件合并后使用 System.IO.File.ReadAllBytes 读取整个文件的 byte[] 在存到数据库中,另外建议使用 varbinary(max) 代码 image 数据类型。


    知识改变命运,奋斗成就人生!
    2011年4月14日 1:27
    版主
  • 参考一段代码:

    if(reader.Read())//SqlDataReader对象读取Image类型

    {
         int bufferSize=100;//缓冲区大小

         byte[] bytes=new byte[buffersize];//缓冲区bytes

         long bytesRead;读取字节

         long readFrom=0;开始大小

         do{

              bytesRead=r.GetBytes(0,readFrom,bytes,0,bufferSize);//返回bytes

              Response.BinaryWrite(bytes)//response

              readFrom+=bufferSize;//逐一读取

         }while(bytesRead==bufferSize);
    }

    reader.Close();


    胡超
    我需要的,恰恰与你的相反!!!!!!!!!!!!!
    2011年4月14日 6:21
  • 你好!

    把文件合并后使用 System.IO.File.ReadAllBytes 读取整个文件的 byte[] 在存到数据库中,另外建议使用 varbinary(max) 代码 image 数据类型。


    知识改变命运,奋斗成就人生!
    ReadAllbytes是把整个文件存入内存中,  如果文件较大不是很可取,也与我的意思不一致
    2011年4月14日 6:22
  • 大文件建议你保存到硬盘上,数据库中记录路径,否则后期对数据库文件会后很大对数据的维护会带来麻烦。
    知识改变命运,奋斗成就人生!
    2011年4月14日 6:45
    版主
  • 参考一段代码:

    if(reader.Read())//SqlDataReader对象读取Image类型

    {
         int bufferSize=100;//缓冲区大小

         byte[] bytes=new byte[buffersize];//缓冲区bytes

         long bytesRead;读取字节

         long readFrom=0;开始大小

         do{

              bytesRead=r.GetBytes(0,readFrom,bytes,0,bufferSize);//返回bytes

              Response.BinaryWrite(bytes)//response

              readFrom+=bufferSize;//逐一读取

         }while(bytesRead==bufferSize);
    }

    reader.Close();


    胡超
    我需要的,恰恰与你的相反!!!!!!!!!!!!!

    什么?
    胡超
    2011年4月14日 8:51
  • 参考一段代码:

    if(reader.Read())//SqlDataReader对象读取Image类型

    {
         int bufferSize=100;//缓冲区大小

         byte[] bytes=new byte[buffersize];//缓冲区bytes

         long bytesRead;读取字节

         long readFrom=0;开始大小

         do{

              bytesRead=r.GetBytes(0,readFrom,bytes,0,bufferSize);//返回bytes

              Response.BinaryWrite(bytes)//response

              readFrom+=bufferSize;//逐一读取

         }while(bytesRead==bufferSize);
    }

    reader.Close();


    胡超
    我需要的,恰恰与你的相反!!!!!!!!!!!!!

    什么?
    胡超

    难道你用while吗?
    胡超
    2011年4月14日 8:52
  • 参考一段代码:

    if(reader.Read())//SqlDataReader对象读取Image类型

    {
         int bufferSize=100;//缓冲区大小

         byte[] bytes=new byte[buffersize];//缓冲区bytes

         long bytesRead;读取字节

         long readFrom=0;开始大小

         do{

              bytesRead=r.GetBytes(0,readFrom,bytes,0,bufferSize);//返回bytes

              Response.BinaryWrite(bytes)//response

              readFrom+=bufferSize;//逐一读取

         }while(bytesRead==bufferSize);
    }

    reader.Close();


    胡超
    我需要的,恰恰与你的相反!!!!!!!!!!!!!

    什么?
    胡超

    难道你用while吗?
    胡超

    while不可以。
    胡超
    2011年4月14日 8:54
  • 一个替代的方法是先用 StreamReader 打开文件,读一段,然后 INSERT 到数据库对应的字段,然后再读一段,然后 UPDATE 相应的字段。这样做减少了一次向 SQL Server 提交的包的大小,从而不会造成用户界面上的长期无响应。

    但是,对于比较大的文件,我不建议放入数据库,读取/保存都需要大量的网络带宽,建议像上面各位所述,保存到文件系统,然后数据库存路径。直接从硬盘上都肯定比从 MDF 的 B+ 节点读要快。


    Mark Zhou
    2011年4月14日 9:14
  • 一个替代的方法是先用 StreamReader 打开文件,读一段,然后 INSERT 到数据库对应的字段,然后再读一段,然后 UPDATE 相应的字段。这样做减少了一次向 SQL Server 提交的包的大小,从而不会造成用户界面上的长期无响应。

    但是,对于比较大的文件,我不建议放入数据库,读取/保存都需要大量的网络带宽,建议像上面各位所述,保存到文件系统,然后数据库存路径。直接从硬盘上都肯定比从 MDF 的 B+ 节点读要快。


    Mark Zhou

    我就想知道如果分小包写到数据库的Image字段中,能告诉我怎么写呢???
    2011年4月14日 11:43
  • 您好,

    这里有个链接说的是把image转换成Byte[] 然后保存到数据库里, 你可以参考一下:
    http://apps.hi.baidu.com/share/detail/10601059


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Aspen VJ 2011年4月21日 0:55
    2011年4月18日 5:28
  • 一个替代的方法是先用 StreamReader 打开文件,读一段,然后 INSERT 到数据库对应的字段,然后再读一段,然后 UPDATE 相应的字段。这样做减少了一次向 SQL Server 提交的包的大小,从而不会造成用户界面上的长期无响应。

    但是,对于比较大的文件,我不建议放入数据库,读取/保存都需要大量的网络带宽,建议像上面各位所述,保存到文件系统,然后数据库存路径。直接从硬盘上都肯定比从 MDF 的 B+ 节点读要快。


    Mark Zhou

    我就想知道如果分小包写到数据库的Image字段中,能告诉我怎么写呢???

    我想知道,就是这个??我就想知道如果分小包写到数据库的Image字段中,能告诉我怎么写呢???
    2011年4月29日 15:24
  • 您好,

    这里有个链接说的是把image转换成Byte[] 然后保存到数据库里, 你可以参考一下:
    http://apps.hi.baidu.com/share/detail/10601059


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    我就想知道如果分小包写到数据库的Image字段中,能告诉我怎么写呢???
    2011年4月29日 15:25