Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 需要关于多个数据库插入操作的建议吗_Mysql_Sql_C_Linux - Fatal编程技术网

Mysql 需要关于多个数据库插入操作的建议吗

Mysql 需要关于多个数据库插入操作的建议吗,mysql,sql,c,linux,Mysql,Sql,C,Linux,我正在用C(mysql)编写一个linux数据库应用程序,在我的代码中,我需要执行一些insert语句。假设(出于任何原因)某些插入在过程中失败。有没有一种简单的方法可以回退?或者,唯一的方法是跟踪insert语句 多谢各位 顺便说一下,简化的代码和支持结构如下: #include <my_global.h> #include <mysql.h> #define MAX_RECORDS_FIELD_SIZE 150 #define MAX_RECORDS_VALUES_

我正在用C(mysql)编写一个linux数据库应用程序,在我的代码中,我需要执行一些insert语句。假设(出于任何原因)某些插入在过程中失败。有没有一种简单的方法可以回退?或者,唯一的方法是跟踪insert语句

多谢各位

顺便说一下,简化的代码和支持结构如下:

#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]
    }

}
#包括
#包括
#定义最大记录数字段大小150
#定义最大\u记录\u值\u大小300
类型定义结构
{
字符连接字符串[100];
字符用户名[30];
MYSQL*康涅狄格州;
}联系;
类型定义结构
{
字符表_名称[30];
int nof_字段;
空白*字段;
void*值;
}记录;
类型定义结构
{
int nof_记录;
记录*\u记录;
}记录;
//此函数可以将值插入到各种记录中
int insert(连接-连接,记录-记录,无效*\u其他)
{
int i=0,j=0,m=0,n;
char*str[100],字段[MAX\u RECORDS\u FIELD\u SIZE],值[MAX\u RECORDS\u values\u SIZE];
对于(i=0;i0)sprintf(字段,“%s”,_记录。_记录[i]->字段[0]);
如果(m>0)sprintf(字段,“%s”,_记录。_记录[i]->值[0]);
对于(j=1;jfields[j]);
sprintf(值,“%s,%s”,字段,_记录._记录[i]->值[j]);
}
str[i]=calloc(1,sizeof(char)*(strlen(字段)+strlen(值));
sprintf(str[i],“插入%s(%s)值(%s)”,\u记录。\u记录[i]->表\u名称、字段、值);
}

对于(i=0;i您必须禁用自动提交,然后才能使用函数和提交/回滚事务。

您必须禁用自动提交,然后才能使用函数和提交/回滚事务。

这正是事务设计的目的。请参阅:

这正是事务设计的目的。请参阅:


老兄-接受你收到的一些回答-向帮助你的人表达爱意我很抱歉,但我没有理解你!我确实感谢回答我的人。我也发表了一些评论。我做错了什么吗?或者…我应该做一些我没有做的事情吗?如果是这样,请让我知道,因为我是stackoverflow的新用户。我们你说的是否决票/否决票和接受票吗?我现在才想起来:)你应该点击答案旁边的复选框“接受”正确的答案。在点击复选框之前,你应该仔细考虑哪个答案是最好的。伙计-接受你收到的一些答案-向帮助你的人表达一些爱我很抱歉,但我没有理解你!我确实感谢那些回答我的人。并发表了一些评论。我做错什么了吗?或我应该做些我没有做的事吗?如果是这样,请让我知道,因为我是一个新的stackoverflow用户。你是说投票否决/投票赞成并接受吗?我现在才想起来:)你应该点击答案旁边的复选框来“接受”正确的答案。在单击复选框之前,您应该仔细考虑哪个答案是最好的。谢谢,我尝试了以下方法,但没有成功(程序仍然执行插入)。我遗漏了什么:mysql\u自动提交(康涅狄格州,0);mysql_查询(conn,“启动事务”);mysql_查询(conn,“插入写入程序值('Honore')”);mysql_回滚(conn);//mysql_查询(conn,“COMMIT”);关闭(康涅狄格州);更新:正如mysql_rollback()手册所说:“从mysql 5.0.3开始,此函数的操作取决于completion_type系统变量的值。”这与我的情况相关吗?我可以在哪里设置它?谢谢,我尝试了以下方法,但没有成功(程序仍然进行插入)。我遗漏了什么:mysql\u自动提交(康涅狄格州,0);mysql_查询(conn,“启动事务”);mysql_查询(conn,“插入写入程序值('Honore')”);mysql_回滚(conn);//mysql_查询(conn,“COMMIT”);关闭(康涅狄格州);更新:正如mysql_rollback()手册所说:“从mysql 5.0.3开始,此函数的操作取决于completion_type系统变量的值。”这与我的情况相关吗?我可以在哪里设置它?谢谢,我尝试了以下方法,但没有成功(程序仍然进行插入)。我遗漏了什么:mysql\u自动提交(康涅狄格州,0);mysql_查询(conn,“启动事务”);mysql_查询(conn,“插入写入程序值('Honore')”);mysql_回滚(conn);关闭(康涅狄格州);更新:正如mysql_rollback()手册所说:“从mysql 5.0.3开始,此函数的操作取决于completion_type系统变量的值。”这与我的情况相关吗?我可以在哪里设置它?不幸的是,我以前没有使用过MySQL事务,并且我没有立即发现您的代码有任何错误,所以我不知道。也许可以尝试执行
mysql\u查询(conn,“ROLLBACK”)?我想你应该用你的新问题问一个新问题。谢谢,我尝试了以下方法,但没有成功(程序仍在插入)。我遗漏了什么:mysql\u自动提交(康涅狄格州,0);mysql_查询(conn,“启动事务”);mysql_查询(conn,“插入写入程序值('Honore')”);mysql_回滚(conn);关闭(康涅狄格州);更新:正如mysql_rollback()手册所说:“从mysql 5.0.3开始,此函数的操作取决于completion_type系统变量的值。”这与我的情况相关吗?我可以在哪里设置它?不幸的是,我以前没有使用过MySQL事务,并且我没有立即发现您的代码有任何错误,所以我不知道。也许可以尝试执行
mysql\u查询(conn,“ROLLBACK”)?我认为你应该用你的新问题问一个新问题。