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(myName)
from myTable

留言

這個網誌中的熱門文章

DOS Batch指令檔中如何記錄log資訊

用捷徑方式執行需帶入命令列參數的Windows Form程式

使用regular expression來match中括號(square bracket)