【问题标题】:Problem with SqlDataReader !SqlDataReader 有问题!
【发布时间】:2011-05-16 21:41:25
【问题描述】:

这是对我之前问过的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()) 部分,这表明没有数据存在!

我该如何解决这个问题?

【问题讨论】:

  • 您有错误返回吗?在 context.Response.Write(ex.Message); 你有什么吗?在那条线上放一个断点,然后检查你的应用程序是否在那里...
  • 如果没有数据,说明你需要获取数据。
  • @Marco 没有 if(),当我运行代码时,我得到的错误是“无效的读取尝试,当没有数据存在时”.. 再次,我运行了查询在 SSMS 中,我得到了想要的结果!

标签: c# asp.net sqldatareader


【解决方案1】:

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

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

[更新]

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

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

【讨论】:

  • 我临时构建这个只是为了检查我是否得到了正确的功能,我通常会尝试在我的最终版本中保持良好的实践。谢谢:)
  • @cSharpNovice 您的用户名另有说明:) 无论如何,我已经更新了我的答案。如果这能解决您的问题,请告诉我。
  • 哈哈,这只是一个临时ID,用我原来的ID登录有问题! :)
  • @Brian 所以我将 where 子句中的 id 值硬编码为我想要的值,令我高兴的是,阅读器仍然是空的:@
  • @Brian,我的数据库中的数据被神秘地删除了,我重新启动了我的 SSMS,我的数据库中只有 1 条记录! err..抱歉给您带来的麻烦!
【解决方案2】:

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

【讨论】:

  • 我使用了 ExecuteScalar() 但返回的对象为空值!
  • @cSharpNovice:那是你的问题。您的查询没有返回任何内容,因此 .Read() 没有数据。尝试在 sql server management studio 中运行查询,并确保连接到包含结果的正确数据库。
  • @Brian 检查了所有这些,我在 SSMS 中运行了查询,得到了想要的结果!
【解决方案3】:

您确定调试器设置正确吗?您是否附加到进程,因此部署的 .dbg 文件与调试的 bin 目录中的 .dll 文件不匹配?您是否尝试将 myDataReader.Read() 分配给 bool 以查看是否存在任何数据库信息?

【讨论】:

  • 是的,我把它赋值给了一个bool变量,bool变量里面的值是假的,但是我不知道为什么是假的,因为我的db里有数据!
  • @cSharpNovice:您的连接字符串或查询肯定有问题。如果您的查询没有返回任何信息,那么严格来说这不是 .net 程序问题。
  • @cSharpNovice: 是否有一些愚蠢的事情发生,比如 ID 被存储为 NVARCHAR 而不是 INT
  • 是的,但这让我很头疼,因为查询在 ssms 中运行得很好,甚至连接字符串也配置到了正确的数据库。 :\
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多