發表文章

目前顯示的是 8月, 2013的文章

MSSQL字串長度在EntityFramework中比對失敗

在開始使用Entity Framework後,一切的ORM都是用.NET Entity Framework來自動產生的。 查詢資料庫的方式也改用了LINQ的語法。例如要查詢某資料表某欄位是否為某等定字串時,可以用如下的語法: var result = from myRow in myTable where myRow.Name == "MyFirstName" select myRow; 但神奇的是,某一天這段語法失靈了。就算資料庫中有符合條件的資料也無法被篩選出來。 如果將語法改為使用StartWith()的方式,則可以正常地找出所要的資料。 var result = from myRow in myTable where myRow.Name.StartWith("MyFirstName") select myRow; 此時開始懷疑是不是資料庫裏那個欄位的資料後面是有空白字元的。這個資料欄位一開始時是以ncahr()的方式開立的,在輸入一些資料後,因為設計上的調整,所以改為使用nvarchar()的型別。 於是就用SQL指令去查了一下資料欄位的字串長度是不是含有空白字元,使用的SQL語法如下: select Name, LEN(Name) as NameLength from myTable 由顯示的結果來看,資料欄裏字串的長度也沒錯啊,看來是沒有包含空白字元。但使用LINQ的語法就是無法用==的方式來查詢所要的資料。 後來想說去查一下SQL的 LEN() 函式的定義,看看是否有特別的部份。哇,原來函式的定義如下,是不包含尾部的空白字元的耶。那如果要查看原始字串長度要用哪個函式呢? Returns the number of characters of the specified string expression, excluding trailing blanks. 原來要查到真正的原始字串長度的話,要用 DATALENGTH() 才行。 一查之下才知道,原來原本用ncahr()改為nvarchar()後,原先輸入的字串資料還是保留了原本後面的空白字元。 如果要修改資料的話,可以用以下的SQL指令: update myName = RTRIM(my