我正在尝试从数据库下载文件,但是它给了我一个名为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()
}
}
答案 0 :(得分:2)
编译器无法通过遵循代码的静态流程来确定是否为bytes
分配任何值。
您正在if语句中初始化bytes
,如果没有从数据库返回任何行,那么bytes
将永远不会被初始化。
您可以在声明时为null
分配一些默认值bytes
,如:
byte[] bytes = null;
上面的声明和初始化将删除错误,但它完全取决于您的要求,是否要抛出异常或返回null。
您可能还会看到:5.3 Definite assignment
在函数成员的可执行代码中的给定位置,a 如果编译器可以证明,变量被认为是明确分配的, 通过静态流分析,该变量已自动进行 初始化或已成为至少一项任务的目标
。