在C ++ MFC程序中使用mysql查询中的变量

时间:2010-04-25 19:53:18

标签: c++ mysql mfc

经过广泛的互联网搜索后,我还没有找到解决这个问题的方法。

我正在编写一个连接到在线数据库的小型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个指针”的错误。

任何方式围绕这个???

1 个答案:

答案 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.
}