c/c++呼び出しmysqlストレージプロシージャ


原文:c/c++call mysql stored procedure
E文の良いのは原文を見て下さい、菜鳥級の翻訳、批判の指摘を歓迎します!
mysql5.0ストレージ・プロシージャをサポートしたらmysql 6になります.0 Alphaバージョンも使用可能です.6.0は、oracleなどの大規模なデータベースやストレージ・プロシージャ、ビュー、トリガ、ジョブなどの多くの機能をサポートし、これらの機能に存在するバグを修正するだけでなく、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!
"); 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!
"); mysql_close(&mysql); return 0; }

5.3、ストレージプロセスの呼び出し
//call
       strcpy(query,"call querystudent (1,@ret,@ out_name,@ out_age)");
       printf("query sql=[%s]
",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
",mysql_error(&mysql)); } else { printf("[%s] exec...
", query); } results = mysql_store_result(&mysql);

5.5、結果値の取得
while((record = mysql_fetch_row(results))) {
              printf("[%s]-[%s]-[%s]
", 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++/