0

linq クエリで使用するデータテーブルの構成は次のとおりです。2 つのデータセット ファイルがあります (すべてのテーブルのすべての列に DataType が指定され、AllowDbNull プロパティが True に設定されています)。 - 不均衡 - ImbalanceDetailForRealTime * dep_pos_imbalance_detail.xsd: 1 つのデータテーブルを含む: - テーブル

以下のコードでは、問題は「deal_date = b.deal_date」の 2 行にあります。実際、null 値を持つデータベース b.deal_date から取得すると、deposit_position_imbalance.Designer.cs に次のように表示されます。 " 「指定されたキャストは無効です」。エラーがスローされる場所は次のとおりです。

    [グローバル::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            public System.DateTime deal_date {
                得る {
                    試す {
                        return ((global::System.DateTime)(this[this.tableImbalanceDetailForRealTime.deal_dateColumn]));
                    }
                    キャッチ (global::System.InvalidCastException e) {
                        throw new global::System.Data.StrongTypingException("テーブル \'ImbalanceDetailForRealTime\' の列 \'deal_date\' の値は DBNull です。" +
                                "", e);//エラーがここにスローされる
                    }
                }
                設定 {
                    this[this.tableImbalanceDetailForRealTime.deal_dateColumn] = 値;
                }
            }
  • 「deal_date = b.deal_date」という行を「deal_date = (DateTime?)b.deal_date」に置き換えようとしましたが、次の 2 つのコンパイル エラーが発生します。 DateTime)' には無効な引数があります" および "引数 '2': 'System.DateTime から変換できませんか?' 「System.DateTime」へ」
  • また、「deal_date = b.deal_date」という行を「deal_date = b.deal_date == null ? (DateTime)DBNull.Value : b.deal_date」に置き換えようとしましたが、次のコンパイル エラーが表示されます。 .DBNull' から System.DateTime'"
  • 次に、「deal_date = b.deal_date」という行を「deal_date = b.deal_date == null ? (DateTime?)DBNull.Value : b.deal_date」に置き換えようとしましたが、コンパイル エラーが発生しました:「型を変換できません ' System.DBNull' から System.DateTime?'"
  • 別のことを試してみました: "deal_date = b.deal_date" を "deal_date = b.Isdeal_dateNull() ? default(DateTime?) : b.deal_date" に置き換えますが、ここでも次のエラーが発生します: dep_pos_imbalance_detail.TableDataTable.AddTableRow(string, System.DateTime)' に無効な引数があります" および "引数 '2': 'System.DateTime から変換できませんか?' 次の画像 (申し訳ありませんが、stackoverflow に画像を挿入することはまだ許可されていないため、代わりにリンクを貼ります) は、データセット内の列 deal_date の定義を示しています: https://lh5.googleusercontent. com/-TEZZ9Hdnkl4/T1aRxF_i7II/AAAAAAAAAAg/BwzrVXIlOHE/s323/deal_date.jpg 「System.DateTime?」を設定する可能性がないように見えることがわかります。ただし、「System.DateTime」のみです。そして、デフォルト値として null 以外は必要ありません (それを機能させるために、デフォルト値 "" 以外のものを入れる必要がありますか?) UPDATE--> の代わりに null を入れようとしましたデザイナーは、「文字列は有効な DateTime として認識されませんでした。インデックス 0 から始まる不明な単語があります。」というエラーを返します。

そのため、null 値を取得する方法がわかりません (コードには入れていませんが、double 型にも同じ問題があります)。列が null 値を有効にするように設定されているように見えますが、明らかにそうではありません... また、NullValue プロパティを変更して "(Throw Exception)" から "(Empty)" または "(Null)" に変更しようとすると、 、デザイナーは次のエラーを返します:「入力された値は、現在のデータ型に対して有効ではありません。」ご協力ありがとうございました。これが私のLINQクエリです:

deposit_position_imbalance.ImbalanceDataTable dtImbalanceForRealTime;
deposit_position_imbalance.ImbalanceDetailForRealTimeDataTable dtImbalanceDetailForRealTime;

dtImbalanceForRealTime = (deposit_position_imbalance.ImbalanceDataTable)(((deposit_position_imbalance)(dataManager.GetConfig(grid1).ParentDataSource)).Imbalance);
dtImbalanceDetailForRealTime = this.detailForRealTime;

// we separate security_id null and not null
// Security id is not null
deposit_position_imbalance.ImbalanceDataTable iWithSecurityIdNotNull = new deposit_position_imbalance.ImbalanceDataTable();
deposit_position_imbalance.ImbalanceRow[] dr1 = (deposit_position_imbalance.ImbalanceRow[])dtImbalanceForRealTime.Select("security_id is not null");
if (dr1.Count<deposit_position_imbalance.ImbalanceRow>() > 0)
{
    DataTable looselyTypedDT1 = dr1.CopyToDataTable<deposit_position_imbalance.ImbalanceRow>();
    iWithSecurityIdNotNull.Merge(looselyTypedDT1, true);
}

// Security id is null
deposit_position_imbalance.ImbalanceDataTable iWithSecurityIdNull = new deposit_position_imbalance.ImbalanceDataTable();
deposit_position_imbalance.ImbalanceRow[] dr2 = (deposit_position_imbalance.ImbalanceRow[])dtImbalanceForRealTime.Select("security_id is null");
if (dr2.Count<deposit_position_imbalance.ImbalanceRow>() > 0)
{
    DataTable looselyTypedDT2 = dr2.CopyToDataTable<deposit_position_imbalance.ImbalanceRow>();
    iWithSecurityIdNull.Merge(looselyTypedDT2, true);
}

var queryWithSecurityIdFound =
    from a in iWithSecurityIdNotNull
    join b in dtImbalanceDetailForRealTime
    on new
    {
        a.situation_date,
        a.security_id,
        a.deposit_location_id,
        a.account_keeper_id
    }
        equals new
        {
            b.situation_date,
            b.security_id,
            b.deposit_location_id,
            b.account_keeper_id
        }
    where a.situation_date == situation_date
       && a.security_id == security_id
       && a.deposit_location_id == deposit_location_id
       && a.account_keeper_id == account_keeper_id
    select new
    {
        name = a.bo_source_name,
        deal_date = b.deal_date
    };

var queryWithSecurityIdNotFound =
    from a in iWithSecurityIdNull
    join b in dtImbalanceDetailForRealTime
        on new
        {
            a.situation_date,
            a.security_code,
            a.deposit_location_id,
            a.account_keeper_id
        }
        equals new
        {
            b.situation_date,
            b.security_code,
            b.deposit_location_id,
            b.account_keeper_id
        }
    where a.situation_date == situation_date
       && a.security_id == security_id
       && a.deposit_location_id == deposit_location_id
       && a.account_keeper_id == account_keeper_id
    select new
    {
        name = a.bo_source_name,
        deal_date = b.deal_date
    };

var query_final = queryWithSecurityIdFound.Union(queryWithSecurityIdNotFound);
//We fill the 'dep_pos_imbalance_detail Table'
grid1.Clear();
foreach (var item in query_final)
{
    ((dep_pos_imbalance_detail.TableDataTable)grid1.DataSet.Tables["Table"]).AddTableRow(item.name, item.deal_date);
}

4

2 に答える 2

1

これが の場合、代わりに使用する必要があるstrongly typed DataSetnull 許容列のプロパティを自動生成します。Isdeal_dateNull

if (!row.Isdeal_dateNull)
{
   //do something
}
于 2012-03-06T15:38:09.603 に答える
0

私の問題を解決する方法を見つけました。私の LINQ クエリでは、「deal_date = b.deal_date」を「deal_date = b.Field('deal_date')」に置き換えます。その後、変換を行うことができます。次に、デザイナーが自動生成したメソッド「AddTableRow」を使用できません。正しいタイプが想定されていないためです。しかし、私はこれを少し長く書いていますが効果的です:

dep_pos_imbalance_detail.TableDataTable dt = ((dep_pos_imbalance_detail.TableDataTable)grid1.DataSet.Tables["Table"]);
dep_pos_imbalance_detail.TableRow dr = dt.NewTableRow();
foreach (var item in query_final)
{
   dr = dt.NewTableRow();
   dr.name = item.name;
   if (item.deal_date.HasValue)
       dr.deal_date = item.deal_date.Value;
   else
       dr.Setdeal_dateNull();
   dt.AddTableRow(dr);
}
于 2012-03-09T14:06:18.377 に答える