2011-05-16 138 views
0

这是响应question我刚才问,因为我不能8小时前有后,我已经创建了一个新的问题,与我所面临的问题,问题与SqlDataReader!

下面的代码:

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())部分,这表明没有数据存在!

我该如何解决问题?

+0

你有错误吗?在_context.Response.Write(ex.Message); _你有东西吗?在该行添加一个喙点并检查您的应用程序是否在那里登台... – Marco 2011-05-16 13:03:15

+0

如果没有数据存在,那意味着您需要获取数据。 – Avitus 2011-05-16 13:04:02

+0

@Marco没有if(),当我运行代码时,我得到的错误是“无效的尝试读取,当没有数据存在”..再次,我跑在SSMS查询,我获得理想的结果! – cSharpNovice 2011-05-16 13:23:47

回答

1

如果您的读者为空,这意味着您的查询没有返回结果。

看着你的代码我会说图像从数据库中丢失。您可能应该假定可以并将会发生,并将空白图像传输到浏览器或返回HTTP 404错误。

[更新]

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

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

+0

我在临时构建它以检查我是否获得了正确的功能,我通常会尝试在最终版本中保留良好的实践。谢谢:) – cSharpNovice 2011-05-16 13:28:51

+0

@cSharpNovice您的用户名称暗示否则:)无论如何,我已经更新了我的答案。请让我知道,如果这可以解决您的问题。 – 2011-05-16 13:43:17

+0

哈哈,这只是一个临时ID,有一些问题登录我的原始ID! :) – cSharpNovice 2011-05-16 13:48:59

0

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

+0

虽然更好的方法,这不会解决任何事情。 – 2011-05-16 13:06:39

+0

@Brian,不,但它可能更容易找到错误。 – 2011-05-16 13:08:00

+0

我使用了ExecuteScalar(),但返回的对象具有空值! – cSharpNovice 2011-05-16 13:15:42

0

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

+0

是的,我将它分配给一个bool变量,bool变量中的值为false,但我不知道为什么它是错误的,因为我的数据库中有数据! – cSharpNovice 2011-05-16 13:11:55

+0

@cSharpNovice:连接字符串或查询肯定有问题。如果没有任何信息从您的查询返回,那么这不是严格的.net程序化问题。 – 2011-05-16 13:20:41

+0

@cSharpNovice:是否有一些愚蠢的事情发生,比如将ID存储为NVARCHAR而不是INT – 2011-05-16 13:30:01