使用asp将ntext数据从SQL Server保存到文件目录

时间:2010-03-15 17:50:42

标签: asp.net sql-server vb.net

各种文件(pdf,图像等)存储在MS SQL Server上的ntext字段中。我不确定这个字段中的类型是什么,除了它显示问号和未定义的字符,我假设它们是二进制类型。

该脚本应该遍历行并提取并将这些文件保存到临时目录。给出“filename”和“contenttype”,“data”是ntext字段中的任何内容。

我尝试了几种解决方案:

1) data.SaveToFile "/temp/"&filename, 2

错误:需要对象:'????????????????????'

???

2) File.WriteAllBytes "/temp/"&filename, data

错误:需要对象:'文件'

我不知道如何导入它,或者是MapPath的服务器。 (提示:什么是菜鸟!)

3)
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2

Dim BinaryStream
Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = adTypeBinary
BinaryStream.Open
BinaryStream.Write data
BinaryStream.SaveToFile "C:\temp\" & filename, adSaveCreateOverWrite

错误:参数类型错误,超出可接受范围或相互冲突。

4)
Response.ContentType = contenttype
Response.AddHeader "content-disposition","attachment;" & filename
Response.BinaryWrite data 
response.end

这样可行,但文件应该保存到服务器而不是弹出另存为对话框。我不确定是否有办法将响应保存到文件中。

感谢您了解这些问题!

1 个答案:

答案 0 :(得分:0)

由于列是NTEXT,所有SqlClient对象都会将其解释为unicode字符串,这将导致所有类型的问题。您应该将列更改为varbinary(max)。

将列作为真正的二进制文件(适用于文件)后,您可以从SqlClient读取列流并将该流写入响应(跳过中间临时文件):

void StreamFileToResponse(int id, SqlConnection connection) {
SqlCommand cmd  = new SqlCommand(@"select data from table where id = @id", connection);
cmd.Paramaters.AddWithValue("@id", id);
using(SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess) {
   while (rdr.Read()) {
      Stream data = rdr.GetSqlBytes(0).Stream;
      byte[] buffer = new byte[4096];
      while(int read = data.Read(buffer, 0, 4096)) {
         Response.BinaryWrite(buffer, 0, read);
      }
   }
}

传递给ExecuteReader的SequentialAcccess标志很关键,否则读者会先读取内存中的整个文件。