【发布时间】:2016-09-13 02:49:57
【问题描述】:
我用 C 语言编写了一个处理引擎,它从一个表中提取 40k 条记录,处理数据并将结果写入另一个表。当我将处理后的数据打印到屏幕上时,它看起来很完美,因此所有变量都保持正确的值。我需要将数据写入具有 3 列作为主键的表中。我这样创建表:
CREATE TABLE halfcomp
(
MarketCode varchar(20) NOT NULL,
TRZNum varchar(20) NOT NULL,
origTRZNum varchar(20) NOT NULL,
PRIMARY KEY (MarketCode, TRZNum, origTRZNum)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当 C 程序写入数据库时,我得到的结果是垃圾。我在不应该的地方得到重复值,结果乱序,列看起来在不同的地方切换等等。我已经玩了几天了,我认为它与主键有关.
我认为这是因为我创建了另一个具有自动递增整数主键的表,这将我的其他值释放为普通的旧表值。我创建了这样的表:
CREATE TABLE halfcomp
(
Ind int(11) auto_increment NOT NULL,
MarketCode varchar(20) DEFAULT NULL,
TRZNum varchar(20) DEFAULT NULL,
origTRZNum varchar(20) DEFAULT NULL,
PRIMARY KEY (Ind)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当我使用相同的 C 代码写入此表时,结果非常完美。没有重复值,没有混合列。但问题是,我需要 MarketCode、TRZNum 和 origTRZNum 列作为主键。我是否不恰当地创建了我的第一个表?我很茫然。
我已经用细齿梳完成了 C 程序,它看起来不错,并且相同的 C 代码在其他表上也可以工作。但是有了这张表,它就不起作用了。任何见解将不胜感激!谢谢!
编辑:我已经更新了代码。我不再随意使用 malloc 或 sprintf,我将缓冲区值直接设置为我的字符串变量的值。我也尝试在字符串的末尾添加一个“\0”。到目前为止,没有任何帮助,我得到了同样不稳定的行为。只有当值是主键时才会发生这种情况,否则它们会正确加载。我必须假设 C 在开始时将数据库信息传递给我时在字符串的末尾添加了一个空终止符,并且在处理数据时我使用 strcpy 来回传递值,所以我必须相信空终止符已经存在。还有其他想法吗??
int writeDB(void) {
MYSQL *conn2;
MYSQL_STMT *stmt2;
MYSQL_BIND bind2[3];
char *server = "localhost";
char *user = "root";
char *password = "";
char *database = "thekeydb";
int port = 3306;
int k;
int length = 15000;
unsigned long mc2_length, mn2_length, om2_length;
const char *insertStmt2 = "INSERT INTO tempcomp (MarketCode, TRZNum, origTRZNum) VALUES (?,?,?)";
conn2 = mysql_init(NULL);
mysql_real_connect(conn2, server,user,password,database, port, NULL, 0);
stmt2 = mysql_stmt_init(conn2);
mysql_autocommit(conn2, 0);
mysql_query(conn2, "START TRANSACTION");
for (k=0; k < length; k++) {
memset((void *) bind2, 0, sizeof(bind2));
mc2_length = strlen(comps[k].marketCode);
mn2_length = strlen(comps[k].trzNum);
om2_length = strlen(comps[k].origTrzNum);
if (mysql_stmt_prepare(stmt2, insertStmt2, strlen(insertStmt2)) != 0) {
printf("Unable to create new session: Could not prepare statement\n");
}
bind2[0].buffer_type = MYSQL_TYPE_STRING;
bind2[0].buffer = comps[k].marketCode;
bind2[0].buffer_length = STRING_SIZE;
bind2[0].is_null = 0;
bind2[0].length = &mc2_length;
bind2[1].buffer_type = MYSQL_TYPE_STRING;
bind2[1].buffer = comps[k].trzNum;
bind2[1].buffer_length = STRING_SIZE;
bind2[1].is_null = 0;
bind2[1].length = &mn2_length;
bind2[2].buffer_type = MYSQL_TYPE_STRING;
bind2[2].buffer = comps[k].origTrzNum;
bind2[2].buffer_length = STRING_SIZE;
bind2[2].is_null = 0;
bind2[2].length = &om2_length;
if (mysql_stmt_bind_param(stmt2, bind2) != 0) {
printf("Unable to create new session: Could not bind parameters");
}
mysql_stmt_execute(stmt2);
printf("%s, %s, %s, %s\n", comps[k].marketCode, comps[k].trzNum, comps[k].origTrzNum, comps[k].address);
}
mysql_query(conn2, "COMMIT");
mysql_autocommit(conn2, 1);
mysql_stmt_free_result(stmt2);
mysql_stmt_close(stmt2);
mysql_close(conn2);
return 1;
}
【问题讨论】: