ActionScript 3 MySQL Driver (originalmente conocido como Assql)
AS3-MYSQL es un controlador MySQL de ActionScript 3 que le permite trabajar con bases de datos MySQL directamente desde su aplicación aérea.
Muestra de uso del controlador MySQL.
Declarar el objeto de conexión de la base de datos
private var con:Connection;
Conectarse al servidor de base de datos
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");
}
Consulta usando una declaración y respondedores
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);
}
));
}
Consulta usando una declaración, respondedores y parámetros
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);
}
));
}
Consulta usando una declaración y oyentes de eventos
private function sampleQuery3():void {
var st:Statement = con.createStatement();
st.addEventListener(MySqlEvent.RESULT, handleResult);
st.executeQuery("SELECT * FROM users");
}
Este ejemplo está utilizando MySQLService y DataGrid. La propiedad de columnas de la cuadrícula de datos y la propiedad Dataprovider están vinculadas a MySQLService Lastresult (ArrayCollection of Filas) y LASTRESULTSET (el resultado real real).
<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)}" />
Este es un ejemplo de uso de un AsynCreponder para manejar una consulta.
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
));
}
Este es un ejemplo más profundo. Con cada declaración, se establece una propiedad de información en MySQLToken. De esta manera, todas las consultas y respuestas se pueden manejar con el mismo resultado y manipuladores de fallas. Este ejemplo también utiliza una declaración que usa parámetros.
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);
}
Este es un ejemplo de insertar datos binarios.
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
));
}
Este es un ejemplo de selección de datos binarios.
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
));
}
Este es un ejemplo de llamar a un procedimiento almacenado que devuelve un conjunto de resultados y parámetros de salida.
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
));
}
Este es un ejemplo de transmisión de un conjunto de resultados muy grande y actualización de una datagrid cada vez que recibimos 500 nuevas filas.
<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" />
Si está utilizando Flash Player, para usar esta biblioteca debe conectarse a un "servidor de políticas" que permita los sockets.
Aquí está la configuración más simple absoluta para el archivo de política de socket:
<?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>
El archivo de políticas debe servirse desde un socket, escuchando en el puerto 843 (TCP). Flash enviará la solicitud "<policy-file-request/>