当我使用SQL语句时
SELECT File_Data
FROM Attachments
WHERE UserID = '12345' AND FileNames = 'testing1.jpg'
图像下载并且看起来很棒。但是如果我放入一个存储过程,它会在我的文件夹testing1.jpg
中创建C:\Testing\
文件,但它不是在图像中写入数据而且它将无法正确显示。下面是我必须调用存储过程并将其写入的内容。关于我在这里做错了什么想法?
出于测试目的:
testing1.jpg
12345
代码:
protected void LoadFiles(string strfilename, int userid)
{
string fullname = strfilename;
using (SqlConnection cn = new SqlConnection(conn_string))
{
cn.Open();
using (SqlCommand cmd = new SqlCommand("GET_ATTACHMENT", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p1 = new SqlParameter("@FileName", SqlDbType.NVarChar, 255);
p1.Direction = ParameterDirection.Input;
p1.Value = strfilename;
cmd.Parameters.Add(p1);
SqlParameter p2 = new SqlParameter("@User_ID", SqlDbType.Int);
p2.Direction = ParameterDirection.Input;
p2.Value = userid;
cmd.Parameters.Add(p2);
// Tried using this statement but it did not work. //
SqlParameter pSub = new SqlParameter("@File_Data", SqlDbType.VarBinary);
pSub.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(pSub);
Response.Write(pSub);
// *** *** ///
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
if (dr.Read())
{
// For some reason the data being returned is blank
// When I run it in SQL I get data being returned.
byte[] fileData = (byte[])dr.GetValue(0);
using (System.IO.FileStream fs = new System.IO.FileStream("C:\\Testing\\" + (fullname), System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite))
{
using (System.IO.BinaryWriter bw = new System.IO.BinaryWriter(fs))
{
bw.Write(fileData);
bw.Close();
}
}
}
dr.Close();
}
}
}
}
SQL Server存储过程:
ALTER PROCEDURE [dbo].[GET_ATTACHMENT]
@User_ID int,
@FileName nvarchar(250)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @FileData varbinary(max)
Set @FileData = (SELECT File_Data FROM Attachments
WHERE UserID = @User_ID and
FileNames = @FileName);
SELECT @FileData
END
答案 0 :(得分:0)
一些建议:
在byte[] fileData = (byte[])dr.GetValue(0);
设置一个断点,看是否在将其写入文件之前返回任何数据。
使用CommandBehavior.Default
使用CommandBehavior.SequentialAccess
时尝试使用SqlDataReader的GetBytes方法。
作为最后的手段,更改您的SP以返回User_ID,只是为了检查是否有任何返回。