저번에 Beta2예제가 새로운 버전에서 안돌아가는 바람에 다시 만들었습니다-_-;
많은 분들이 안돌아간다고 하셔서 다시 만들었습니다 ㅠ
형식이 조금 바뀌었는데, 별 차이는 없었습니다.
더 편해진 것 같아요. 토큰이라는 것을 이용하네요.
http://code.google.com/p/assql/
다양한 예제와 lib파일은 이곳에서 받을 수 있습니다.
간단하게 insert와 select를 하는 예제를 만들어봤습니다.
테스트 해본 환경은 Eclpse3.4 + Flex Builder 3.0.1 + asSQL Beta 2.7에서 해봤습니다.
DB구조는 다음과 같습니다.
CREATE TABLE `products` (
`id` int(10) unsigned NOT NULL auto_increment,
`description` varchar(45) default NULL,
`price` decimal(15,2) NOT NULL default '0.00',
PRIMARY KEY USING BTREE (`id`,`price`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
INSERT INTO `products` (`id`,`description`,`price`) VALUES
(1,'Lamp','469.80'),
(2,'Table','3502.62'),
(3,'Chair','1061.12');
아래는 소스코드입니다.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="onCreationComplete()"
layout="horizontal">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import com.maclema.mysql.ResultSet;
import com.maclema.mysql.MySqlToken;
import com.maclema.mysql.Statement;
import com.maclema.mysql.Connection;
import com.maclema.mysql.events.MySqlErrorEvent;
import mx.rpc.AsyncResponder;
import mx.controls.Alert;
private var con:Connection;
private var st:Statement;
private var token:MySqlToken;
[Bindable]
private var dataAC:ArrayCollection;
private function onCreationComplete():void
{
con = new Connection("DB주소", 3306, "DB아이디", "DB비밀번호", "DB명");
con.addEventListener(Event.CONNECT, handleConnected);
con.connect("euckr");
}
private function handleConnected(e:Event):void
{
if (con != null)
{
st = con.createStatement();
}
}
private function selectResult(data:Object, token:Object):void
{
var rs:ResultSet = ResultSet(data);
dataAC = rs.getRows();
}
private function insertResult(data:Object, token:Object):void
{
Alert.show(token.description + " 삽입성공!");
selectProcess();
insertBox.visible = false;
}
private function fault(info:Object, token:Object):void
{
Alert.show("Error: " + info);
}
private function selectProcess():void
{
var token:MySqlToken = st.executeQuery(
"SELECT id, description, price FROM products");
token.addResponder(new AsyncResponder(selectResult, fault));
}
private function insertProcess():void
{
st.sql = "INSERT INTO products (description, price) VALUES (?, ?)";
st.setString(1, inputDescription.text);
st.setNumber(2, Number(inputPrice.text));
var token:MySqlToken = st.executeQuery();
token.description = inputDescription.text;
token.addResponder(new AsyncResponder(insertResult, fault, token));
}
]]>
</mx:Script>
<mx:VBox horizontalAlign="center">
<mx:DataGrid id="productDG" dataProvider="{dataAC}">
<mx:columns>
<mx:DataGridColumn headerText="ID" dataField="id"/>
<mx:DataGridColumn headerText="제품명" dataField="description"/>
<mx:DataGridColumn headerText="가격" dataField="price"/>
</mx:columns>
</mx:DataGrid>
<mx:HBox width="100%" horizontalAlign="center">
<mx:Button label="SELECT" id="btnSelect"
click="insertBox.visible = false; selectProcess()"/>
<mx:Button label="INSERT" id="btnInsert"
click="insertBox.visible = true"/>
</mx:HBox>
<mx:VBox id="insertBox" height="100%" horizontalAlign="center" visible="false">
<mx:Form>
<mx:FormHeading label="정보 입력" />
<mx:FormItem label="제품명">
<mx:TextInput id="inputDescription" />
</mx:FormItem>
<mx:FormItem label="가격">
<mx:TextInput id="inputPrice" restrict="0-9,."/>
</mx:FormItem>
</mx:Form>
<mx:Button id="btnInsertProcess" label="추가" click="insertProcess()" />
</mx:VBox>
</mx:VBox>
</mx:Application>
좀 이상한 점이 con.connect("euckr")로 해야지 한글이 나오더군요. mysql에서 utf8에는 한글이 없는건가.
어쨌든 인코딩은 어려워요 ㅠ
Connection이라는 클래스를 통해 mysql정보를 이용해 con객체를 생성한다음에 Statement를 생성합니다.
그 뒤에 selectProcess메소드에서 보시면, MySqlToken이라는 클래스를 이용합니다. Statement객체의 executeQuery메소드에 쿼리문을 넣어서 실행하면 token이 발행됩니다.
이 token에 addResponder라는 메소드를 통해 AsyncResponder를 이용해 해당 function넣은 객체를 생성해서 addResponder에 집어넣습니다. 그러면 데이터를 가져오는 시점에서 넣은 function이 호출이 됩니다.
여기서 데이터를 파싱하는 부분에서 엄청 편해진 부분이있는데요.
rs.getRows();
getRows라는 메소드가 있는데, 이건 해당 데이터셋을 자동으로 ArrayCollection형으로 변환해서 리턴해줍니다.
그러면 바로 바인딩된 datagrid에 데이터가 뿌려지겠죠. 멋집니다.
insert부분도 똑같습니다.
그냥 자바문법과 비슷하다고 보면 되겠네요.
틀린 점이 있다면 이건 이벤트기반이라는 것이죠 ^^ 비동기적으로 일어납니다.

셀렉트도 잘되네요. 구글크롬에서 해봤어요. 잘 되네요.

머드초보를 2.00로 해서 입력해봅시다.

잘 들어갔네요.





당신의 의견을 작성해 주세요.
좋은 정보입니다. ^^
보니까 asSQL버전이 올라가면서 기존 예제가 문제가 있었더라구요.
코딩방식이 바뀌어서 다시 만들었습니다 ^^
방문해주셔서 감사해요~ ^^
그....기존 버전의 트랙백을 날려주셔도 돼요 ^^
말씀해주신대로 mysql설정미스인듯합니다..
그런데 잘 해결이 안되고있네요 ^^;
아직도 안되시나요? 제가 네이트온으로 직접 지원해드릴까요?
관리자만 볼 수 있는 댓글입니다.
그리고 이클립스 유로파 (eclipse-jee-europa-winter-win32) 가 실행이 안되네요
제껏만 그런가해서 친구컴에서도 해봤는데 같은 증상....
jvm terminated. Exit code=-1 로시작해서 꽤나긴 설명이있는데 짧은지식으로는 ㅋ
이건 실행시 메모리 설정을 낮추거나,
http://theeye.pe.kr/entry/JVM-terminated-Exit-code-1-%BF%A1%B7%AF-%BC%F6%C1%A4%C7%CF%B1%E2
이걸 보고 따라하시면 됩니다 ^^
알려주신대로 메모리 낮추니까 바로 되네요 감사 합니다 ^^
아;; 제가 정말 초보라 그러는데;;
굳이 이클립스가 필요한건가요? 코딩은 플렉스3 빌더에서 다 할 수 있는거 아닌가요? ㅠㅠ;
그리고 돌려보니까...
insert에 품목 입력하면
Error #2044: 처리되지 않은 ioError입니다. text=Error #2031: 소켓 오류입니다. URL: DB주소
Main Thread (Suspended: TypeError: Error #1009: null 객체 참조의 속성이나 메서드에 액세스할 수 없습니다.)
FlexMysqlTest/insertProcess
FlexMysqlTest/__btnInsertProcess_click
이렇게 뜨는데 제가 뭘 빼먹은건지 궁금합니다.^^;;;;;
이클립스는 자바프로그래밍을 위해서 필요합니다.
Flex는 RemoteObject를 통해서 완벽하게 java연동을 지원합니다.
그래서 DB연동은 JAVA단에서 주로 하는데, 이것을 하려면
이클립스가 필요합니다.
그리고 소켓오류는 제 위에 소스를 그대로 가져다가 쓰신 것 같은데요.
저기 DB주소부분에는 DB주소가 들어가야합니다.
localhost나 DB서버가 작동하고 있는 서버의 IP를 적어주시면 돼요 ^^
그리고 포트는 디폴트로 설치하셨으면 1521이고,
DB접속ID, PW, 그리고 DB명을 넣어주시는 겁니다.
asSQL이 자바나 php없이도 연결가능하다 그래서 이클립스가 필요없는줄 알았습니다 ^^;;
소스 다시보니까 제가 아무것도 안하고 그냥 돌리기만 했네요 ^^;;;
디비 공부좀 많이 해야겠습니다.ㅠㅠ 디비가 완전 꽉막혀서;;
답글 고맙습니다^^
asSQL은 자바나 PHP없이 DB연결이 가능합니다.
asSQL를 이용해서 DB연동한다면 이클립스가 필요없습니다.
asSQL은 클라이언트에서 직접 MySQL에 접속하여 DB를 제어합니다.
하지만, 보안상 취약점도 있고, DAO단을 따로 만드는게
나중에 유지보수차원에서 더 좋을듯싶습니다.
간단한 DB연동이라면 asSQL을 쓰셔도 될 듯 합니다 ^^