1

我意识到 IDataReader 已经过时,有些人认为它是脏代码,但在我正在研究的网站上,这就是他们使用的。我有一个 IDataReader 语句来运行查询以使用多个连接从表中获取特定的 id。现在这个站点有一个 DAL,但它只支持一次从一个表中选择的能力,因此使用带有连接的 select 语句不适用于它。这就是我被迫使用 IDataReader 的原因。

 if (Request.QueryString["CategoryId"].ToString() == "0")
                {
                    using (IDataReader getCategoryID = DB.GetRS("SELECT ItemCatalogCategory.CategoryID FROM UserCustomerCatalog INNER JOIN ItemCatalogCategory ON UserCustomerCatalog.ItemProfileCatalogID = ItemCatalogCategory.ItemProfileCatalogID " +
                              "INNER JOIN ItemCategory ON ItemCatalogCategory.CategoryID = ItemCategory.CategoryID INNER JOIN StoreCatalog ON UserCustomerCatalog.StoreCatalogID = StoreCatalog.StoreCatalogID " +
                              "WHERE UserCustomerCatalog.ItemProfileCatalogID = '" + Request.QueryString["CatalogID"] + "' AND UserCustomerCatalog.CustomerID =' " + Session["Customer"].ToString() + "' AND ItemCategory.ProductID = '" + productis + "'"))
                    {

                        if (getCategoryID.Read())
                        {
                            string categoryID = getCategoryID["ItemCatalogCategory.CategoryID"].ToString();

                            string lookmike = Request.Url.AbsolutePath + "?CatalogID=" + catalogis + "&ProductID=" + productis + "&CatalogIndex=" + Request.QueryString["CatalogIndex"] + "&CategoryID=" + categoryID;
                            Response.Redirect(Request.Url.AbsolutePath + "?CatalogID=" + catalogis + "&ProductID=" + productis + "&CatalogIndex=" + Request.QueryString["CatalogIndex"] + "&CategoryID=" + categoryID);

                        }
                        else
                        {
                            Response.Redirect(Request.Url.AbsolutePath + "?CatalogID=" + catalogis + "&ProductID=" + productis + "&CatalogIndex=" + Request.QueryString["CatalogIndex"] + "&CategoryID=" + Request.QueryString["CategoryId"]);
                        }

                    }//end using getCategoryID
                }

这就是我所拥有的,但是当它到达时:

if (getCategoryID.Read())

它呈现为假,没有抛出异常,也没有错误或警告。我过去做过这种类型的选择没有问题,但我不知道为什么 .Read() 返回错误。

任何人都可以提出它不阅读的可能原因吗?如果需要更多代码,我可以根据需要提供。任何帮助表示赞赏,在此先感谢您。

4

1 回答 1

1

查看您的 SQL 文本,有一个小错字可能会对结果造成严重破坏

 "WHERE UserCustomerCatalog.ItemProfileCatalogID = '" + Request.QueryString["CatalogID"] + 
 "' AND UserCustomerCatalog.CustomerID =' " + Session["Customer"].ToString() + "' AND ..... "
                                    here ^

该空间破坏了您的查询并且没有给出任何结果。

让我再重复一遍,正如其他成员已经说过的那样,您遇到了SQL 注入问题。您可以向 GetRS 的实际实现添加一个重载,它还接收一个 SQLParameter 集合以添加到用于构建 SqlDataReader 的命令中。像这样的东西

public SqlDataReader GetRS(string sqlText, SqlParameter[] prm)
{
      ....
      SqlCommand cmd = new SqlCommand(sqlText, conn);
      cmd.Parameters.AddRange(prm);
      .....
}

然后开始更新调用代码。

于 2012-11-08T14:00:22.467 回答