【问题标题】:This SQL query is returning nothing when I know the data exists当我知道数据存在时,此 SQL 查询不返回任何内容
【发布时间】:2011-11-28 22:36:16
【问题描述】:

我正在尝试提取要在页面上显示的项目的信息。出于某种原因,主类别 (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();
      }
  }

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

现在我已经习惯了使用 MySQL,而且我知道使用 SQL 你也应该使用 Group By。但我不知道除了 tblItem.item_id 之外我会按什么分组,这样它就不会组合数据行。所以我也不知道这将如何解决我的问题。任何人都可以看出这个 SQL 语句有什么问题吗?除主类别外,一切都恢复正常。

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

编辑

它在 cmets 中,但 sqlQuery 变量的默认值为“tblItem.item_id > 0”。如果我动态添加其他条件(不包括主类别),它会起作用。

另外,我一定说得不对,但我确实收到了结果。我只缺少主类别字段(此字段返回空白)。查询本身没有失败。

已修复

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

【问题讨论】:

  • 拥有正确格式化的 SQL 可以帮助您更轻松地发现潜在问题。
  • sqlQuery的值是多少?
  • 看来这个问题在不考虑 c# 的情况下会更好地解决。
  • 计算命令文本时的 SQL 是什么样的?由于您使用的是动态 SQL,我们不知道 where 子句包含的变量可能是您的问题所在。 (并使用参数,您正在接受 SQL 注入。)
  • 你知道这段代码有一个 MASSIVE sql 注入漏洞吗?

标签: asp.net mysql sql


【解决方案1】:

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

tblItem.item_mcat_id = masCat.cat_id

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

【讨论】:

  • 您好,感谢您的回复。我实际上确定名称是正确的,并且两个表中都存在 id。但是,填充是一个很好的建议。我现在会检查的。
【解决方案2】:

您发布的代码无法直接帮助您。

对于初学者,您需要使用参数化查询,否则您很容易受到 SQL 注入攻击和其他恶意攻击。

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

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

这可以通过Debug.WriteLine() 完成。结果将默认显示在您的 OUTPUT 窗口中。

【讨论】:

  • 一定有什么误会。我得到了结果,只是没有那个领域。我将不得不在我的问题中说明这一点,因为每个人似乎都认为我没有得到任何回报。但是在检查用户输入后,我将变量标准放在自己身上。所以他们输入的内容不会直接添加到查询字符串中。不过,我很欣赏这个提示,并在其他地方使用它。
【解决方案3】:

有几件事...您似乎没有检查 sqlQuery 是否为空字符串。此外,我通常会在尝试读取数据之前检查我的数据读取器是否有行

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

     }
}

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

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多