经过广泛的网络搜索,我仍然没有找到任何解决这个问题的办法。
我正在编写一个小型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从’CString‘类转换为'char *’,没有用户定义的转换运算符可以执行此转换,或者不能调用运算符。“
当我将m_search_edit转换为char*时,它会给我一个“无法添加2个指针”的错误。
有办法绕过这件事吗?
发布于 2010-04-25 20:05:11
这里的问题是您可能正在为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);正如Thomas所指出的,您应该知道这为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.
}https://stackoverflow.com/questions/2709699
复制相似问题