我在C中创建了带有混合数据的insert字符串,不能插入行。
正如我所看到的,问题可能出现在浮点数中,在我的语言环境中使用逗号作为小数分隔符。
因此,当插入时,我会得到错误消息:
错误: INSERT比目标列有更多表达式
第1行:...0:11:37.097203 +0100,“关于解决问题的书”,“”,“PCS”,0,000000)
插入代码:
snprintf(sqlInsert, sizeof(sqlInsert), "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc) VALUES
(%d, '%s', '%s', '%s', '%s', '%s', %f)", o, k, dt, es, tagname, meas)), IL.klc);如何解决这种情况,正确插入双精度数字?
发布于 2012-03-03 12:52:13
rc = snprintf(sqlInsert, sizeof sqlInsert
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)"
" VALUES (%d, '%s', '%s', '%s', '%s', '%s', %f);"
, o, k, dt, es, tagname, meas, IL.klc);更新:如果有区域设置问题,setlocale()可能会帮助您在程序中设置本地。LC_ALL=POSIX (或C)应该始终存在。(很可能是{%e %f %g}格式之一对区域设置不敏感)
以下程序演示了setlocale()的使用:
#include <stdio.h>
#include <locale.h>
#pragma DONT define DEFAULT_LOCALE "POSIX"
#define DEFAULT_LOCALE "nl_NL.utf8"
/* LC_NUMERIC LC_ALL */
int main(int argc, char **argv)
{
double val;
char *old, *new;
val = 1024 * 1024;
val /= 10;
printf ("Original: Val=%f\n", val);
new = argv[1] ? argv[1] : DEFAULT_LOCALE ;
old = setlocale (LC_ALL, new );
printf("Old=%s, New=%s\n", old, new );
printf ("After change: Val=%f\n", val);
new = setlocale (LC_ALL, old );
printf("Old=%s, New=%s\n", new, old);
printf ("After restore: Val=%f\n", val);
return 0;
}产出:
plasser@pisbak:./a.out
Original: Val=104857.600000
Old=nl_NL.utf8, New=nl_NL.utf8
After change: Val=104857,600000
Old=nl_NL.utf8, New=nl_NL.utf8
After restore: Val=104857,600000
plasser@pisbak:在阅读了手册之后,我希望setlocale()返回旧的设置,但情况似乎并非如此。也许我无意中改变了一些全球环境:-[
更新:向*printf()函数解释参数总是很好的。
#include <locale.h>
(void) setlocale (LC_NUMERIC, "POSIX" );
rc = snprintf(sqlInsert, sizeof sqlInsert
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)"
" VALUES (%d, '%s', '%s', '%s', '%s', '%s', %f);"
, (int) o, k, dt, es, tagname, meas, (double) IL.klc);https://stackoverflow.com/questions/9544928
复制相似问题