1

ShoppingCart が必要とする各アイテムについて、Northwind データベースからデータベース クエリを開いています。テーブルProductIDからUnitsInStock出し入れすることです。Productsデータベースから 2 つの列を取り出して、データをDataTabel ds. 次に、ユーザーが入力した数量がデータベース内の列の在庫数よりも少ないことを確認します。

theCart.ValuesICollections の一部です。

「データベースへの接続に問題がありました: オブジェクト参照がオブジェクトのインスタンスに設定されていません。」という例外メッセージからエラーが発生しました。

これがコードです。

DataSet ds = new DataSet();
        OleDbConnection conn = new OleDbConnection((string)Application["DBConnectionString"]);
        foreach (OrderItem item in theCart.Values)
        {
            string selectionString =
            "SELECT Products.ProductID, Products.UnitsInStock " +
                "FROM Products" +
                "WHERE Products.ProductID = " + item.ProductID + ";";
            try
            {
                OleDbCommand cm = new OleDbCommand(selectionString, conn);
                OleDbDataAdapter da = new OleDbDataAdapter();
                da.SelectCommand = cm;
                da.Fill(ds);
                da.Dispose();
                 if (ds.Tables["Products"].Columns.Count != 0 &&
            ds.Tables["Products"].Rows.Count != 0)
            {
                for (int index = 0; index < ds.Tables["Products"].Rows.Count; index++)
                {
                    if (item.ProductID == int.Parse(ds.Tables["Products"].Rows[index][indexOfProductID].ToString()))
                    {
                        if (item.QuantityOrdered > int.Parse(ds.Tables["Products"].Rows[index][indexOfUnitsInStock].ToString()))
                        {
                            hasStock = false;
                            int inStock = int.Parse(ds.Tables["Products"].Rows[index][indexOfUnitsInStock].ToString());
                            txtUnderstockedItems.Text += "Sorry we do not have enough stock of item: " + item.ProductName +
                                "<br> Currently, " + item.ProductName + " (ID:" + item.ProductID + ") has " + inStock + " in stock.";
                        }
                        else
                        {//can output how many items in stock here. 
                            hasStock = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                txtUnderstockedItems.Text = "There was a problem connecting to the database: " + ex.Message;
            }
            finally
            {

                conn.Close();
            }


            }
        }
4

3 に答える 3

3

Rows または Columns はほとんどの場合 null です。その if ステートメントの前の ds を調べます。このようなことが起こる一般的な理由は、Products テーブルが何も返さないことです。存在しないオブジェクトのプロパティを取得することはできないため、例外です。!= nullカウントをチェックする代わりに、比較を行う必要があります。長さがゼロの場合、ループ内のコードは実行されませんが、クラッシュなどは発生しません。

if (ds.Tables["Products"].Columns != null && ds.Tables["Products"].Rows != null)

行数がゼロの場合は問題ありませんが、ループ内でアクセスしようとしている列が存在することを確認するロジックが必要になる場合があります。

于 2012-10-26T21:29:57.463 に答える
0

DataTableCollection.Item指定されたテーブル名を持つテーブルがない場合は null を返します。

コマンドが行を返さない場合、テーブルは DataSet に追加されず、例外は発生しません。したがって、行が返されないため、DataSet にテーブルがないと仮定します。

DatatTable代わりに手動で1 つを初期化し、.Fillを取るオーバーロードを使用しDataTableます。

Dim table = new DataTable("Products")
da.Fill(table)
于 2012-10-26T21:32:53.297 に答える
0

データベースに表示されるハードコードされた名前を使用して、データセットからテーブルを取得しようとしています。同様のパターンでテストを実行したところDataset、データベースを作成して入力すると、次のようになります。 、テーブル名はデータベースからコピーされません。ティムが提案したように、次を確認する必要がありますds.Table[0]

于 2012-10-26T21:34:17.813 に答える