在c中构建 SQL是一项痛苦的工作。构建这样的东西需要很多时间。我是glib新手。它有助于字符串操作。但我没有找到任何可以缩短查询构建代码的方法。在此处查看示例。
GString *acc_protocol = g_string_new(acc->prpl->name);
GString *acc_handle = g_string_new(acc->user);
GString *acc_password = g_string_new(acc->pass);
GString *acc_tag = g_string_new(acc->tag);
g_string_printf(q, "INSERT INTO accounts (user, protocol, handle, password, autoconnect, tag) values (%ld, ", user_id);
g_string_append(q,"'");
append_mysql_escaped_param(q, buf, acc_protocol);
g_string_append(q,"', '");
append_mysql_escaped_param(q, buf, acc_handle);
g_string_append(q,"', '");
append_mysql_escaped_param(q, buf, acc_password);
g_string_append(q,"', '");
g_string_append(q, atoi(acc->auto_connect));
g_string_append(q,"', '");
append_mysql_escaped_param(q, buf, acc_tag);
g_string_append(q,"') on duplicate key UPDATE password='");
append_mysql_escaped_param(q, buf, acc_password);
g_string_append(q,"', autoconnect='");
g_string_append(q, atoi(acc->auto_connect));
g_string_append(q,"', tag='");
append_mysql_escaped_param(q, buf, acc_tag);
g_string_append(q,"'");
g_string_free(acc_handle);
g_string_free(acc_password);
g_string_free(acc_protocol);
g_string_free(acc_tag);
mysql_real_query(mysql);
num_rows = mysql_affected_rows(mysql);
....
/// .... mysql processing here ...
为了您的方便,这里是功能append_mysql_escaped_param
static void append_mysql_escaped_param(GString *query, GString *buffer, GString *param){
g_string_set_size(buffer, param->len*2+1);
mysql_real_escape_string(mysql, buffer->str, param->str, param->len);
g_string_append(query, buffer->str);
}
我怎样才能让它变小?这里有太多的冗余代码,足以让人头疼不已。有什么改进的办法吗?
我知道我可以使用准备好的语句。但是当我在准备好的语句上绑定值时,我也需要编写这样的批量代码。我只想摆脱容易出错的冗余代码。这尤其适用于 C。