c / c + + 呼叫mysql儲存過程
阿新 • • 發佈:2019-01-29
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 語言的簡單方法。
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++/