需要多个数据库插入操作的建议

时间:2011-07-06 05:29:06

标签: mysql sql c linux

我正在用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 :(得分:3)

答案 1 :(得分:2)

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