ActionScript3MySQLドライバー(元々はASSQLとして知られています)
AS3-MYSQLはActionScript 3 MySQLドライバーであり、AIRアプリからMySQLデータベースを直接操作できるようにします。
MySQLドライバーのサンプルの使用。
データベース接続オブジェクトを宣言します
private var con:Connection;
データベースサーバーに接続します
private function onCreationComplete():void {
con = new Connection("localhost", 3306, "root", "password", "database name");
on.addEventListener(Event.CONNECT, handleConnect);
con.addEventListener(MySqlErrorEvent.SQL_ERROR, handleConnectionError);
con.connect();
}
private function handleConnect(e:Event):void {
//woop! were connected, do something here
}
private function handleConnectionError(e:MySqlErrorEvent):void {
Alert.show("Connection Error: " + e.text, "Error");
}
ステートメントとレスポンダーを使用したクエリ
private function sampleQuery1():void {
var st:Statement = con.createStatement();
st.executeQuery("SELECT * FROM users", new MySqlResponser(
// when done
function (e:MySqlEvent):void {
Alert.show("Returned: " + e.resultSet.size() + " rows!");
},
// when error
function (e:MySqlErrorEvent):void {
Alert.show("Error: " + e.text);
}
));
}
ステートメント、レスポンダー、およびパラメーターを使用したクエリ
private function sampleQuery2():void {
var st:Statement = con.createStatement();
st.sql = "SELECT * FROM users WHERE userID = ?";
st.setNumber(1, 5);
st.executeQuery(null, new MySqlResponser(
// when done
function (e:MySqlEvent):void {
Alert.show("Returned: " + e.resultSet.size() + " rows!");
},
// when error
function (e:MySqlErrorEvent):void {
Alert.show("Error: " + e.text);
}
));
}
ステートメントとイベントのリスナーを使用したクエリ
private function sampleQuery3():void {
var st:Statement = con.createStatement();
st.addEventListener(MySqlEvent.RESULT, handleResult);
st.executeQuery("SELECT * FROM users");
}
この例は、MySQLServiceとDatagridを使用しています。 Data Gridの列のプロパティとDataProviderプロパティは、MySQLService LastResult(行の配列)およびLastResultset(実際の結果セット)にバインドされています。
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import com.maclema.mysql.events.MySqlErrorEvent;
import com.maclema.util.ResultsUtil;
private function handleConnected(e:Event):void {
service.send("SELECT * FROM employees2 LIMIT 10");
}
private function handleError(e:MySqlErrorEvent):void {
Alert.show(e.text);
}
]]>
</mx:Script>
<assql:MySqlService id="service"
hostname="localhost"
username="root"
password=""
database="assql-test"
autoConnect="true"
connect="handleConnected(event)"
sqlError="handleError(event)" />
<mx:DataGrid id="grid" left="10" right="10" top="10" bottom="10"
dataProvider="{service.lastResult}"
columns="{ResultsUtil.getDataGridColumns(service.lastResultSet)}" />
これは、AsyncreSponderを使用してクエリを処理する例です。
import com.maclema.mysql.Statement; import com.maclema.mysql.Connection; import com.maclema.mysql.ResultSet; import mx.controls.Alert; import mx.rpc.AsyncResponder; import com.maclema.mysql.MySqlToken; import com.maclema.util.ResultsUtil;
//The MySql Connection private var con:Connection;
private function onCreationComplete():void { con = new Connection("localhost", 3306, "root", "", "assql-test"); con.addEventListener(Event.CONNECT, handleConnected); con.connect(); }
private function handleConnected(e:Event):void { var st:Statement = con.createStatement();
var token:MySqlToken = st.executeQuery("SELECT * FROM employees");
token.addResponder(new AsyncResponder(
function(data:Object, token:Object):void {
var rs:ResultSet = ResultSet(data);
Alert.show("Found " + rs.size() + " employees!");
},
function(info:Object, token:Object):void {
Alert.show("Error: " + info);
},
token
));
}
これはより深い例です。各ステートメントでは、情報プロパティがmysqltokenに設定されます。これにより、すべてのクエリと応答を同じ結果と障害ハンドラーで処理できます。この例では、パラメーターを使用するステートメントも使用します。
import com.maclema.mysql.Statement;
import com.maclema.mysql.Connection;
import com.maclema.mysql.ResultSet;
import mx.controls.Alert;
import mx.rpc.AsyncResponder;
import com.maclema.mysql.MySqlToken;
import com.maclema.util.ResultsUtil;
//The MySql Connection
private var con:Connection;
private function onCreationComplete():void {
con = new Connection("localhost", 3306, "root", "", "assql-test");
con.addEventListener(Event.CONNECT, handleConnected);
con.connect();
}
private function handleConnected(e:Event):void {
getAllEmployees();
}
private function getAllEmployees():void {
var st:Statement = con.createStatement();
var token:MySqlToken = st.executeQuery("SELECT * FROM employees");
token.info = "GetAllEmployees";
token.addResponder(new AsyncResponder(result, fault, token));
}
private function getEmployee(employeeID:int):void {
var st:Statement = con.createStatement();
st.sql = "SELECT * FROM employees WHERE employeeID = ?";
st.setNumber(1, employeeID);
var token:MySqlToken = st.executeQuery();
token.info = "GetEmployee";
token.employeeID = employeeID;
token.addResponder(new AsyncResponder(result, fault, token));
}
private function result(data:Object, token:Object):void { var rs:ResultSet;
if ( token.info == "GetAllEmployees" ) {
rs = ResultSet(data);
Alert.show("Found " + rs.size() + " employees!");
}
else if ( token.info == "GetEmployee" ) {
rs = ResultSet(data);
if ( rs.next() ) {
Alert.show("Employee " + token.employeeID + " username is '" + rs.getString("username") + "'");
}
else {
Alert.show("No such employee for id " + token.employeeID);
}
}
}
private function fault(info:Object, token:Object):void {
Alert.show(token.info + " Error: " + info);
}
これは、バイナリデータを挿入する例です。
import com.maclema.mysql.Statement;
import com.maclema.mysql.Connection;
import com.maclema.mysql.ResultSet;
mport mx.controls.Alert;
import mx.rpc.AsyncResponder;
import com.maclema.mysql.MySqlToken;
import com.maclema.util.ResultsUtil;
//The MySql Connection private var con:Connection;
private function onCreationComplete():void {
con = new Connection("localhost", 3306, "root", "", "assql-test");
con.addEventListener(Event.CONNECT, handleConnected);
con.connect();
}
private function handleConnected(e:Event):void {
//do something here
}
private function setEmployeePhoto(employeeID:int, photoFile:File):void {
//the file bytes var filedata:ByteArray = new ByteArray();
//read the file
var fs:FileStream = new FileStream();
fs.open(photoFile, FileMode.READ);
fs.readBytes(filedata);
fs.close();
//execute the query
var st:Statement = con.createStatement();
st.sql = "UPDATE employees SET photo = ? WHERE employeeID = ?";
st.setBinary(1, filedata);
st.setNumber(2, employeeID);
var token:MySqlToken = st.executeQuery();
token.employeeID = employeeID;
token.addResponder(new AsyncResponder(
function (data:Object, token:Object):void {
Alert.show("Employee " + token.employeeID + "'s photo updated! Affected Rows: " + data.affectedRows);
},
function (info:Object, token:Object):void {
Alert.show("Error updating photo: " + info);
},
token
));
}
これは、バイナリデータを選択する例です。
import com.maclema.mysql.Statement;
import com.maclema.mysql.Connection;
import com.maclema.mysql.ResultSet;
import mx.controls.Alert;
import mx.rpc.AsyncResponder;
import com.maclema.mysql.MySqlToken;
import com.maclema.util.ResultsUtil;
//The MySql Connection
private var con:Connection;
private function onCreationComplete():void {
con = new Connection("localhost", 3306, "root", "", "assql-test");
con.addEventListener(Event.CONNECT, handleConnected);
con.connect();
}
private function handleConnected(e:Event):void {
//do something here
}
private function getEmployeePhoto(employeeID:int, writeToFile:File):void {
//execute the query var st:Statement = con.createStatement();
st.sql = "SELECT photo FROM employees WHERE employeeID = ?";
st.setNumber(1, employeeID);
var token:MySqlToken = st.executeQuery();
token.employeeID = employeeID;
token.writeToFile = writeToFile;
token.addResponder(new AsyncResponder(
function (data:Object, token:Object):void {
var rs:ResultSet = ResultSet(data);
if ( rs.next() ) {
//get the outFile from the token
var outFile:File = token.writeToFile;
//get the file data from the result set
var filedata:ByteArray = rs.getBinary("photo");
//write the file
var fs:FileStream = new FileStream();
fs.open(outFile, FileMode.WRITE);
fs.writeBytes(filedata);
fs.close();
Alert.show("Photo written to: " + outFile.nativePath);
}
else {
Alert.show("Employee " + token.employeeID + " not found!");
}
},
function (info:Object, token:Object):void {
Alert.show("Error getting photo: " + info);
},
token
));
}
これは、結果セットと出力パラメーターを返すストアドプロシージャを呼び出す例です。
import com.maclema.mysql.Statement;
import com.maclema.mysql.Connection;
import com.maclema.mysql.ResultSet;
import mx.controls.Alert;
import mx.rpc.AsyncResponder;
import com.maclema.mysql.MySqlToken;
import com.maclema.mysql.MySqlResponse;
import com.maclema.mysql.MySqlOutputParams;
import com.maclema.util.ResultsUtil;
//The MySql Connection
private var con:Connection;
private function onCreationComplete():void {
con = new Connection("localhost", 3306, "root", "", "assql-test");
con.addEventListener(Event.CONNECT, handleConnected);
con.connect();
}
private function handleConnected(e:Event):void {
var st:Statement = con.createStatement();
st.sql = "CALL getEmployeeList(@LastUpdated)";
st.registerOutputParameter("@LastUpdated");
var token:MySqlToken = st.executeQuery();
token.addResponder(new AsyncResponder(
function(data:Object, token:Object):void {
if ( data is ResultSet ) {
//handle the results returned.
}
else if ( data is MySqlResponse ) {
//check the affectedRows of the procedure
}
else if ( data is MySqlOutputParams ) {
//get the output parameter.
var lastUpdated:String = data.getParam("@LastUpdated");
}
},
function(info:Object, token:Object):void {
Alert.show("Error: " + info);
},
token
));
}
これは、500列を受け取るたびに非常に大きな結果をストリーミングし、Datagridを更新する例です。
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.AsyncResponder;
import mx.collections.ArrayCollection;
import com.maclema.mysql.ResultSet;
import com.maclema.util.ResultsUtil;
import com.maclema.mysql.events.MySqlEvent;
import com.maclema.mysql.MySqlToken;
import com.maclema.mysql.Statement;
import com.maclema.mysql.Connection;
private var con:Connection;
private function onCreationComplete():void {
con = new Connection("localhost", 3306, "root", "", "assql-test");
con.addEventListener(Event.CONNECT, handleConnected);
con.connect();
}
private function handleConnected(e:Event):void {
var st:Statement = con.createStatement();
//turn on results streaming
st.streamResults = true;
//dispatch new rows event every 500 new rows
st.streamingInterval = 500;
//execute a query
var token:MySqlToken = st.executeQuery("SELECT * FROM employees");
//listen for our result set columns
token.addEventListener(MySqlEvent.COLUMNDATA, function(e:MySqlEvent):void {
grid.columns = ResultsUtil.getDataGridColumns( e.resultSet );
grid.dataProvider = new ArrayCollection();
});
//listen for new rows
token.addEventListener(MySqlEvent.ROWDATA, function(e:MySqlEvent):void {
addNewRows(e.resultSet);
});
//add a responder
token.addResponder(new AsyncResponder(
function(data:Object, token:Object):void {
//call add new rows again to ensure we have all the rows
addNewRows(ResultSet(data));
},
function(info:Object, token:Object):void {
Alert.show("Error: " + info);
},
token
));
}
private function addNewRows(rs:ResultSet):void {
//get our data provider
var dp:ArrayCollection = grid.dataProvider as ArrayCollection;
//get the collection of new rows
var newRows:ArrayCollection = rs.getRows(false, dp.length, (rs.size()-dp.length));
//concat our current source, and our new rows source
dp.source = dp.source.concat( newRows.source );
//refresh our data provider
dp.refresh();
}
]]>
</mx:Script>
<mx:DataGrid id="grid" left="10" right="10" top="10" bottom="10" />
フラッシュプレーヤーを使用している場合は、このライブラリを使用するには、ソケットを許可する「ポリシーサーバー」に接続する必要があります。
ソケットポリシーファイルの絶対的な構成は次のとおりです。
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <allow-access-from domain="*" to-ports="3306" /> </cross-domain-policy>
ポリシーファイルは、ポート843(TCP)で聴くソケットから提供する必要があります。 Flashはリクエスト"<policy-file-request/>