2011-07-06 83 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」);'?我想你應該對你的新問題提出一個新問題。 –