C# 无法将“System.Int32”类型的对象强制转换为“System.Byte[]”类型
我将图像保存到datat类型imageBinary的sql数据库中,并成功保存了它。。现在我需要在我的数据列表中检索它。。在我将其绑定到标记中的数据列表后。。我犯了这个错误 无法将“System.Int32”类型的对象强制转换为“System.Byte[]”类型 这是我的密码C# 无法将“System.Int32”类型的对象强制转换为“System.Byte[]”类型,c#,asp.net,sql,C#,Asp.net,Sql,我将图像保存到datat类型imageBinary的sql数据库中,并成功保存了它。。现在我需要在我的数据列表中检索它。。在我将其绑定到标记中的数据列表后。。我犯了这个错误 无法将“System.Int32”类型的对象强制转换为“System.Byte[]”类型 这是我的密码 if (!(this.IsPostBack)) { // For News DataList prepareConnection(); _command.Comma
if (!(this.IsPostBack))
{
// For News DataList
prepareConnection();
_command.CommandText = "select top 5 * from News ORDER BY id DESC";
_adp = new SqlDataAdapter();
_tbl = new System.Data.DataTable();
_adp.SelectCommand = _command;
_adp.Fill(_tbl);
SqlDataReader DataReader = _command.ExecuteReader();
DataReader.Read();
Response.BinaryWrite((byte[])DataReader[0]);
DataReader.Close();
dlNews.DataSource = _tbl;
dlNews.DataBind();
}
protected void prepareConnection()
{
_connection = new SqlConnection(@"Data Source=******\localhost;Initial Catalog=******;User ID=sa;Password=****");
_connection.Open();
_command = new SqlCommand();
_command.Connection = _connection;
}
下面是数据列表标记:
<asp:DataList ID="dlNews" runat="server">
<ItemTemplate>
<a href='./NewsView.aspx?ID=<%#Eval("ID") %>' style="text-decoration: none;">
<div id="123">
<a href='NewsView.aspx?ID=<%#Eval("ID") %>' style="text-decoration: none;">
<asp:Label ID="lblTitle" runat="server" Style="font-size: 15px; font-weight: bold;
line-height: 20px;" Text='<%# Eval("Title").ToString().Length>70 ? (Eval("Title") as string).Substring(0,70) : Eval("Title") %>'></asp:Label>
</a>
<div id="image" style="clear: both; float: right; margin: 0 5px 10px 10px;">
<a href='NewsView.aspx?ID=<%#Eval("img") %>' style="text-decoration: none;">
<asp:Image ID="Image1" runat="server" Height="111px" ImageUrl="~/images/epica.jpg"
Style="border: 1px solid black;" />
</a>
</div>
<div style="margin-removed 20px; padding-removed 5px;">
<asp:Label ID="lblContent" runat="server" Text='<%# Eval("Contect").ToString().Length>150 ? (Eval("Contect") as string).Substring(0,150) : Eval("Contect") %>'></asp:Label>
</div>
<div style="position: relative; border: 1px solid black; float: left; background-color: #4EAAF5;
margin-left: 3px;">
<a href='NewsView.aspx?ID=<%#Eval("ID") %>' style="color: white; font-size: 15px;
font-weight: bold; text-decoration: none; padding: 4px;">إقرأ المزيد</a>
</div>
</div>
<div id="Separator" style="width: 600px; height: 2px; border-top: 1px solid #CCCCCC;
margin: 5px 17px 5px 5px; clear: both;">
</div>
</a>
</ItemTemplate>
</asp:DataList>
正如@Alireza提到的,您似乎正在使用DataReader中找到的第一个值
Response.BinaryWrite((byte[])DataReader[0]);
这是img列的正确列号吗
如果没有,请尝试将列的0值更改为正确的数字,然后查看是否再次出现错误。我建议您不要使用SELECT*FROM,而是将要使用的列的名称放在其中,例如SELECT Column1 FROM 看起来DataReader[0]是一个int值而不是二进制值。无法将类型为“System.Int32”的对象强制转换为类型为“System.Byte[]” 由于您的错误已经表明您的Response.BinaryWrite方法正在接收Int32类型作为输入,而此方法无法转换,正如其他用户的回答一样,请在选择时在查询中使用列名,DataReader[0]是您的第一个列值,我认为它是ID,是Int32,因此,在下面的查询中使用列名,并使用正确的列名获取正确的列值DataReader[2]这将按照下面的查询获取图像列
if (!(this.IsPostBack))
{
// For News DataList
prepareConnection();
_command.CommandText = "select top (5) ID ,Title,img,Contect from News ORDER BY id DESC";
_adp = new SqlDataAdapter();
_tbl = new System.Data.DataTable();
_adp.SelectCommand = _command;
_adp.Fill(_tbl);
SqlDataReader DataReader = _command.ExecuteReader();
DataReader.Read();
Response.BinaryWrite((byte[])DataReader[2]);
DataReader.Close();
dlNews.DataSource = _tbl;
dlNews.DataBind();
}
做:
而不是:
Response.BinaryWrite((byte[])DataReader[0]);
您在新闻表中的第一列不是类似于Id吗?请参阅此链接
Response.BinaryWrite((byte[])DataReader[0]);