我正在编写一个连接到在线数据库的小型C ++应用程序,并在列表框中输出数据。
我需要使用编辑框启用搜索功能,但在使用变量时我无法使查询正常工作。
我的代码是:
res = mysql_perform_query (conn, "select distinct artist from Artists");
//res = mysql_perform_query (conn, "select album from Artists where artist = ' ' ");
while((row = mysql_fetch_row(res)) != NULL){
CString str;
UpdateData();
str = ("%s\n", row[0]);
UpdateData(FALSE);
m_list_control.AddString(str);
}
第一个“res =”行工作正常,但我需要第二个才能工作。我为编辑框设置了成员变量m_search_edit,但是我尝试将其包含在sql语句中的任何方式都会导致错误。
例如
res = mysql_perform_query (conn, "select album from Artists where artist = '"+m_search_edit+" ' ");
导致此错误:
错误C2664:'mysql_perform_query':无法将参数2从'class CString'转换为'char *' 没有可用于执行此转换的用户定义转换运算符,或者无法将运算符称为“
当我将m_search_edit转换为char *时,它会给我一个“无法添加2个指针”的错误。
任何方式围绕这个???
答案 0 :(得分:2)
这里的问题是你可能正在为Unicode构建,这意味着CString由宽字符组成。您不能直接将ASCII字符串与宽字符串连接(并且您也不能使用+运算符连接字符串文字)。
我认为在这里构建查询字符串的最明确的方法是使用CT2CA
宏将编辑控件的内容从Unicode转换为ASCII,并CStringA::Format
将它们插入字符串中
CStringA query;
query.Format("select album from Artists where artist = '%s'", CT2CA(m_search_edit));
res = mysql_perform_query(conn, query);
正如托马斯指出的那样,你应该意识到这为SQL注入打开了大门......
编辑:我不确定这个mysql_perform_query
API的来源,但是从您发布的错误消息看起来它还需要一个可写缓冲区(char *
而不是const char *
)。由于我找不到它的文档,我不知道它对缓冲区的期望有多大,但要从CString中获取可修改的缓冲区,请查看GetBuffer()和ReleaseBuffer()方法:
CStringA query;
query.Format(...); // Replace ... with parameters from above
char * buffer = query.GetBuffer(MAX_STRING_LENGTH); // make length big enough for mysql
res = mysql_perform_query(conn, buffer)
query.ReleaseBuffer();
EDIT2(回应最新评论):
感谢您提供mysql_perform_query
功能的定义。在将来提问时,请记住,了解何时创建了这样的辅助函数会很有帮助。
在这种情况下,您的mysql_perform_query
函数永远不会修改查询字符串 - 它唯一能做的就是将其传递给mysql_query
,这需要const char *
,所以没有理由你不应该声明其参数const
。一旦你这样做,你会发现我的第一个答案是有效的(不需要GetBuffer / ReleaseBuffer):
MYSQL_RES *mysql_perform_query(MYSQL *conn, const char * query)
{
// Body as written in comment.
}