2010-12-19 37 views
3

下面我提供了我的數據庫模式,當前插入的數據庫數據(只有一條記錄)和我正在運行的代碼。這是一個非常簡單的設置,但不返回數據庫中的一條記錄,它不返回任何內容。任何人有任何想法爲什麼?我在這裏我束手無策......極其簡單的SQLite查詢不會返回預期的

表:分包商

列:在(名稱類型)格式如下。

ID guid, 
BusinessName varchar(50), 
Address varchar(200), 
City varchar(50), 
State varchar(50), 
ZipCode varchar(50), 
Contact varchar(50), 
Phone varchar(50), 
Fax varchar(50), 
Email varchar(200), 
GLOPolicy bit, 
GLOLimit bigint, 
GLOExpiration datetime, 
ALPolicy bit, 
ALLimit bigint, 
ALExpiration datetime, 
WCPolicy bit, 
WCLimit bigint, 
WCExpiration datetime, 
ULPolicy bit, 
ULLimit bigint, 
ULExpiration datetime, 
Notes varchar(15000) 

=====

我在我的數據庫中的一個記錄,如下所示。

ID "7b143c19-ad66-46ad-b587-db0bee98cf1e" 
BusinessName "1" 
Address "1" 
City "1" 
State "1" 
ZipCode "1" 
Contact NULL 
Phone NULL 
Fax NULL 
Email NULL 
GLOPolicy False (0) 
GLOLimit NULL 
GLOExpiration NULL 
ALPolicy False (0) 
ALLimit NULL 
ALExpiration NULL 
WCPolicy False (0) 
WCLimit NULL 
WCExpiration NULL 
ULPolicy False (0) 
ULLimit NULL 
ULExpiration NULL 
Notes NULL 

===== * 我試圖下面的查詢,並沒有返回,當它顯然應該返回的唯一記錄,如上圖所示。 *

String ID = "7b143c19-ad66-46ad-b587-db0bee98cf1e"; 
DataTable dt = sqliteQuery.selectFromDatabase("*", "WHERE ID = '" + ID + "'"); 

而對於上述方法的代碼是...

public DataTable selectFromDatabase(String column, String filter) 
    { 
     string SQL = "SELECT " + column + " FROM SUBCONTRACTOR " + filter; 
     SQLiteCommand cmd = new SQLiteCommand(SQL); 
     cmd.Connection = connection; 
     SQLiteDataAdapter da = new SQLiteDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     try 
     { 
      da.Fill(ds); 
      DataTable dt = ds.Tables[0]; 
      return dt; 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
      return null; 
     } 
     finally 
     { 
      cmd.Dispose(); 
      connection.Close(); 
     } 
    } 
+0

首先嚐試選擇沒有過濾。將謂詞設置爲WHERE 1 = 1(總是爲true)而不是篩選器,以確保獲得所有行。如果你不這樣做,那不是錯誤的查詢。此外,您的列類型是一個GUID,但您的查詢使用字符串值。您可能需要轉換。 – 2010-12-19 06:33:38

+0

將篩選器設置爲1 = 1時,它將返回數據庫中的單個記錄,因爲它應該如此。假設有什麼類型的轉換?我在做假設時,所有事情都是以字符串的形式傳遞的......是不是這種情況?如果不是,你知道這樣的轉換嗎? – CODe 2010-12-19 06:35:12

回答

4

它看起來像SQLite不支持GUID類型本身。它受到包裝和插件的支持,但我認爲您在使用類型的方式之間遇到阻抗。您最好將其更改爲TEXT類型。然後你的謂詞將起作用。

編輯

要創建一個新的GUID值插入行作爲一個p鍵只是做:

Guid.NewGuid().ToString(); 

另外,我發現the following info

GUID不(!)本地 SQLite數據類型,但由羅伯特的包裝提供 插件。在連接 字符串中,您可以指定 「BinaryGUID = Yes | No」,其中默認爲 。當「BinaryGUID = Yes」時,存儲器採用16字節的 存儲器來存儲 GUID。現在取決於 「SQLite專家」是否識別出 數據類型GUID。如果是這樣,你應該看它 在它的文件是如何處理 。如果不是,則可能將 視爲文本(可能與無效的 字符數據)。當您更改 SQLite編輯器或包裝時,您將再次遇到此問題 。

當「BinaryGUID =否」的GUID是 存儲爲文本以32-38字節(我 不知道減號標誌和 括號{}是否存儲,你必須 測試)。當存儲不是一個大的問題時,我會建議使用這個 表格。你應該沒有問題 用什麼包裝或DB編輯器 你使用並節省了大量的時間和 麻煩。

這種類型本身似乎有問題。

+0

所以,包裝轉換爲十六進制? Blah,有沒有一種方法可以輕鬆地做到我在上面做的事情的方式,實際上會工作? -_- – CODe 2010-12-19 06:44:11

+1

是的。將您的ID列類型更改爲文本。 (我的答案是我的主要觀點。) – 2010-12-19 06:46:11

+0

我對文本數據類型不熟悉,它是否爲像guid這樣的每個記錄提供了唯一值?或者我必須以某種方式手動執行此操作? – CODe 2010-12-19 06:48:02