Problème avec une requête Linq et le format de date
J'ai une application console C# écrit à l'aide de Visual Studio 2008.
Mon système de culture est en-GB. J'ai une requête Linq qui ressemble à ceci:
var myDate = "19-May-2010";
var cus = from x in _dataContext.testTable
where x.CreateDate == Convert.ToDateTime(myDate)
select x;
L'résultant de la requête SQL génère et l'erreur, car il renvoie la date du "19/05/2010" il interprète comme une date incorrecte. Pour une raison quelconque, même si mon système de culture est défini à en-GB, on dirait qu'il essaie de intrepret comme un fr-fr date.
Des idées comment je contourner ce problème?
Edit: Merci pour les commentaires à propos de la magie des cordes et du var de l'abus, mais ce n'est pas mon problème. Mon problème est que dans la conversion de Linq to SQL les dates sont interprétées comme NOUS le format des dates (19/05/2010 est interprété comme: dix-neuf mois, jour 5 et l'année 2010) ce qui entraîne le message d'erreur suivant:
System.Data.SqlClient.SqlException: The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value
La clause where de la requête SQL ressemble:
WHERE ([t0].[CreateDate] = '19/05/2010 00:00:00')
Veuillez noter que la même requête Linq fonctionne parfaitement dans LinqPad.
J'ai essayé de la clause where suivante:
where x.CreateDate == DateTime.Today
et obtenez toujours l'erreur.
Informations Supplémentaires:
De Requête de SQL Server Visualizer:
SELECT [t0].[field1], [t0].[field2], [t0].[field3] AS [field4], [t0].[field5]
FROM [dbo].[table] AS [t0]
WHERE ([t0].[CreateDateTime] = '19/05/2010 00:00:00')
Original query:
SELECT [t0].[field1], [t0].[field2], [t0].[field3] AS [field4], [t0].[field5]
FROM [dbo].[table] AS [t0]
WHERE ([t0].[CreateDateTime] = @p0)
-------------------------------
@p0 [DateTime]: 19/05/2010 00:00:00
LINQPad:
-- Region Parameters
DECLARE @p0 DateTime SET @p0 = '2010-05-19 00:00:00.000'
-- EndRegion
SELECT [t0].[field1], [t0].[field2], [t0].[field3] AS [field4], [t0].[field5]
FROM [table] AS [t0]
WHERE ([t0].[CreateDateTime] = @p0)
Ci-dessus, je remarque que LinqPad présente la date dans un format différent de VS.
Grâce.
Alan T
Vous devez vous connecter pour publier un commentaire.
De ne pas envoyer de chaînes locales dans la base de données et de demander à la base de données à convertir ces chaînes en DateTimes. Il suffit de ne pas.
À l'origine:
Donc...
En réponse à la mise à jour.
Réponse courte est "ne pas utiliser de chaînes pour représenter les dates".
En supposant que le CreateDate colonne est un datetime SQL Server, vous devriez être en mesure de faire de votre comparer avec un .NET classe DateTime.
Vous pouvez utiliser:
Cela suppose, bien sûr, que votre date dans la DB correspond à votre madate champ (c'est à dire si vous avez le temps inclus avec la date, vous devrez modifier le ci-dessus pour la partie heure).
Que le projet de Loi dit, ne pas utiliser de chaînes de caractères pour représenter les dates. LINQ to SQL utilise des requêtes paramétrées pour passer les paramètres de sorte que vous ne devriez pas avoir de problèmes avec les paramètres régionaux - à condition que votre champ de base de données et vos paramètres sont les deux dates.
Vous pouvez vérifier l'instruction SQL générée par la fixation d'un TextWriter objectifs (comme la Console.Out) pour le DataContext de la propriété du Journal.Le code suivant
produit cette requête
Comme vous le voyez, la requête a un paramètre de type DateTime et renvoyé le bon entrées.
Quel est exactement l'erreur que vous rencontrez? Ne vous obtenez une exception ou obtenez-vous des résultats incorrects?
Si vous n'obtenez pas de résultats, peut-être que votre champ de base de données contient une valeur de temps, auquel cas il ne correspond pas à un paramètre qui ne contient qu'une valeur de date
Ce qui se passe lorsque vous essayez cette
Je sais que vous avez probablement vérifié cela, mais pouvez-vous vérifier les éléments suivants:
Basée sur le fait que vous êtes en voyant le succès avec la requête en LinqPad, je soupçonne qu'il ya quelque chose de mal avec l'CreateDate de la propriété ou de la définition SQL de ce champ. Je suis VRAIMENT suspect que votre Linq-to-SQL sortie de dit "OÙ ([t0].[CreateDate] = '19/05/2010 00:00:00')" au lieu de "OÙ ([t0].[CreateDate] = @p0)".