.. index:: 
	single: MySQL 関数; はじめに

==========
MySQL 関数
==========

MySQL 関数の用法を学びます。

* MySQL_Info()
* MySQL_Init()
* MySQL_Error()
* MySQL_Connect()
* MySQL_Close()
* MySQL_Query()
* MySQL_Insert_ID()
* MySQL_Result()
* MySQL_Next_Result()
* MySQL_Columns()
* MySQL_Result2()
* MySQL_Escape_String()
* MySQL_AutoCommit()
* MySQL_Commit()
* MySQL_Rollback()

この関数の使用前に mysqllib.ring ライブラリを読み込みます。

.. code-block:: ring

	load "mysqllib.ring"
	# MySQL 関数の使用

.. index:: 
	pair: MySQL 関数; MySQL_Info()

MySQL_Info() 関数
=================

MySQL_Info() 関数は MySQL クライアントのバージョンを取得します。

文法:

.. code-block:: ring

	MySQL_Info() ---> MySQL のバージョン文字列

用例:

.. code-block:: ring

	see "MySQL Client Version : " + mysql_info()

実行結果:

.. code-block:: ring

	MySQL Client Version : 6.1.5

.. index:: 
	pair: MySQL 関数; MySQL_Init()

MySQL_Init() 関数
=====================

MySQL_Init() 関数により MySQL クライアントを使用します。

文法:

.. code-block:: ring

	MySQL_Init() ---> MySQL ハンドル

.. index:: 
	pair: MySQL 関数; MySQL_Error()

MySQL_Error() 関数
======================

MySQL_Error() 関数は MySQL クライアントからエラーメッセージを取得します。

文法: 

.. code-block:: ring

	MySQL_Error(MySQL ハンドル) ---> エラーメッセージの文字列

.. index:: 
	pair: MySQL 関数; MySQL_Connect()

MySQL_Connect() 関数
========================

MySQL_Connect() 関数は MySQL データベースのサーバーへ接続します。

文法:

.. code-block:: ring

	MySQL_Connect(MySQL ハンドル, cServer, cUserName, cPassword) ---> lStatus

.. index:: 
	pair: MySQL 関数; MySQL_Close()

MySQL_Close() 関数
======================

MySQL_Close() 関数は MySQL データベースの接続を閉じます。

文法:

.. code-block:: ring

	MySQL_Close(MySQL ハンドル)

.. index:: 
	pair: MySQL 関数; MySQL_Query()

MySQL_Query() 関数
======================

MySQL_Query() 関数は SQL のクエリを実行します。

文法:

.. code-block:: ring
	
	MySQL_Query(MySQL ハンドル, cSQLQuery)

.. index:: 
	pair: MySQL 関数; データベースの作成

データベースの作成
==================

この用例は MySQL サーバーへ接続後に新しいデータベースを作成します。

.. code-block:: ring

	See "MySQL Test - Create Database" + nl
	con = mysql_init()

	See "Connect" + nl
	if mysql_connect(con,"localhost","root","root") = 0
		see "Cann't connect" + nl
		see "Error : " + mysql_error(con) + nl
		mysql_close(con)
		bye
	ok

	See "Create Database..." + nl
	mysql_query(con,"CREATE DATABASE mahdb")

	See "Close Connection" + nl
	mysql_close(con)

実行結果:

.. code-block:: ring

	MySQL Test - Create Database
	Connect
	Create Database...
	Close Connection

.. index:: 
	pair: MySQL 関数; テーブルの作成とデータの挿入

テーブルの作成とデータの挿入
============================

この用例は新しいテーブルの作成、およびレコードの挿入を行います。

.. code-block:: ring

	func main
		see "Create Table and Insert Records" + nl
		con = mysql_init()

		see "Connect" + nl
		if mysql_connect(con, "localhost", "root", "root","mahdb") = 0 
			system_error(con) 
		ok

		see "Drop table" + nl
		if mysql_query(con, "DROP TABLE IF EXISTS Employee")  system_error(con) ok
  
		see "Create table" + nl
		if mysql_query(con, "CREATE TABLE Employee(Id INT, Name TEXT, Salary INT)") 
		   system_error(con) ok
 
 		see "Insert data" + nl 
		if mysql_query(con, "INSERT INTO Employee VALUES(1,'Mahmoud',15000)") 
		   system_error(con) ok
  
		if mysql_query(con, "INSERT INTO Employee VALUES(2,'Samir',16000)") 
		   system_error(con) ok

		if mysql_query(con, "INSERT INTO Employee VALUES(3,'Fayed',17000)")  
		   system_error(con) ok

		see "Close connection" + nl
		mysql_close(con) 

	func system_error con
		see mysql_error(con)  mysql_close(con)  bye


実行結果:

.. code-block:: ring

	Create Table and Insert Records
	Connect
	Drop table
	Create table
	Insert data
	Close connection

.. index:: 
	pair: MySQL 関数; MySQL_Inser_ID()

MySQL_Insert_ID() 関数
======================

MySQL_Insert_ID() 関数は挿入された列の ID を取得します。

文法:

.. code-block:: ring

	MySQL_Insert_ID() ---> 数値により挿入された列の ID

用例:

.. code-block:: ring

	con = mysql_init()
	see "connect to database" + nl
	mysql_connect(con,"localhost","root","root","mahdb")
	see "drop table" + nl
	mysql_query(con, "DROP TABLE IF EXISTS Customers")
	see "create table" + nl
	mysql_query(con, "CREATE TABLE Customers(Id INT PRIMARY KEY AUTO_INCREMENT, Name TEXT)")
	see "insert record" + nl
	mysql_query(con, "INSERT INTO Customers(Name) VALUES('Mahmoud')")
	see "insert record" + nl
	mysql_query(con, "INSERT INTO Customers(Name) VALUES('Samir')")
	see "insert record" + nl
	mysql_query(con, "INSERT INTO Customers(Name) VALUES('Fayed')")
	see "insert record" + nl
	mysql_query(con, "INSERT INTO Customers(Name) VALUES('Test 2015')")

	see "inserted row id : " + mysql_insert_id(con) + nl
	see "close database" + nl
	mysql_close(con)

実行結果:

.. code-block:: ring

	connect to database
	drop table
	create table
	insert record
	insert record
	insert record
	insert record
	inserted row id : 4
	close database

.. index:: 
	pair: MySQL 関数; MySQL_Result()

MySQL_Result() 関数
===================

MySQL_Result() 関数はクエリの結果 (カラム名を除くデータ) を取得します。

文法:

.. code-block:: ring

	MySQL_Result(MySQL ハンドル) ---> クエリの結果を有するリスト

.. index:: 
	pair: MySQL 関数; MySQL_Next_Result()

MySQL_Next_Result() 関数
========================

MySQL_Next_Result() 関数は次のクエリの結果を移動します。
この関数は同じクエリで複数の SQL ステートメントがあるときに使用します。

文法:

.. code-block:: ring

	MySQL_Next_Result(MySQL ハンドル)

.. index:: 
	pair: MySQL 関数; クエリの結果を表示するには

クエリの結果を表示するには
==========================

この用例はデータベースでクエリを実行後に結果を表示します。

.. code-block:: ring

	con = mysql_init()
	see "Connect to database" + nl
	mysql_connect(con, "localhost", "root", "root","mahdb")
	see "Execute Query" + nl
	mysql_query(con, "SELECT Name FROM Employee WHERE Id=1;"+
			 "SELECT Name FROM Employee WHERE Id=3")
	see "Print Result" + nl 
	see mysql_result(con)
	mysql_next_result(con)
	see mysql_result(con)
	see "close database" + nl
	mysql_close(con)

実行結果:

.. code-block:: ring

	Connect to database
	Execute Query
	Print Result
	Mahmoud
	Fayed
	close database

.. index:: 
	pair: MySQL 関数; MySQL_Columns()

MySQL_Columns() 関数
====================

MySQL_Columns() 関数はカラム名のリストを取得します。

文法:

.. code-block:: ring

	MySQL_Columns(MySQL ハンドル) ---> カラムの情報を有するリスト

用例:

.. code-block:: ring

	con = mysql_init()
	see "Connect to database" + nl
	mysql_connect(con, "localhost", "root", "root","mahdb")
	see "Execute Query" + nl
	mysql_query(con, "SELECT * FROM Employee")
	see "Result" + nl 
	see mysql_columns(con)
	see "Close database" + nl
	mysql_close(con)

実行結果:

.. code-block:: ring

	Connect to database
	Execute Query
	Result
	Id
	11
	3
	32768
	Name
	65535
	252
	16
	Salary
	11
	3
	32768
	Close database

.. index:: 
	pair: MySQL 関数; MySQL_Result2()

MySQL_Result2() 関数
========================

MySQL_Result() でカラム名がないデータの結果を取得するのではなく MySQL_Result2() は、
カラム名を全て取得した後にクエリの結果を一つのリストにします。

文法:

.. code-block:: ring

	MySQL_Result2(MySQL ハンドル) ---> リスト (カラム名を除いたクエリの結果)

用例:

.. code-block:: ring

	con = mysql_init()
	see "Connect to database" + nl
	mysql_connect(con, "localhost", "root", "root","mahdb")
	see "Execute Query" + nl
	mysql_query(con, "SELECT * FROM Employee")
	see "Print Result" + nl 
	see mysql_result2(con)
	see "Close database" + nl
	mysql_close(con)

実行結果:

.. code-block:: ring

	Connect to database
	Execute Query
	Print Result
	Id
	Name
	Salary
	1
	Mahmoud
	15000
	2
	Samir
	16000
	3
	Fayed
	17000
	Close database


.. index:: 
	pair: MySQL 関数; MySQL_Escape_String()

MySQL_Escape_String() 関数
==========================

MySQL_Escape_String() 関数は処理後に、
バイナリデータまたは特殊文字をデータベースへ格納します。

文法:

.. code-block:: ring

	MySQL_Escape_String(MySQL ハンドル, cString) ---> 処理後の文字列

.. index:: 
	pair: MySQL 関数; データベースのイメージを保存するには

データベースのイメージを保存するには
====================================

用例:

.. code-block:: ring

	See "Read file" + nl
	cFile = read("tests\mahmoud.jpg")
	con = mysql_init()
	See "Connect to database..." + nl
	mysql_connect(con, "localhost", "root", "root","mahdb")
	See "Escape string..." + nl
	cFile = mysql_escape_string(con,cFile)
	stmt = "INSERT INTO photo(id, data) VALUES(1, '" + cFile + "')"
	See "Insert data..." + nl
	mysql_query(con,stmt)
	See "Close database..." + nl
	mysql_close(con)

実行結果:

.. code-block:: ring

	Read file
	Connect to database...
	Escape string...
	Insert data...
	Close database...

.. index:: 
	pair: MySQL 関数; データベースからイメージを復元するには

データベースからイメージを復元するには
======================================

用例:

.. code-block:: ring

	con = mysql_init()
	See "Connect to database..." + nl
	mysql_connect(con, "localhost", "root", "root","mahdb")
	See "Read data from database..." + nl
	mysql_query(con,"SELECT data FROM photo WHERE id=1")
	See "Write new file" + nl
	result = mysql_result(con)
	write("tests\mahmoud2.jpg",result[1][1])
	See "Close database..." + nl
	mysql_close(con)

実行結果:

.. code-block:: ring

	Connect to database...
	Read data from database...
	Write new file
	Close database...


.. index:: 
	pair: MySQL 関数; MySQL_AutoCommit()

MySQL_AutoCommit() 関数
=======================

MySQL_AutoCommit() 関数は自動コミット機能の有効、または無効化を指定します。

文法:

.. code-block:: ring

	MySQL_AutoCommit(MySQL ハンドル, lStatus)  # lStatus には True または False を指定します。

.. index:: 
	pair: MySQL 関数; MySQL_Commit()

MySQL_Commit() 関数
=======================

MySQL_Commit() 関数はデータベースへ更新をコミットします。

文法:

.. code-block:: ring

	MySQL_Commit(MySQL ハンドル)

.. index:: 
	pair: MySQL 関数; MySQL_Rollback()

MySQL_Rollback() 関数
=========================

MySQL_Rollback() 関数はデータベースのロールバックを更新します。 

文法:

.. code-block:: ring

	MySQL_Rollback(MySQL ハンドル)

.. index:: 
	pair: MySQL 関数; トランザクションの用例

トランザクションの用例
======================

この用例では、 MySQL_Autocommit(), MySQL_Commit() および、
MySQL_RollBack() の用法です。

用例:

.. code-block:: ring

	func main
	
		con = mysql_init()

		see "Connect" + nl
		if mysql_connect(con, "localhost", "root", "root","mahdb") = 0 
			system_error(con) ok

		see "Drop table" + nl
		if mysql_query(con, "DROP TABLE IF EXISTS Employee2") 
			system_error(con) ok
  
		see "Create table" + nl
		if mysql_query(con, "CREATE TABLE Employee2(Id INT, Name TEXT, Salary INT)")
			system_error(con) ok
 
 		see "Insert data" + nl 
		if mysql_query(con, "INSERT INTO Employee2 VALUES(1,'Mahmoud',15000)") 
			system_error(con) ok
  
		if mysql_query(con, "INSERT INTO Employee2 VALUES(2,'Samir',16000)")
			system_error(con) ok

		if mysql_query(con, "INSERT INTO Employee2 VALUES(3,'Fayed',17000)") 
			system_error(con) ok

		mysql_autocommit(con,False)
		mysql_query(con, "INSERT INTO Employee2 VALUES(4,'Ahmed',5000)")
		mysql_query(con, "INSERT INTO Employee2 VALUES(5,'Ibrahim',50000)")
		mysql_query(con, "INSERT INTO Employee2 VALUES(6,'Mohammed',50000)")
		See "Save transaction (y/n) " give nChoice
		if upper(nChoice) = "Y"
			mysql_commit(con)
		else
			mysql_rollback(con)
		ok

		see "Close connection" + nl
		mysql_close(con) 

	func system_error con

		see mysql_error(con)
		mysql_close(con)
		bye

実行結果:

.. code-block:: ring

	Connect
	Drop table
	Create table
	Insert data
	Save transaction (y/n) y
	Close connection

