从SQL检索VarBinary数据并保存图像/文件

时间:2014-02-11 15:20:32

标签: c# sql sql-server

当我使用SQL语句时

SELECT File_Data 
FROM Attachments 
WHERE UserID = '12345' AND FileNames = 'testing1.jpg'

图像下载并且看起来很棒。但是如果我放入一个存储过程,它会在我的文件夹testing1.jpg中创建C:\Testing\文件,但它不是在图像中写入数据而且它将无法正确显示。下面是我必须调用存储过程并将其写入的内容。关于我在这里做错了什么想法?

出于测试目的:

  • strfilename = testing1.jpg
  • userid = 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

1 个答案:

答案 0 :(得分:0)

一些建议:

byte[] fileData = (byte[])dr.GetValue(0);设置一个断点,看是否在将其写入文件之前返回任何数据。

使用CommandBehavior.Default

使用CommandBehavior.SequentialAccess时尝试使用SqlDataReader的GetBytes方法。

作为最后的手段,更改您的SP以返回User_ID,只是为了检查是否有任何返回。