2013-02-28 143 views
1

我收到以下異常在我的SQLite查詢:未定義的函數調用低()

表達式包含未定義的函數調用低()

我有輸入一個非常簡單的SQLite數據集在VS2012。

我解析了大量的數據,並希望在添加新行之前檢查一行是否已經存在。我使用.select()方法返回一個數組行。如果數組的長度爲零,我添加一個新的。簡單!

所有工作都很好,但我添加了一個檢查來防止重複的行被添加,如果案件是錯誤的。我正在存儲文件名。

select語句是:

"lower(FileName) = '" + EscapeFileName(strFileName).ToLower() + "'" 

但是我上下(文件名)上述錯誤。如果我刪除這是工作正常,但顯然檢查是不可比較的。

該聲明在SQLiteAdmin中按預期工作。

+0

如果您發現某個答案適合您,請記住爲了未來的訪問者「接受」它。 – JDB 2013-02-28 15:54:08

回答

2

如果我理解正確,你有一個.NET DataTable(查詢的結果),你打電話給DataTable.Select(string)傳遞一個where子句。

此where子句由.NET處理,而不是由SQLite處理(正如Tim指出的那樣)。您不能在DataTable的Select函數中使用SQLite(或任何其他DBMS)函數。您可以使用這些功能:

  • CONVERT - 特定表達式轉換爲指定的。.NET框架類型
  • LEN - 獲取一個字符串的長度
  • ISNULL - 檢查的表達,要麼返回檢查表達或一個替換值
  • IIF - 根據兩個值中的一個得到邏輯表達式
  • TRIM的結果 - 刪除所有的前緣和後空白字符,如\ r \ N,\噸,「
  • SUBSTRING - 得到了指定長度的子串,字符串

更多信息請參見DataView RowFilter Syntax [C#]在起始於一個指定點。

+0

所以WHERE子句永遠不會發送到SQLite ...嗯...所以我需要調整TableAdapter,因此它總是以小寫形式返回文件名,因爲這將由SQLite正確執行? – Corneloues 2013-02-28 15:02:25

+0

這對我來說似乎是一個很好的策略,但顯然你是唯一能夠訪問代碼的人。 (見更新) – JDB 2013-02-28 15:04:20

+0

所以打我的第一個問題。在您發出'.Update()'之前,所有程序都可以正常工作。由於適配器中的'Lower(FileName)As [FileName]',自動創建的** INSERT **語句不會將FileName保存回表中。我需要弄清楚如何爲** INSERT **編寫自定義查詢。 – Corneloues 2013-02-28 23:11:35

1

The statement works as expected in SQLiteAdmin.

該客戶端的數據的對象不調用服務器側的功能,但客戶端功能。

編輯: DataTable有一個CaseSensitive選項可以設置爲false。

P.P.S.在.NET數據對象中有一組記錄(即,您的選擇已被執行並且行集已被檢索到)之後,數據對象的內置方法(select,find等)進一步過濾數據,在本地,客戶端斷開連接數據;與數據庫的「對話」尚未進行。這些客戶端方法不是「將指令傳遞給」數據庫。閱讀Disconnected Recordset模型。

+0

較低(FileName)由SQLite處理。使用EscapeFileName(strFileName).ToLower()的結果。有沒有客戶端函數調用的任何地方: '「下(文件名)=‘這 - 是 - 在 - 低級case.txt’」' – Corneloues 2013-02-28 14:57:09

+0

@Tim你是正確的,但你的回答是,除非你極其混亂已經知道問題是什麼。您可能希望通過解釋差異等來進行修改。爲實際問題提供解決方案也是有幫助的。 – JDB 2013-02-28 15:06:26

+0

@ Cyborgx37:會做的。增加了一個P.S.與解決方案。 – Tim 2013-02-28 15:09:26