2011-07-06 59 views
0

我在C(mysql)和我的代码的某处写了一个linux数据库应用程序,我需要执行一些插入语句。假设(出于任何原因)某些插入在此过程中失败。有没有简单的方法回滚?或者唯一的方法是保持插入语句的轨道。需要关于多个数据库插入操作的建议

谢谢

的方式,简化的代码和支持结构如下:

#include <my_global.h> 
#include <mysql.h> 

#define MAX_RECORDS_FIELD_SIZE 150 
#define MAX_RECORDS_VALUES_SIZE 300 
typedef struct 
{ 
    char connectionString[100]; 
    char username[30]; 
    MYSQL *conn; 
}connection; 

typedef struct 
{ 
    char table_name[30]; 
    int nof_fields; 
    void * fields; 
    void * values; 
}record; 
typedef struct 
{ 
    int nof_records; 
    record *_record; 
}records; 
//this function can insert value into various records 
int insert(connection _connection, records _records,void * _other) 
{ 
    int i=0,j=0,m=0,n; 
    char *str[100],fields[MAX_RECORDS_FIELD_SIZE],values[MAX_RECORDS_VALUES_SIZE]; 

    for(i=0;i<_records.nof_records;i++) 
    { 
     m=_records._record[i].nof_fields; 
     if(m>0) sprintf(fields,"%s",_records._record[i]->fields[0]); 
     if(m>0) sprintf(fields,"%s",_records._record[i]->values[0]); 
     for(j=1;j<m;j++) 
     { 
      sprintf(fields,"%s,%s",fields,_records._record[i]->fields[j]); 
      sprintf(values,"%s,%s",fields,_records._record[i]->values[j]); 
     } 
     str[i]=calloc(1,sizeof(char)*(strlen(fields)+strlen(values))); 
     sprintf(str[i],"insert into %s (%s) values(%s)",_records._record[i]->table_name,fields,values); 
    } 

    for(i=0;i<_records.nof_records;i++) 
    { 
     //do the insertion of str[i] 
//  **error! what to do? how to roll back?** 
     //free str[i] 
    } 

} 
+2

多德 - 接受你得到了一些答案 - 显示一些爱的人,都有助于你 –

+0

我很抱歉,但我没有得到你!我非常感谢回答我的人。并给出了一些意见。我做错什么了吗?或...是我应该做别的事情,我没有?如果是这样,请让我知道因为我是一个新的计算器用户。 – rahman

+0

你是在谈论投票下来/投票并接受?我刚刚来到现在关于他们:) – rahman

回答

2

您必须禁用自动提交,然后你可以使用函数mysql_commit()mysql_rollback()提交/回滚您的交易。

+0

谢谢,我尝试了以下不起作用的东西(程序仍在插入)。我错过了什么:mysql_autocommit(conn,0); mysql_query(conn,“START TRANSACTION”); mysql_query(conn,“INSERT INTO writers VALUES('Honore')”); mysql_rollback(conn); // mysql_query(conn,“COMMIT”); mysql_close(conn); – rahman

+0

更新:如mysql_rollback()手册所述:“从MySQL 5.0.3开始,此函数的操作受制于completion_type系统变量的值。”这与我的情况有关吗?我可以在哪里设置? – rahman

3
+0

谢谢,我尝试了下面哪个方法不起作用(程序仍在插入)。我错过了什么:mysql_autocommit(conn,0); mysql_query(conn,“START TRANSACTION”); mysql_query(conn,“INSERT INTO writers VALUES('Honore')”); mysql_rollback(conn);在mysql_close(conn);在 – rahman

+0

更新:正如mysql_rollback()手册所述:“从MySQL 5.0.3开始,此函数的操作受制于completion_type系统变量的值。”这与我的情况有关吗?我可以在哪里设置? – rahman

+0

不幸的是,我之前没有使用MySQL事务,而且我也没有立即发现您的代码有任何问题,所以我不知道。也许尝试做'mysql_query(conn,“ROLLBACK”);'?我想你应该对你的新问题提出一个新问题。 –