2011-01-21 34 views
0

在Delphi XE,我存儲CRC32驗證字符串的SQLite數據庫,聲明爲INTEGER列。我的理解是,SQlite不區分整數類型:int,int64,signed和unsigned,就數據庫而言,它們都是相同的。但是,當我在Delphi中存儲一個聲明爲longword的值時,WHERE子句稍後無法與該值匹配。sqlite的WHERE子句和德爾福XE長字值

我的INSERT語句(這裏下調)是:

INSERT INTO main VALUES (id, crc) (?, ?); 

的長字值將被綁定到第二個參數,並且一切順利。但是當我做

SELECT id FROM main WHERE crc = ?; 

查詢返回沒有結果。

查看在SQLiteSpy數據庫,該長字值顯示爲負整數。如果我使用從該顯示中複製並粘貼的負值執行上述SELECT,則查詢將返回預期的記錄。

這似乎是,當我長字值綁定到INSERT語句時,SQLite做別的東西然後當我結合相同的長字值的SELECT語句。將值轉換爲整數(在Delphi代碼中,而不是在SQL中)修復了這個問題,但它不應該是必須的,並且很容易忘記在其他地方投射。有更好的解決方案嗎? SQLite的行爲是否正確?

+0

你爲什麼不使用符號的整數?如果這就是數據庫想要的,那麼也許你應該使用它。知道數據庫如何存儲數據,而不是猜測和使用試驗和錯誤對你來說是有益的。 – 2011-01-21 14:06:49

+0

@David你可以將無符號的32位(即DWORD = cardinal)存儲到Int64中,而不需要任何技巧。這個問題不在SQlite中,而是以moodforaday的方式在綁定時強調DWORD值。 – 2011-01-21 15:02:40

回答

1

的問題是不是在SQLite的,但在路上你的參數綁定到SQLite的引擎。

取決於你使用SQLite的框架,就必須明確地綁定一個Int64到您的語句:

INSERT INTO main VALUES (id, crc) (?, ?); 

例如,使用我們的框架,以CRC聲明爲樞機主教,則必須使用此代碼(而不是任何整數(CRC)):

sqlite3_check(RequestDB,sqlite3_bind_Int64(Request,2,Int64(CRC))); 

如果上面的代碼不能正常工作,這將始終工作:

var CRC64: Int64; 
    CRC64Rec: TInt64Rec absolute CRC64; 
begin 
    CRC64Rec.Lo := CRC; 
    CRC64Rec.Hi := 0; 
    sqlite3_check(RequestDB,sqlite3_bind_Int64(Request,2,CRC64)); 

在所有情況下,沒有顯示關於綁定參數你自己的代碼,就很難知道什麼是錯在你的代碼。