2008-11-17 22 views
4

MS Access允許使用數字類型的GUID(在德語中稱爲「Replikations-ID」,所以我猜英文中應該是'複製ID'),它在數據庫中存儲爲16字節的二進制字段。如何設置一個GUID作爲來自Delphi的ADO查詢參數?

我發現如何訪問這些字段德爾福TADOQuery/TADOTable使用

(TheQuery.FieldByName('SomeGuidField') as TGUIDField).AsGuid; 

用,但現在我想執行一個SQL查詢是這樣的:

SELECT * FROM SomeTable WHERE SomeGuidField=:AGuid 

我試着設置一個TADOQuery.SQL屬性轉換爲上述語句,但發現無法真正設置AGuid參數,以便可以打開查詢。無論我試過導致(ADO/COM)錯誤

沒有爲一個或多個必需參數

例如給定值:

TheQuery.ParamByName('AGuid').Value := QuotedString(GuidToStr(AGuid)); 
TheQuery.Open; // <<== crashes here 

這不工作,要麼:

TheQuery.ParamByName('AGuid').Value := GuidToStr(AGuid); 
TheQuery.Open; // <<== crashes here 

我一起來看看如何TGuidField(...).AsGuid作品和發現它首先將GUID轉換爲字符串,然後將字符串轉換爲變體(反之亦然)。

它工作正常,如果我總是生成的SQL語句是這樣的:

SELECT * FROM SomeTable WHERE SomeGuidField='<a guid goes here>' 

由於我通過在程序TADOQuery對象周圍,我想只改變AGuid - 參數來保持大多數方法與實際的SQL語句無關。

是否有任何其他方式來設置一個GUID參數比總是改變完整的SQL語句?

(它必須是一個GUID,因爲我需要一個全局唯一標識符與作爲MS SQL或MS訪問基於其他數據庫同步。)

編輯 vradmilovic是正確的,這個工程:

TheQuery.ParamByName('AGuid').Value := GuidToStr(AGuid); 
TheQuery.Open; 

我不明白爲什麼它第一次嘗試不起作用。

+1

等待,關閉太過本地化?我將不得不強烈反對。我應該重新提出這個問題,並重新公開投票。 – 2016-11-22 02:26:46

回答

2

這是用ADO設置參數的正確方法。你得到的消息很可能是由於有一些字段的錯字(如果字段不存在,你會得到相同的消息)。

-2

如果確定的參數是TGUID,那麼下面應該工作:

TGuidField(TheQuery.ParamByName('AGuid')).AsGuid 

雖然這在內部做了GuidToString,所以這個問題也許是相同的。值得一試!

+0

導致訪問衝突 – 2008-11-17 16:52:43

0

什麼是值得我使用的GUIDs,但我把它們保存在DB作爲字符串。

0

你不應該將它們保存爲字符串。你應該使用uniqueidentifier。使用的兩個函數是GUIDToString和StringToGUID(不是str-ones)。

如果從活動目錄複製值(正值ftVarBytes),可以使用分配哪些不適合你的魔法:

QueryIns.Parameters.ParamByName('GUID').Assign(Query.FieldByName('objectGUID')); 

如果你想提取從公元的objectGUID你需要轉換的objectGUID以uniqueidentifier:

Query.SQL.Add('select cast(objectGUID as uniqueidentifier) as objectGUID'); 
Query.SQL.Add('from vwADGroups'); 
Query.Open; 
while not Query.Eof do begin 
    Index := List.IndexOfName(Query.FieldByName('objectGUID').AsString); 
    //... 
end; 
相關問題