我正在使用MySQL api编写一些C代码来创建数据库,插入,更新等。我在查找构建查询的最干净/正确方法时遇到一些麻烦,因为MySQL语法可能很难放入例如,ac字符串,我希望查询看起来像这样可读:
strcpy(query, "CREATE TABLE Users (
userID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (userID),
email VARCHAR(31) NOT NULL,
timeEntered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
address VARCHAR(31) NOT NULL,
index (email))
");
然后我当然会用
之类的东西来运行查询 /* send SQL query */
if (mysql_query(conn, query)) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
} else { printf("table created\n"); }
然而,编译器抱怨预期')'并且缺少终止“等等。最好的解决方案是什么?
答案 0 :(得分:3)
为了便于阅读,我建议您使用C89的字符串连接功能:
strcpy(query, "CREATE TABLE Users ("
"userID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (userID),"
"email VARCHAR(31) NOT NULL,"
"timeEntered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,"
"address VARCHAR(31) NOT NULL,"
"index (email))"
);
只需使用一系列字符串文字,以便在可读性方面需要尽可能多的空格。
在K& R C的古代,只有反斜杠换行方式:
puts("A very\
long string\
literal spanning\
several lines");
答案 1 :(得分:1)
C字符串文字不能包含换行符。你可以这样做:
strcpy(query, "CREATE TABLE Users ("
"userID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (userID), "
"email VARCHAR(31) NOT NULL, "
"timeEntered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "
"address VARCHAR(31) NOT NULL, "
"index (email))");
这将从相邻的字符串文字中创建一个字符串文字。
答案 2 :(得分:1)
C ++编译器通常不支持多行字符串常量,对于C,我认为它可能因编译器和编译器以及它们遇到的标准级别而不同。
将它拆分为多个字符串而不使用任何分隔符更安全,任何编译器都可以理解:
strcpy(query, "CREATE TABLE Users ("
" userID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (userID),"
" email VARCHAR(31) NOT NULL,"
" timeEntered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,"
" address VARCHAR(31) NOT NULL,"
" index (email))"
);