2009-07-10 42 views
4

我有一個使用C++連接到的Pervasive數據庫。 到目前爲止,我所有的查詢都是參數化的,即"SELECT USER.NAME FROM USER WHERE USER.ID = ?", ,這工作正常。 但在搜索查詢中,我在WHERE子句中使用LIKE,然後看起來我不能使用參數和通配符(%)。在WHERE子句中使用帶LIKE的參數化SQL(普適SQL)

我的查詢看起來像這樣"SELECT * FROM DOG WHERE DOG.NAME LIKE '%?%'"由於有兩個'圍繞參數?標記,這失敗了,它搜索狗的名字中帶有?標記的狗。在SQL Server中,這可能會通過連接像"SELECT * FROM DOG WHERE DOG.NAME LIKE '%' + ? + '%'"這樣的字符串來解決,但這在Pervasive中是無效的語法(參見本頁底部:http://ww1.pervasive.com/library/docs/psql/950/sqlref/sqlref-04-55.html)。

我也試着將%-signs添加到參數本身,但那似乎也不起作用。

有沒有人知道這個解決方案?

EDIT1: 一些C++代碼示例:

CString sqlCommand = "SELECT * FROM DOG WHERE DOG.NAME LIKE ?;"; 
m_pAdoCommand->CommandText = _bstr_t(sqlCommand); 
m_pAdoCommand->Parameters->Append(m_pAdoCommand->CreateParameter("p0", adVarChar, adParamInput, 25, _bstr_t("'%bob%'"))); 
m_pAdoRecordset = m_pAdoCommand->Execute(NULL,NULL,adCmdText); 

m_pAdoCommand_CommandPtrm_pAdoRecordset_RecordsetPtr我在這個例子中改變了SQL表的名稱,以便他們做出。敏感在這裏。)

上面的代碼將返回一個名爲'%bob%'的狗的行,但我希望它返回所有在他們的名字中有bob的狗。

回答

6

爲什麼不給通配符賦值的通配符添加通配符?

因此,這意味着,您的查詢看起來像

SELECT * FROM dog WHERE dog.name LIKE ? 

然後,你的價值「%鮑勃%」分配給該參數,例如。 我看到你說你也試過這個,但它不起作用,這很奇怪。你可以顯示你已經完成的代碼嗎?

我也看到你在你的例子中的參數周圍加引號。這聽起來不是一個好主意,因爲此時該參數不會再被識別爲參數。那時,它只是一個字符串。

+0

將wildchars添加到參數本身的問題是,它們被視爲字符串,因此如果dog.name等於'%bob%',那麼傳遞字符串'%bob%'將僅返回一行。 。我會在我的答案中添加一些代碼示例。 – fredrik 2009-07-10 09:24:19