2009-07-10 66 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