程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c / c + +中如何調用mysql存儲過程

c / c + +中如何調用mysql存儲過程

編輯:關於C++

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;  
       }

返回欄目頁:http://www.bianceng.cn/Programming/cplus/

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++/

作者:csdn博客 微wx笑

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved