Bonjour, j'ai mis ce sujet dans c# au début, mais il a plus sa place ici (je ne sais pas comment changer de lieu un sujet dans le forum, donc je crée un nouveau sujet, désolé les modérateurs...)
Bonjour,
Voici la configuration de mes datatables que j'utilise dans ma requête linq:
J'ai 2 fichiers dataset ( toutes les colonnes de toutes les tables ont un datatype de spécifié et leur propriété AllowDbNull vaut True):
* deposit_position_imbalance.xsd:
Contient 2 datatables : - "Imbalance"
- "ImbalanceDetailForRealTime"
* dep_pos_imbalance_detail.xsd:
Contient 1 datatable : - "Table"
Dans le code ci-dessous, le problème se situe dans les 2 lignes "deal_date = b.deal_date".
En effet, quand la base de donnée me retourne un b.deal_date qui a une valeur null, ça dit dans deposit_position_imbalance.Designer.cs :
"StrongTypingException was unhandled by user code"
"The value for column 'deal_date' in table 'ImbalanceDetailForRealTime' is DBNull."
"Specified cast is not valid".
Voici où l'erreur surgit:
* J'ai essayé de remplacer la ligne "deal_date = b.deal_date" par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public System.DateTime deal_date { get { try { return ((global::System.DateTime)(this[this.tableImbalanceDetailForRealTime.deal_dateColumn])); } catch (global::System.InvalidCastException e) { throw new global::System.Data.StrongTypingException("The value for column \'deal_date\' in table \'ImbalanceDetailForRealTime\' is DBNull." + "", e);//L'ERREUR SURGIT ICI } } set { this[this.tableImbalanceDetailForRealTime.deal_dateColumn] = value; } }
"deal_date = (DateTime?)b.deal_date"
Mais j'ai 2 erreurs de compilation: "The best overloaded method match for dep_pos_imbalance_detail.TableDataTable.AddTableRow(string, System.DateTime)' has some invalid arguments"
et "Argument '2': cannot convert from 'System.DateTime?' to 'System.DateTime'"
* J'ai aussi essayé de remplacer la ligne "deal_date = b.deal_date" par
"deal_date = b.deal_date == null ? (DateTime)DBNull.Value : b.deal_date"
Mais j'ai 1 erreur de compilation: "Cannot convert type 'System.DBNull' to System.DateTime'"
* J'ai enfin essayé de remplacer la ligne "deal_date = b.deal_date" par
"deal_date = b.deal_date == null ? (DateTime?)DBNull.Value : b.deal_date"
Mais j'ai 1 erreur de compilation: "Cannot convert type 'System.DBNull' to System.DateTime?'"
* J'ai aussi essayer de remplacer "deal_date = b.deal_date"
par "deal_date = b.Isdeal_dateNull() ? default(DateTime?) : b.deal_date"
Et je me retrouve avec les erreurs:
"The best overloaded method match for dep_pos_imbalance_detail.TableDataTable.AddTableRow(string, System.DateTime)' has some invalid arguments"
et "Argument '2': cannot convert from 'System.DateTime?' to 'System.DateTime'"
J'ai mis en copie un imprim écran de la définition de ma colonne deal_date pour que l'on puisse me dire s'il y a quelque chose à modifier éventuellement.
On peut voir que je n'ai pas a priori la possibilité de mettre "System.DateTime?" mais seulement "System.DateTime". Et je ne veux pas autre chose que null comme valeur par défaut (est-ce qu'il faut mettre autre chose que la valeur par défaut "<DBNull>" pour que ça marche?)
UPDATE--> J'ai essayé de mettre null à la place de <DBNull> et le designer met l'erreur : "The string was not recognized as a valid DateTime. There is a unknown word starting at index 0.".
Quand j'essaye aussi de modifier la propriété NullValue pour la faire passer de "(Throw Exception)" à "(Empty)" ou "(Null)", le designer me donne l'erreur "The value entered is not valid for the current data type."
Donc, je ne comprends pas comment gérer la réception de valeurs null (je ne l'ai pas mis dans le code mais j'ai le même problème avec le type double). J'ai l'impression que mes colonnes sont paramétrées pour permettre les valeurs null mais visiblement non...
Merci beaucoup pour votre aide.
Voici ma requête LINQ:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 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); }
Partager