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();

誰でもこの問題の解決策を見つけることができますか? 2 つのデータベースから単一の DataGrid に値を追加しようとしています。

編集:

実際、SQL クエリには次のようなものがあります。

ブール式のデータ型が無効です。[データ型 (既知の場合) = int、データ型 (不明の場合) = nvarchar].

4

4 に答える 4

1

あなたが持っている

string[] productCode = null;

その変数に実際の配列を割り当てないでください。同じことが他の「配列」にも当てはまります。

一度作成した配列の長さは変更できないことに注意してください。List<T>クラスを調べる必要があるかもしれません。

于 2013-10-31T11:05:05.583 に答える
0

productName[] 配列の長さを宣言する必要があります。これは、配列の長さを初期化する必要があることを意味します。

于 2013-10-31T11:01:56.320 に答える
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";

しかし、あなたの場合は を使用することをお勧めします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

datareader-object から値を取得するには、 LikeGetString()またはのような適切なメソッドを使用することをお勧めしますGetInt32()。これに関する詳細情報: SqlDataReader Methods

例外処理

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

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