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