1

IDataReaderは古く、一部の人はそれをダーティコードと見なしていることに気付きましたが、私が取り組んでいるサイトでは、これが彼らが使用しているものです。複数の結合を使用してテーブルから特定のIDを取得するクエリを実行するIDataReaderステートメントがあります。現在、このサイトにはDALがありますが、一度に1つのテーブルから選択する機能しかサポートされていないため、結合で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())

falseとしてレンダリングされ、例外はスローされず、エラーや警告もありません。私は過去にこのタイプの選択を問題なく実行しましたが、.Read()がfalseを返す理由を理解できません。

誰かがそれが読まない理由を提案できますか?さらにコードが必要な場合は、必要に応じて提供できます。どんな助けでもありがたいです、前もってありがとう。

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 に答える