尝试从数据库下载文件时未分配的本地变量错误

时间:2014-06-11 17:18:43

标签: c# asp.net

我正在尝试从数据库下载文件,但是它给了我一个名为unaasigned local variable的错误: 返回字节;

请告诉我如何在我的情况下将字符串转换为字节,请提前感谢。

我有一个名为SaleFileName的列,我想从中下载文件。

Aspx代码:

<asp:TemplateField HeaderText="RecieptName" SortExpression="RecieptName">
                                <ItemTemplate>
                                    <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Download" CommandArgument='<%# Bind("SaleFileName") %>' Text='<%# Bind("SaleFileName") %>' ></asp:LinkButton>
                                </ItemTemplate>
                            </asp:TemplateField>

文件后面的代码:

private byte[] ReadFileFromDatabase(string FileName) {
    string connectionString = WebConfigurationManager.ConnectionStrings["ConnectionString2"].ConnectionString;  
    byte[] bytes;

    using (SqlConnection con = new SqlConnection(connectionString))
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.CommandText = "selectSaleFileName from Contributions where SaleFileName = @SaleFileName";
            cmd.Parameters.AddWithValue("@SaleFileName", FileName);
            cmd.Connection = con;
            con.Open();

            using ( SqlDataReader sdr = cmd.ExecuteReader())
            {
               if (sdr.Read() )
                  bytes = (byte[])sdr["SaleFileName"];
            }
            con.Close();
        }
    }

    return bytes; // This line is giving an error of unassigned error. Bytes is not assigned to anything it says.
    }
    protected void gridContributions_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Download")
        {
            string FileName = Convert.ToString(e.CommandArgument);      
            byte[] bytes = ReadFileFromDatabase(FileName);

            Response.Clear()
            Response.ContentType = "application/octet-stream"
            Response.AddHeader("Content-Disposition", "attachment; FileName=" + FileName + ";");
            Response.BinaryWrite(bytes)
            Response.End()
        }
    }

1 个答案:

答案 0 :(得分:2)

编译器无法通过遵循代码的静态流程来确定是否为bytes分配任何值。

您正在if语句中初始化bytes,如果没有从数据库返回任何行,那么bytes将永远不会被初始化。

您可以在声明时为null分配一些默认值bytes,如:

byte[] bytes = null;

上面的声明和初始化将删除错误,但它完全取决于您的要求,是否要抛出异常或返回null。

您可能还会看到:5.3 Definite assignment

  

在函数成员的可执行代码中的给定位置,a   如果编译器可以证明,变量被认为是明确分配的,   通过静态流分析,该变量已自动进行   初始化或已成为至少一项任务的目标