0

だから私はASP.Netでデータベースを使用して練習しています...

Northwindデータベースから2つのデータテーブル列があります。1つはでProduct.ProductID、もう1つはですProduct.UnitsInStock。それをオブジェクトのコレクション(SortedList)と比較する必要があります。基本的に変数の製品IDと数量(クライアント側)を比較します。オブジェクトは、にICollection保存された値Session["cart"]です。

製品IDと在庫単位の変数をDataTable列1がProducts.ProductIDで、2番目の列がProducts.UnitsInStockと比較するにはどうすればよいですか?

これがクエリであり、データベースからこれらの変数を取得できると私が考えたおおよその方法です。

DataTable dt = new DataTable();

if (dt.Columns.Count != 0 &&
       dt.Rows.Count != 0)
    {
        int quantityOfUnit = 0;
        int productID = 0;
        for (int index = 0; index < dt.Columns.Count; index++)
        {
            if (index == indexOfUnitsInStock)//indexOfUnitsInStock = 1
            {
                quantityOfUnit = int.Parse(dt.Rows[0][index].ToString());
            }
            else//index = 0
            {
                productID = int.Parse(dt.Rows[0][index].ToString());
            }
        }

新しいクエリの作成:

foreach (object items in ((ShoppingCart)Session["cart"]).Values)
    {
        OleDbConnection conn = new OleDbConnection((string)Application["DBConnectionString"]);
    string selectionString =
        "SELECT Products.ProductID, Products.UnitsInStock " +
            "FROM Products" +
            "WHERE Products.ProductID = " +
            ((ShoppingCart)Session["cart"]).Values;
    DataTable dt = new DataTable();
    try
    {
        OleDbCommand cm = new OleDbCommand(selectionString, conn);
        OleDbDataAdapter da = new OleDbDataAdapter();
        da.SelectCommand = cm;   
        da.Fill(dt);
        da.Dispose();
    }
    catch(Exception ex)
    {
        txtUnderstockedItems.Text = "There was a problem connecting to the database: " + ex.Message ;
    }
    finally
    {
        conn.Close();
    }
    }
4

1 に答える 1

0

まず、一般的に、SQLを現在のように連結することは望ましくありません。パラメータ化されたSQLを使用します。これらが整数値である場合は、それらを整数にキャストしてからクエリに入れて、同様の結果を得ることができます。

ShoppingCart.Valuesがコレクションの場合、いくつかの選択肢があります。

  1. 値の項目ごとに、一度に1つずつクエリを発行します
  2. SQLリスト「WHEREProducts.ProductIDIN(1、2、3、4)」を使用するクエリを作成します-値を反復して作成するリスト
  3. クエリを実行するストアドプロシージャを作成し、XMLパラメータを使用してリスト値を指定します。

3つのうち、3つ目は、長期的に維持するのがより安全でおそらく簡単であるため、私の好みです。

#1の例は次のようになります...

foreach (object obj in (ShoppingCart)Session["cart"].Values)
{
  DataTable dt = new DataTable();
  int productID = (int)obj;
  string query = "SELECT * FROM Products WHERE ProductID = ?";   //yuck, oledb params
  using (OleDbConnection conn = new OleDbConnection (connStr))
  {
     //dont hold me to this syntax, its from my head
     OleDbCommand cmd = new OleDbCommand(query, conn);
     cmd.Parameters.Add(productID);
     OleDbDataAdapter da = new OleDbDataAdapter();
     da.SelectCommand = cm;   
     da.Fill(dt);
  }
  //do something with the data table
}
于 2012-10-25T20:12:21.963 に答える