当我知道数据存在时,此SQL查询不返回任何内容

时间:2011-11-28 22:36:17

标签: asp.net mysql sql

我正在尝试提取要在页面上显示的项目的信息。由于某种原因,主类别(masCat.cat_name)不返回数据。这是我的SQL语句的代码:

  strSQL.CommandText = "Select Top 25 tblItem.item_id, tblItem.item_title
     , masCat.cat_name, regCat.cat_name, tblItem.item_lot, tblCosigner.cs_txt_id
     , tblItem.item_status, tblItem.item_photo_status, tblItem.item_pr
     , tblItem.item_premium
  From tblItem
  Left Join tblCosigner On (tblItem.item_cs_txt_id = tblCosigner.cs_txt_id)
  Left Join tblCDR On (tblItem.item_cdr_txt_id = tblCDR.cs_id)
  Left Join tblCat As masCat On (tblItem.item_mcat_id = masCat.cat_id)
  Left Join tblCat As regCat On (tblItem.item_cat_id = regCat.cat_id)
  Where " + sqlQuery + "
  Order By tblItem.item_id;";
  try
  {
      conn.Open();
      using (SqlDataReader itemReader = strSQL.ExecuteReader())
      {
          while (itemReader.Read())
          {
              resultText += "<tr>\n<td>" + itemReader.GetValue(0).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(1).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(2).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(3).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(4).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(5).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(6).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(7).ToString() + "</td>\n";
              if (itemReader.GetValue(8).ToString().Length > 0)
              {
                  price = double.Parse(itemReader.GetValue(8).ToString());
              }
              if (itemReader.GetValue(9).ToString().Length > 0)
              {
                  premium = double.Parse(itemReader.GetValue(9).ToString());
              }
              total = price + premium;
              resultText += "<td>" + total.ToString("0.00") + "</td>\n</tr>\n";
          }
          itemReader.Close();
      }
  }

我认为我的连接语句对于masCat连接是不正确的,但如果我只是将tblItem.item_mcat_id更改为tblItem.item_cat_id(这是次要类别,也在同一查询中选择),它就可以正常工作。两者都是从完全相同的表中提取的,但是来自关系表中的不同关联字段。我很肯定tblItem.item_mcat_id是主类别id的字段的正确名称。

现在我习惯使用MySQL,而且我确实知道使用SQL你也应该做一个Group By。但我不知道除了tblItem.item_id之外我会分组什么,以便它不会组合数据行。所以我不知道这将如何解决我的问题。任何人都可以看到这个SQL语句有什么问题吗?除主类别外,一切都很好。

我写这篇文章时被打断了几次,所以我在思考过程中忘记了自己的想法,所以我希望我能提供足够的信息。如果没有,请问,我会回复或更新我的问题。提前谢谢......

修改

它在注释中,但sqlQuery变量的默认值为“tblItem.item_id&gt; 0”。如果我动态地添加其他标准(不包括主类别),它可以工作。

另外,我一定不能说出正确的话,但我确实从中得到了结果。我只缺少主类别字段(它为此返回空白)。查询本身并没有失败。

固定

创建表的人最初创建了tblItem.item_mcat_id零填充... -.-

3 个答案:

答案 0 :(得分:2)

根据你给出的描述,我不得不说这两列:

tblItem.item_mcat_id = masCat.cat_id

不是同一类型或者包含填充而另一个不包含填充。你可能需要做一个演员。最后确认item.mcat_id实际上存在于cat_id列中。

答案 1 :(得分:0)

使用您发布的代码,无法直接为您提供帮助。

对于初学者,你需要使用参数化查询,否则你明智地开放SQL注入攻击和其他恶意。

我建议您阅读Give me parametrized queries or give me death,了解原因。

话虽这么说,解决问题的唯一方法是将完整的结果查询字符串放入SQL Management Studio(或在VS中使用其基本版本)并查看输出结果。这意味着您需要在执行程序时输出CommandText属性。

可以使用Debug.WriteLine()完成此操作。结果默认情况下会在您的OUTPUT窗口中结束。

答案 2 :(得分:0)

一些事情......似乎你没有检查sqlQuery是否为空字符串。此外,我通常会在尝试阅读之前检查我的数据阅读器是否有行

if(itemReader.HasRows) 
{ 
     While(itemReader.Read())
     {

     }
}

不确定这些是不是问题,但我会从那里开始。