2016-08-03 6 views
0

データバインドされたデータグリッドがあり、使用されている製品の量を示します。LINQ to SQL(Null可能な余分な列を含む)

名前のとおり、この量を調整するための量を指定する余分な列があります。バインディングのソースを定義するSQLに

LINQはadjust_dtusage_adjustmeasure_idがフィールドが追加され

public BindingList<MeterRead> QryMeterRead 
{ 
    get 
    { 
     var list = new BindingList<MeterRead>(); 
     list.AllowNew = false; 
     list.AllowRemove = false; 
     var records = ExecuteQuery<MeterRead>(
      @"select 
       mr.meter_rd_id, 
       mr.meter_id, 
       mr.read_dt, 
       mr.prev_dt, 
       mr.reading, 
       mr.demand_reading, 
       mr.usage, 
       mr.orig_usage, 
       mr.prev_usage, 
       mr.estimated, 
       mr.kvar_reading, 
       mr.change_out_from_id, 
       mr.multi_mtr_est, 
       adjust_dt = convert(datetime, null), 
       usage_adjust = convert(integer, null), 
       measure_id = convert(integer, null), 
       mr.location_id, 
       'customer_id' = {0}, 
       'group_id' = {1} 
      from ub_meter_read mr (nolock) 
      where mr.meter_id = {2} 
      order by meter_rd_id desc", usageparams.read_customer_id, usageparams.read_group_id, usageparams.read_meter_id); 
     if (records != null) 
     { 
      foreach (MeterRead rec in records) 
      { 
       list.Add(rec); 
      } 
     } 
     return list; 
    } 
} 

あります。彼らはテーブルには存在しませんが、データ調整が可能です。

フォームのデータグリッドで、[保存]ボタンをクリックしたときにコミットするデータを変更できます。

usage_adjustの値を変更するような形でフォームを変更し、基になるLINQデータソースがそれらの変更を取得します。

すべていいです。 の値を削除して、これらの変更を削除しようとすると、LINQがそれらをバインドしようとしているように見えます。データグリッドに対して誤ったヌル参照エラーがスローされているようです。

私は他の人がこれを見つけたと推測していますが、それをどう呼び出すべきか、このタイプのエラー条件を検索する方法はわかりません。

誰もこの種の問題を解決する良い方法を知っていますか?

+0

LINQクエリがありますか? –

答えて

0

当分の間、usage_adjustのデフォルト値を0に設定するとエラーが停止しました。

const string sqlfrmt = 
    @"select 
     mr.meter_rd_id, 
     mr.meter_id, 
     mr.read_dt, 
     mr.prev_dt, 
     mr.reading, 
     mr.demand_reading, 
     mr.usage, 
     mr.orig_usage, 
     mr.prev_usage, 
     mr.estimated, 
     mr.kvar_reading, 
     mr.change_out_from_id, 
     mr.multi_mtr_est, 
     adjust_dt = convert(datetime, null), 
     usage_adjust = convert(integer, 0), 
     measure_id = convert(integer, null), 
     mr.location_id, 
     'customer_id' = {0}, 
     'group_id' = {1} 
    from ub_meter_read mr (nolock) 
    where mr.meter_id = {2} 
    order by meter_rd_id desc"; 

さて、データグリッドが空白される代わりに、それはそれで0を持っている、と私は0調整してフィールドをスキップする更新ルーチンにコードを提供してきました。

partial void UpdateMeterRead(MeterRead instance) 
{ 
    try 
    { 
     if (instance.usage_adjust != 0) 
     { 
      sp_ub_adjust_usage(instance.location_id, instance.meter_id, instance.group_id, instance.adjust_dt, instance.usage_adjust, 
       instance.meter_rd_id, instance.measure_id, instance.customer_id, BaseContext.CurrentSpid); 
     } 
    } 
    catch (Exception err) 
    { 
     Console.WriteLine(err); 
    } 
} 

誰かがこの問題を次の1〜2ヶ月で解決する説明をした場合、その回答を受け入れます。私は後日ファイルを編集するため

パス:

Drive:\ICIS_7V04T52\in\Main\in\o\in.o.ub\am\Readings\ua\DataDB\uaDB.cs 
+0

LINQクエリもパラメータ化クエリも使用していません。あなたのコードはデータからSQL文字列を生成するだけで、SQLインジェクション攻撃やフォーマット問題(あなたが見つけたように)などを表示します。 'NOLOCK'ヒントは、あなたが(間違って)汚れたデータを読むことによって –

+0

実際のLINQクエリは、 'list = myDbContext.MeterReads.Where(x => x.meter_id = someValue).OrderBy(x => x.meter_rd_id).Select(...).ToList()'またはクエリフォームで 'from x from myDbContext.MeterReads x.meter_id = someValue ... 'のようになります。 –

+0

これは@PanagiotisKanavosとは書きませんでした。私はデータバインディングの大ファンではない。このコードは、VSのLINQ to SQLクラスの一部です。データセットにはデータテーブルに存在しない列が含まれているため、コードビハインドで手動で作成されます。再び、私はそれを書いていませんでした。パラメータはフォームフィールドから取得されません。私がやっていることを語る良い方法があれば、詳しく教えてください。 – jp2code

関連する問題