0

所以我正在练习使用带有 ASP.Net 的数据库......

我有两个来自 Northwind 数据库的数据表列。一个是Product.ProductID,另一个是Product.UnitsInStock。我需要将其与对象集合(SortedList)进行比较。本质上是比较变量产品 ID 和数量(客户端)。对象是ICollection保存在 中的值Session["cart"]

如何将我拥有的产品 id 和库存单位变量与 DataTable 列 1 是 Products.ProductID 和第二列是 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. 针对 Values 中的每个项目,一次发出一个查询
  2. 构建一个使用 sql 列表“WHERE Products.ProductID IN (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 回答