c / c + + 呼叫mysql儲存過程

mybwu_com發表於2014-02-10

原文:c / c + + call mysql stored procedure

E文好的請檢視原文,菜鳥級翻譯,歡迎批評指正!

mysql5.0支援儲存過程後,現在mysql6.0Alpha 版本也是可用的。6.0不僅支援大型資料庫(如 oracle和如此的大多數功能(如儲存過程、檢視、觸發器、作業等,並修復了這些功能存在的bug,6.0.1 版還支援windows 64 位 和表空間。
C/c + + 要訪問 mysql,只是一些簡單的常用操作,c嵌入式簡單查詢、插入、更新和其他操作的使用可以。這些語句作為業務複雜、完整的業務功能需要的sql 操作,很大一部分是嵌入c 程式碼c 程式碼會導致更多和更復雜的不清楚這一次自然的儲存過程來封裝所有資料庫邏輯思想,簡單地通過呼叫mysql 儲存的過程 c 介面可以實現他們的目標大大減少工作量的c 程式設計師,但也容易處理前端業務邏輯和資料庫處理邏輯分離。在這裡只呼叫儲存的過程c 語言的簡單方法。

1、首先建立一個表用於儲存使用者資訊

Create table student(
      id int auto_increment,
      name varchar(20),
      age tinyint,
      remark varchar(50),
       primary key(id)
);

2、插入幾條使用者資訊

Insert into student values(1,"zhouys",90, "");
commit;

3、檢視剛剛插入的使用者資訊

mysql> select * from student;
+------+-----------+------+----------+
| id   | name   | age | remark |
+------+-----------+------+----------+
|    1 | zhouys |   90 |        |
+------+-----------+------+-----------+
1 row in set (0.00 sec)
 
mysql>

4、建立儲存過程

delimiter //
 
create procedure querystudent(
       in in_id int ,   #0- Character ID 1-digital id    
       #
       out out_ret int,                # Returns the result 
       out out_name varchar(20),        # First name 
       out out_age   int                # Age     
)
label_a:begin
       declare v_name varchar(20) ;
       declare v_age tinyint ;
       # Parameters determine 
       if (in_id<=0) then
              set out_ret=-1; #id error
              leave label_a;
       end if;
             
       SELECT name,age into v_name,v_age from student where't found
              leave label_a;
       end if;    
             
       set out_ret=0;
       set out_name=v_name;
       set out_age=v_age;
end;
//
delimiter ;

5、C語言呼叫儲存過程的方法步驟:

5.1、Mysql 的控制程式碼初始化

if(!mysql_init(&mysql))
       {
              printf("mysql_init failed!\n");
              return 0;
       }

5.2、連線到MySQL資料庫

//login or connect
       if(!mysql_real_connect(&mysql,"localhost","root","","billingdb",0,NULL,CLIENT_MULTI_STATEMENTS))
       {
              printf("mysql_real_connect() failed!\n");
              mysql_close(&mysql);
              return 0;
       }

5.3、呼叫儲存過程

//call
       strcpy(query,"call querystudent (1,@ret,@ out_name,@ out_age)");
       printf("query sql=[%s]\n",query);
    ret= mysql_real_query(&mysql,query,(unsigned int)strlen(query));

5.4、查詢返回值及輸出引數值

mysql_query(&mysql, "SELECT @ret,@ out_name,@ out_age ");
 
       //get result
       if (ret)
    {
              printf("Error exec query: %s\n",mysql_error(&mysql));
    }
    else
       {
              printf("[%s] exec...\n", query);
    }
 
       results = mysql_store_result(&mysql);

5.5、獲取結果值

while((record = mysql_fetch_row(results))) {
              printf("[%s]-[%s]-[%s]\n", record[0], record[1],record[2]);
       }
常規儲存過程返回結果,^_^。

5.6、釋放資源mysql連線控制程式碼

mysql_free_result(results);
mysql_close(&mysql);

6、結論

Mysql儲存過程可以實現相當強大的功能這裡只是一些基本的用希望一些幫助歡迎分享......

7、個人使用經驗心得

像C#呼叫都可以繫結輸出引數,直接通過輸出引數得到值,但是c++中使用prepare繫結輸出引數,卻返回以下錯誤資訊:

Error Code: 1414. OUT or INOUT argument 2 for routine knockout_dbo.ko_SignUpYoungBoxer is not a variable or NEW pseudo-variable in BEFORE trigger

以下連結是找到的相關問題討論:

http://forums.mysql.com/read.php?38,505961

http://bugs.mysql.com/bug.php?id=25970

下面是一個c++的MySQL封裝

http://tangentsoft.net/mysql++/

相關文章