SqlDataReader的问题!

时间:2011-05-16 13:00:24

标签: c# asp.net sqldatareader

这是对我之前提到的question的回应,因为我无法在8小时之前将其发布在那里,我已经创建了一个新问题,我正面临着这个问题,

以下是代码:

if (context.Request.QueryString["id"] != null)
{
       int id = int.Parse(context.Request.QueryString["id"].ToString());
       string connectionString = "Data Source=tarun-PC\\SQLEXPRESS;Initial Catalog=mydb;Integrated Security=True";
       string commandString = "Select fsImage from WHATSNSTORE_FEATURED_STORES where imageId=" + id;

       SqlConnection oConnection = new SqlConnection(connectionString);
       SqlCommand oCommand = new SqlCommand(commandString, oConnection);

       if (oConnection.State != ConnectionState.Open)
       {
            oConnection.Open();
       }

       SqlDataReader myDataReader = oCommand.ExecuteReader();

      //myDataReader.Read();

       try
       {
            if (myDataReader.Read())
            {
                 context.Response.ContentType = "image/jpg";
                 context.Response.BinaryWrite((byte[])myDataReader["fsImage"]);
            }
       }
       catch (Exception ex)
       {

         context.Response.Write(ex.Message);
       }

我的表

create table WHATSNSTORE_FEATURED_STORES
(
    imageId int primary key identity,
    fsImage image
)

现在唯一的问题是,在调试时它会跳过if(myDataReader.Read())部分,这表示没有数据存在!

如何解决问题?

3 个答案:

答案 0 :(得分:1)

如果您的阅读器为空,则表示您的查询未返回结果。

查看您的代码我会说数据库中缺少图像。您应该假设可以并且将会发生这种情况,并将空白图像流式传输到浏览器或返回HTTP 404错误。

<强> [更新]

您检查生成的SQL字符串了吗?将 id 添加到SQL字符串时,会将其强制转换为字符串。如果id超过1000,您可能会得到整数的局部表示(即1.000而不是1000)。这可以解释为什么SSMS中的查询确实返回结果而页面没有。

原始回答: 我注意到你正在使用int.Parse;您可能想要使用int.TryParse。如果该值不是有效false,则只会返回int。 此外,您正在通过字符串连接构建SQL。这被认为是一种不好的做法。你应该使用参数。 另一个最佳实践是将连接和阅读器包装在using语句中。这将确保连接和读取器在不再需要时关闭,尤其是在异常的情况下。 最后,您可能需要考虑将连接字符串移动到web.config文件中。

答案 1 :(得分:0)

您应该使用oCommand.ExecuteScalar而不是reader,因为您只需要一个值。之后,您可以检查返回的值是否为空。

答案 2 :(得分:0)