2013-07-02 25 views
0

通過完美的SQL查詢,我的意思是說,裏面的WebMatrix,如果我執行以下查詢,它的工作完美:爲什麼C#不會接受(看似)完美的Sql Server CE查詢?

SELECT page AS location, (len(page) - len(replace(UPPER(page), UPPER('o'), '')))/len('o') AS occurences, 'pageSettings' AS tableName FROM PageSettings WHERE page LIKE '%o%' 
UNION 
SELECT pageTitle AS location, (len(pageTitle) - len(replace(UPPER(pageTitle), UPPER('o'), '')))/len('o') AS occurences, 'ExternalSecondaryPages' AS tableName FROM ExternalSecondaryPages WHERE pageTitle LIKE '%o%' 
UNION 
SELECT eventTitle AS location, (len(eventTitle) - len(replace(UPPER(eventTitle), UPPER('o'), '')))/len('o') AS occurences, 'MainStreetEvents' AS tableName FROM MainStreetEvents WHERE eventTitle LIKE '%o%' 

我在這裏使用'o'爲靜態搜索字符串時進行搜索。沒問題,但不是非常動態的。

現在,當我把這個查詢寫成C#中的一個字符串,並且我認爲它應該是(甚至正如我以前所做的那樣),我得到一個服務器端錯誤,指出該字符串的格式不正確。下面是錯誤的PIC:

enter image description here

和(雖然我只測試的輸出,我應該讓它退出犯錯誤),這裏是真正的C#(即.cshtml)頁面查詢數據庫:

@{ 
    Layout = "~/Layouts/_secondaryMainLayout.cshtml";  

    var db = Database.Open("Content"); 
    string searchText = Request.Unvalidated["searchText"]; 
    string selectQueryString = "SELECT page AS location, (len(page) - len(replace(UPPER(page), UPPER(@0), '')))/len(@0) AS occurences, 'pageSettings' AS tableName FROM PageSettings WHERE page LIKE '%' + @0 + '%' "; 
    selectQueryString += "UNION "; 
    selectQueryString += "SELECT pageTitle AS location, (len(pageTitle) - len(replace(UPPER(pageTitle), UPPER(@0), '')))/len(@0) AS occurences, 'ExternalSecondaryPages' AS tableName FROM ExternalSecondaryPages WHERE pageTitle LIKE '%' + @0 + '%' "; 
    selectQueryString += "UNION "; 
    selectQueryString += "SELECT eventTitle AS location, (len(eventTitle) - len(replace(UPPER(eventTitle), UPPER(@0), '')))/len(@0) AS occurences, 'MainStreetEvents' AS tableName FROM MainStreetEvents WHERE eventTitle LIKE '%' + @0 + '%'"; 

    @:beginning <br/> 
    foreach (var row in db.Query(selectQueryString, searchText)) 
    { 
     @:entry 
     @:@row.location &nbsp; 
     @:@row.occurences &nbsp; 
     @:@row.tableName 
     <br/> 
    } 
} 

由於它是在foreach (var row in db.Query(selectQueryString, searchText))線犯錯誤,這很大程度上表明,什麼是錯我的查詢,然而,一切似乎是正確的給我介紹的語法在這裏,如果我查詢它甚至執行到完美數據庫(介意你,未參數化)直接。從邏輯上講,我認爲我在參數化這個查詢時涉及到的語法有問題,但是,我的雙重和三重檢查(以及我過去的經驗)堅持這裏的一切看起來都很不錯。

我弄亂了參數化這個查詢所涉及的語法,或者是我在忽略的其他玩法嗎?

我知道我可以告訴你,因爲它已經被測試過了,我從查詢字符串得到的值確實是我期望的值,但是因爲實際上沒有在.cshtml頁面上還有其他許多內容,這就是我可以告訴你的全部內容。

+0

如果傳入'.Query()'的參數對象類型與SQL @ 0變量所期望的不匹配,通常會發生此錯誤。在這種情況下,我想知道在查詢字符串中的多個位置指定相同的參數是否有效。 – 2013-07-02 13:59:52

+0

是因爲有0而不是0嗎?真的只是一個平底船 –

+0

@ebyrob其實,這是合法的,因爲我之前使用過它(並且感謝它的好處)。但待機,我想我已經發現了這個問題。將在一秒內發佈。 – VoidKing

回答

1

找到答案,我2天的長尋求解決這個問題,只是在這裏張貼問題後,但很可惜,在看一些舊的代碼我用一點點接近的時候,我發現,在LIKE句話我實際使用CAST這樣,如果在LIKE語句在我上面的例子中,它應該是這樣的:

LIKE '%' + CAST(@0 AS nvarchar) + '%' 

我想一個常規的C#字符串是不一樣的事,作爲一個SQL nvarchar數據類型。

對於任何人,如果任何人(包括我自己)都可以從更精確的解釋中獲益,那麼對於任何人來說,這仍然是一個可以接受和讚許的觀點(也就是說,如果還有什麼比一個簡單的「它只是不同的數據類型」的解釋)。 (注意:如果它有助於任何未來的瀏覽者知道,LIKE語句中的參數是ALL我改變了。我不必對在參數外部寫入的參數進行轉換或改變任何語法LIKE短語)。

1

這是一個遠射,但可能會流露出一些光芒。嘗試執行以下查詢,讀取結果:

select top 1 sql_variant_property(@0, 'BaseType') as type from MainStreetEvents; 

對於不報錯了任何傳遞的對象參數,你應當得到有關被用來代表它哪些SQL類型信息。

+0

這是一個非常好的主意,但似乎SQL Server CE不能識別'sql_variant_property'。再一次,雖然這是一個好主意進行測試。 – VoidKing

+0

@VoidKing拍攝。我唯一能想到的其他事情是運行一個到服務器的未加密的tcp連接,並嗅探連接以查看進入SQL Server的原始命令的外觀。 (可能所有的本地在你的設置中,雖然是正確的?爲什麼還要運行SQL CE?) – 2013-07-08 14:25:28

+0

實際上,在開發過程中它完全是本地的,我不斷需要更新我迄今在服務器環境中設計的內容,以便我可以測試站點在32位機器(即機器上的32位瀏覽器*)上的外觀(和行爲)。你會用什麼來嗅探TCP數據包,就像WireShark?我在想什麼正確的節目? – VoidKing

相關問題