2009-11-10 41 views
3

客戶端在運行我的代碼時出錯。他們向我發送了profilder的SQL。在運行原始SQL時將數據類型varchar轉換爲datetime時出錯,但在LINQ to SQL調用時沒有將datetime轉換爲datetime

當我將其粘貼到SQL Server Management Studio中它失敗:錯誤轉換數據類型爲varchar爲datetime

然而,當我在我的本地開發框或其他客戶生產服務器上運行它不會失敗。

爲了測試我創建了一個簡單的應用程序包含,看起來像一個實體L2S的datacontext:

public class UserAccount 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
    public DateTime? LastActivity { get; set; } 
} 

插入一條記錄,然後更新它:

var account = db.UserAccounts.Single(a => a.Username == "Mojo"); 
account.LastActivity = DateTime.Now; 
db.SubmitChanges(); 

的記錄獲取更新數據庫。但是,當我抓住從探查的T-SQL:

exec sp_executesql N'UPDATE [UserAccount] SET [LastActivity] = @p2 WHERE ([Id] = @p0) AND ([Username] = @p1) AND ([LastActivity] IS NULL)',N'@p0 int,@p1 nvarchar(4),@p2 datetime',@p0=1,@p1=N'Mojo',@p2='2009-11-10 14:04:41.7470000' 

,並在SQL Server Management Studio中執行它,我得到:錯誤轉換數據類型爲varchar爲datetime

我缺少什麼?

+1

什麼是DB中的字段類型LastActivity? – 2009-11-10 07:46:22

+0

LastActivity DateTime null – Pauly 2009-11-11 04:59:54

回答

1

您是否在您的測試應用程序中使用Management Studio中的相同連接?這聽起來好像不是這種情況,連接有不同的區域設置,導致日期分析不同。

+0

所有優秀的答案,但這是最接近的。通過將「連接」部分的「無數」屬性設置爲打開,解決了該問題。該文檔說:「SET NOCOUNT ON消除了在存儲過程中爲每條語句發送DONE_IN_PROC消息到客戶端。」不知道爲什麼這會做到這一點。 – Pauly 2009-11-12 06:06:29

3

問題是與在日結束的額外的零:

'2009-11-10 14:04:41.747' (works) 
'2009-11-10 14:04:41.7470000' (error converting...) 

四個額外的零可能是在Visual Studio調試器剛剛可見。 LINQ不會將它們發送到SQL Server。

1

不同版本的SQL Server也許?

在迄今爲止的多餘的零將使這是可以接受在2008年,但2005年沒有

1

DATETIME應該秒鐘後,只有3位的DATETIME2類型,DATETIME2秒後有7位數字。似乎該字符串的格式爲DATETIME2

0

我得到這個錯誤當我試圖插入日期時間爲「1/1/0001上午12時零零分00秒」