2015-05-06 24 views
5

我使用Dapper.NET,當我執行下面的代碼:Dapper.NET:將varchar(4000),默認

using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      con.Open(); 
      con.Execute(@" insert Clients(name) values(@Name)", new {Name = "John"}); 
      con.Close(); 
     } 

,它執行的查詢是下一個:

(@Name nvarchar(4000)) insert Clients(name) values(@Name) 

而我的問題是:爲什麼Dapper將字符串轉換爲nvarchar(4000)?我的意思是......對數據庫,該場是爲nvarchar(50) ...

有誰面對這樣的錯誤?你如何解決它?你有沒有發現像這樣的另一個錯誤?

+0

我會說(但它是純粹的猜測),這是因爲小巧玲瓏不知道你的表結構什麼,並在.NET'string'是UTF-16(非ANSI字符串),除了內存之外,它可能沒有大小限制。這轉換爲具有最大可用長度的'nvarchar'類型。我會說這不是一個bug,但是你必須自己進行驗證或者在INSERT上捕獲數據完整性違規異常。 –

回答

7

這不是一個錯誤。 Dapper必須爲字符串參數選擇SQL數據類型,而不必查看數據庫結構(更不用說解析查詢並確定將參數插入特定列)。

試想一下,如果你這樣做:

insert Clients(name) values(@Name + 'abc') 

應該短小精悍要搞清楚的是@Name最多可以有47個字符?

您可以具體談談您的參數的大小,如果你喜歡:

con.Execute(@" insert Clients(name) values(@Name)", 
    new { Name = new DbString { Value = "John", Length = 50 }}); 
+0

謝謝,你知道我該如何做這個更具可讀性嗎?因爲如果插入了很多字段(字符串字段),它會非常醜陋......而且有沒有像這樣的另一種類型的東西?謝謝 –