1

私はc#、sqlce、datatableを使用しています。このクエリで製品を選択します。

select price from products where productid=myproduct and mydate between startdate and finaldate and clientid=myclient

しかし、それには多くの時間がかかります。したがって、データテーブルを使用して製品を保存できます。

datatable prices = new datatable(); 
prices=this.returntable("select productid,startdate,finaldate,client from products")


 for(int i=0;i<allproductsihave;i++) {
    product.newprice=this.getmyprice(prices,product.client,product.id,product.date);
 }


 private decimal getmyprice(datatable products,string myclient, string myproduct, datetime mydate)
 {
   //how do I do at here the equivalent to first sql query?
   //for select a product from a datatable where my date is between 2 dates,
   //and client=myclient and productid=myproduct
   return Convert.Todecimal(datatable.prices[something]["price"].tostring());
 }

このように、製品クエリごとにデータベースに接続する必要はありません。可能ですか?

たぶん convert.todatetime を startdate と finaldate にしていますか?

4

3 に答える 3

2

複数の接続を作成することを心配しているため、データベースに複数のリクエストを作成したくないように聞こえますが、これは遅くなりますか? すべての製品に接続したくない場合は、代わりに「where product in ('xxx', 'yyy')」を使用してみませんか? 次に、単一のクエリ呼び出しがあり、データベースに変更はありません。結果を取得したら、結果を処理できます。

あなたの上司は @pilotcam と話すべきです。彼は正しい。データベース上よりもC#の方が速くはありません。:)

実際、c# でこれを行うと、決して使用しない情報が返されることを意味します (リモート データベースの場合はネットワーク経由であると仮定します)。あなたの最終結果で!

于 2012-06-25T23:10:50.483 に答える
1

DataTable.Select()メソッドは、「where」条件を表す文字列を受け取り、一致する行を含む DataRow の配列を返します。

Datarow[] products = prices.Select(string.Format("'{0}'>='{1}' AND '{0}'<='{2}'", mydate, startdate, finaldate));

日付形式に注意してください!! SQL に準拠している必要があります。

于 2012-06-25T23:07:37.263 に答える
1

コメントに記載されている理由から、この方法には同意しませんが、ここに 1 つの可能性があります。ここでの考え方は、最初に最も明白な除外を確認してから、後で日付に進むことです.

    private decimal GetMyPrice(DataTable table, string client, string product, DateTime date)
    {
        foreach (DataRow row in table.Rows)
        {
            if (row["productid"] != product) continue;
            if (row["client"] != client) continue;
            if (Convert.ToDateTime(row["startdate"]) < date) continue;
            if (Convert.ToDateTime(row["finaldate"]) > date) continue;

            return Convert.ToDecimal(row["price"]); 
        }
        throw new KeyNotFoundException();               
    }
于 2012-06-25T23:25:35.707 に答える