【发布时间】: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 注入漏洞吗?