2010-03-02 3 views
1

Cette requête (ou plutôt une requête similaire) se trouve dans une base de code que nous avons déjà déployée. DB est un datacontext qui se connecte à la base de données. TimeBlocks est une table assez simple, StartDate est une colonne DateTime.Puis-je forcer Linq à Sql à utiliser Sql2005Provider

Actuellement, la base de données est hébergée sur une installation Sql Server 2005, mais nous sommes en train de passer à une installation Sql Server 2008.

La requête s'exécute actuellement sans problème.

Si nous changeons la chaîne de connexion pour pointer à une copie de la même base de données en cours d'exécution sur Sql Server 2008 (avec le niveau de compatibilité fixé pour 2005) la requête échoue avec le SqlException:

« Le datepart milliseconde n'est pas pris en charge par date fonction dateadd pour le type de données date. "

Cela semble être dû au sql différent émis par Linq à SQL quand il se connecte au 2008db (je suppose que c'est parce qu'il utilise Sql2008Provider au lieu du Sql2005Provider).

Le fournisseur 2005 produit une bonne SQL:

SELECT [t0].[Id] 
FROM [dbo].[TimeBlock] AS [t0] 
WHERE DATEADD(ms, (CONVERT(BigInt,@p0 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,@p0 * 86400000))/
    86400000, DATEADD(HOUR, -DATEPART(HOUR, [t0].[StartDate]), DATEADD(MINUTE, -DATEPART(MINUTE, 
     [t0].[StartDate]), DATEADD(SECOND, -DATEPART(SECOND, [t0].[StartDate]), DATEADD(MILLISECOND, 
     -DATEPART(MILLISECOND, [t0].[StartDate]), [t0].[StartDate])))))) <= @p1 

qui exécute avec succès la requête. Cependant, le sql émis par le Sql2008Provider:

SELECT [t0].[Id] 
FROM [dbo].[TimeBlock] AS [t0] 
WHERE DATEADD(ms, (CONVERT(BigInt,@p0 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,@p0 * 86400000))/
86400000, CONVERT(DATE, [t0].[StartDate]))) <= @p1 

Contient la sql erronée qui fait l'exception.

Ai-je raison de penser que c'est le fournisseur Sql qui cause ce problème?

Existe-t-il un moyen de contourner ce problème en forçant le DataContext à utiliser le Sql2005Provider pour ce db?

Merci pour toute aide que vous pouvez nous donner!

+1

trouvé le rapport de bogue ici: https://connect.microsoft.com/VisualStudio/feedback/details/366011/linq-to-sql-query-translator-produces-syntactically-incorrect -t-sql-from-datetime-date-method –

Répondre

1

Il me semble que vous avez trouvé un bug dans LINQ to SQL. Vous devriez le signaler à Microsoft. Vous pouvez le faire ici: http://connect.microsoft.com/

+1

Ah oui, merci. Oui, j'aurais probablement dû y regarder d'abord. https://connect.microsoft.com/VisualStudio/feedback/details/366011/linq-to-sql-query-translator-produit-syntactically-incorrect-t-sql-from-datetime-date-method C'est la bug, corrigé en 4.0. Big Help :( Encore, je vais laisser la question, incase quelqu'un sait comment forcer le fournisseur 2005. –