各种文件(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
这样可行,但文件应该保存到服务器而不是弹出另存为对话框。我不确定是否有办法将响应保存到文件中。
感谢您了解这些问题!
答案 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标志很关键,否则读者会先读取内存中的整个文件。