0

我在这里遇到了麻烦。我在 windows_loaded 事件中添加了它。代码在这里:

con.Open();
int i = 0, j = 0;
string[] productCode = null;
string[] productName = null;
int[] quantity =null;
float[] totalPrice = null;
float[] totalTax = null;
int orderID = 0;

SqlCeCommand com5 = new SqlCeCommand("SELECT MAX(OrderID) AS Expr1 FROM Order_Details", con);
orderID = (int)com5.ExecuteScalar(); 
SqlCeCommand com1 = new SqlCeCommand("SELECT ProductCode, Quantity FROM Order_Products WHERE OrderID = ('"+ orderID.ToString() +"')", con);
SqlCeDataReader dr1 = com1.ExecuteReader();

while (dr1.Read())
{
    productCode[i] = (string)dr1[0];    // Exception is here
    quantity[i] = (int)dr1[1];
    SqlCeCommand com3 = new SqlCeCommand("SELECT ProductName FROM Products_Master WHERE ProductCode = '" + productCode[i] + "'", con);
    productName[i] = (string)com3.ExecuteScalar(); 
    i++;
}

SqlCeCommand com2 = new SqlCeCommand("SELECT TotalPrice, TotalTax FROM Order_Details WHERE OrderID = (SELECT MAX(OrderID) AS Expr1 FROM Order_Details)", con);
SqlCeDataReader dr2 = com1.ExecuteReader();

while (dr2.Read())
{
    totalPrice[j] = (float)dr2[0];
    totalTax[j] = (float)dr2[1];
    j++;
}

for (int k = 1; k <= i; k++)
{
    List<Product> Products = new List<Product>();
    Product p = new Product
    {
        ID = k,
        ProductName = productName[k],
        Quantity = quantity[k],
        Tax = totalTax[k],
        Total = totalPrice[k]
    };
    dgrdInvoice.Items.Add(p); // add a row
}

con.Close();

任何人都可以为我找到解决此问题的方法吗?我正在尝试将两个数据库中的值添加到单个 DataGrid。

编辑:

实际上在 SQL 查询中有一些东西:

数据类型对布尔表达式无效。[数据类型(如果已知)= int ,数据类型(如果未知)= nvarchar]。

4

4 回答 4

1

你有

string[] productCode = null;

并且永远不要将任何真实数组分配给该变量。您的其他“阵列”也是如此。

请注意,一旦创建,您就无法更改数组的长度。您可能需要查看List<T>课程。

于 2013-10-31T11:05:05.583 回答
0

声明

在使用你的变量之前,它们应该被实例化。你不能做这个:

string[] productCode = null;
productCode[0] = "KD48Y";
//This results in: 'Object reference not set to an instance of an object.'

这将起作用:

string[] productCode = new string[3]; //can contain 3 strings
productCode[0] = "KD48Y";

但是在您的情况下,我建议您使用 a List<T>,否则当您达到初始限制时,您将无法增加数组的大小。

询问

这个:

SqlCeCommand com5 = new SqlCeCommand("SELECT MAX(OrderID) AS Expr1 FROM Order_Details", con);
orderID = (int)com5.ExecuteScalar(); 
SqlCeCommand com1 = new SqlCeCommand("SELECT ProductCode, Quantity FROM Order_Products WHERE OrderID = ('"+ orderID.ToString() +"')", con);
SqlCeDataReader dr1 = com1.ExecuteReader();

可以用这个代替:

SqlCeCommand com1 = new SqlCeCommand("SELECT ProductCode, Quantity FROM Order_Products 
                                      WHERE OrderID = (SELECT MAX(OrderID) AS Expr1
                                                       FROM Order_Details)", con);

SqlDataReader

为了从您的数据读取器对象中获取值,我建议您为此使用正确的方法,例如GetString()GetInt32(). 有关此的更多信息:SqlDataReader 方法

异常处理

在与 SQL 数据库等数据源或其他会导致异常的操作进行交互时,最好使用异常处理。

SqlConnection connection = new SqlConnection("...");
SqlCommand sql = new SqlCommand("...");
List<Product> products = new List<Product>();
//other instantiations

try
{
    connection.Open();
    sql.ExecuteScalar();
    //other operations
}
catch (Ecxeption ex)
{
    //handle exception and show a message to the user
    MessageBox.Show(ex.Message);
}
finally
{
    //this will always execute, even when an exception occurs
    //good for closing used resources
    connection.Close();
}

我希望这能让你上路!;)

于 2013-10-31T11:43:53.973 回答
0

您应该声明 productName[] 数组长度意味着必须初始化数组长度。

于 2013-10-31T11:01:56.320 回答
0

我会说您正在将 OrderID 转换为字符串,并且在您的数据库中 OrderID 是一个整数。

你的查询不是很好......

orderID = (int)com5.ExecuteScalar(); 
SqlCeCommand com1 = new SqlCeCommand("SELECT ProductCode, Quantity FROM Order_Products WHERE OrderID = "+ orderID+")", con);

或与此非常相似的东西....

于 2013-10-31T11:24:56.267 回答