저번에 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로 해서 입력해봅시다.

사용자 삽입 이미지

잘 들어갔네요.

PS. 실무db연동은....서버단언어와 함께하시길 바랍니다 ^^ (JAVA, C# 등등~)
머드초보 이 작성.

당신의 의견을 작성해 주세요.

  1. Comment RSS : http://mudchobo.tomeii.com/tt/rss/comment/318
  2. 지돌스타 2008/09/03 15:35  편집/삭제  댓글 작성  댓글 주소

    좋은 정보입니다. ^^

    • 머드초보 2008/09/03 19:00  편집/삭제  댓글 주소

      보니까 asSQL버전이 올라가면서 기존 예제가 문제가 있었더라구요.
      코딩방식이 바뀌어서 다시 만들었습니다 ^^
      방문해주셔서 감사해요~ ^^
      그....기존 버전의 트랙백을 날려주셔도 돼요 ^^

  3. keril 2008/09/03 19:09  편집/삭제  댓글 작성  댓글 주소

    말씀해주신대로 mysql설정미스인듯합니다..

    그런데 잘 해결이 안되고있네요 ^^;

  4. keril 2008/09/03 19:13  편집/삭제  댓글 작성  댓글 주소

    그리고 이클립스 유로파 (eclipse-jee-europa-winter-win32) 가 실행이 안되네요
    제껏만 그런가해서 친구컴에서도 해봤는데 같은 증상....
    jvm terminated. Exit code=-1 로시작해서 꽤나긴 설명이있는데 짧은지식으로는 ㅋ

  5. 비매품 2008/09/03 22:09  편집/삭제  댓글 작성  댓글 주소

    아;; 제가 정말 초보라 그러는데;;
    굳이 이클립스가 필요한건가요? 코딩은 플렉스3 빌더에서 다 할 수 있는거 아닌가요? ㅠㅠ;

    그리고 돌려보니까...
    insert에 품목 입력하면

    Error #2044: 처리되지 않은 ioError입니다. text=Error #2031: 소켓 오류입니다. URL: DB주소

    Main Thread (Suspended: TypeError: Error #1009: null 객체 참조의 속성이나 메서드에 액세스할 수 없습니다.)
    FlexMysqlTest/insertProcess
    FlexMysqlTest/__btnInsertProcess_click

    이렇게 뜨는데 제가 뭘 빼먹은건지 궁금합니다.^^;;;;;

    • 머드초보 2008/09/04 09:03  편집/삭제  댓글 주소

      이클립스는 자바프로그래밍을 위해서 필요합니다.
      Flex는 RemoteObject를 통해서 완벽하게 java연동을 지원합니다.
      그래서 DB연동은 JAVA단에서 주로 하는데, 이것을 하려면
      이클립스가 필요합니다.

      그리고 소켓오류는 제 위에 소스를 그대로 가져다가 쓰신 것 같은데요.
      저기 DB주소부분에는 DB주소가 들어가야합니다.
      localhost나 DB서버가 작동하고 있는 서버의 IP를 적어주시면 돼요 ^^
      그리고 포트는 디폴트로 설치하셨으면 1521이고,
      DB접속ID, PW, 그리고 DB명을 넣어주시는 겁니다.

  6. 비매품 2008/09/04 09:55  편집/삭제  댓글 작성  댓글 주소

    asSQL이 자바나 php없이도 연결가능하다 그래서 이클립스가 필요없는줄 알았습니다 ^^;;
    소스 다시보니까 제가 아무것도 안하고 그냥 돌리기만 했네요 ^^;;;
    디비 공부좀 많이 해야겠습니다.ㅠㅠ 디비가 완전 꽉막혀서;;

    답글 고맙습니다^^

    • 머드초보 2008/09/04 10:11  편집/삭제  댓글 주소

      asSQL은 자바나 PHP없이 DB연결이 가능합니다.
      asSQL를 이용해서 DB연동한다면 이클립스가 필요없습니다.
      asSQL은 클라이언트에서 직접 MySQL에 접속하여 DB를 제어합니다.
      하지만, 보안상 취약점도 있고, DAO단을 따로 만드는게
      나중에 유지보수차원에서 더 좋을듯싶습니다.
      간단한 DB연동이라면 asSQL을 쓰셔도 될 듯 합니다 ^^

  7. atom 2008/09/08 10:11  편집/삭제  댓글 작성  댓글 주소

    안녕하세요.. 머드 초보님..

    위의 포스트를 보고 flex를 이용하여 웹에 붙이는걸 했습니다.

    하지만 에러가 나던데..ㅠㅠ 이유를 잘 몰라서 이렇게 물어 보게 되네요..

    -------------------------------------------------------------
    Error #2044: 처리되지 않은 ioError입니다. text=Error #2048: 보안 샌드박스 문제가 발생했습니다. http://210.118.69.241/Web_Service_Test/bin-debug/Web_Service_Test.swf은(는) 210.118.69.241:3306에서 데이터를 로드할 수 없습니다.
    --------------------------------------------------------------

    에러 메세지는 위와 같은데.. 이리저리 사방 팔방 물어 보고 해봐도 답이 안나오네요..

    flex builder에서 실행 하였을 때는 잘 되는데... 이걸 웹페이지에 embed로 붙여서 사용하니 바로 에러발생하네요..

    이것 땜시 3일째 잠을 못자고 있는데.. 너무 답답한 마음에.. 물어 보게 되네요..ㅠ

    • 머드초보 2008/09/08 11:23  편집/삭제  댓글 주소

      보안샌드박스 문제입니다.
      MySQL서버가 돌아가는 서버에 crossdomain.xml파일이 있어야합니다.
      이것에 swf파일이 돌아가는 서버가 MySQL이 설치된 서버에 허락이 되어있는지가 정의된 파일입니다.
      http://code.google.com/p/assql/wiki/JavaPolicyFileServer
      이게 서버프로그램인데 요걸 컴파일해서 MySQL이 설치된 서버에 띄워놓으시면 될겁니다.
      사실 저도 안해봐서-_-; 잠만 해볼께요-_-;

      아...해보니까 되네요 ^^
      저걸 서블릿으로 띄우는데 저 띄우는게
      843포트를 열어서 보안파일을 전송하는 듯합니다.
      궁금한거있으면 메일주세요.
      mudchobo@nate.com

  8. 꽃녀 2008/09/08 11:41  편집/삭제  댓글 작성  댓글 주소

    헐..좋은정보입니다.

    저도 따라서 한번 해봐야겠네요.~~

  9. atom 2008/09/08 13:19  편집/삭제  댓글 작성  댓글 주소

    머드초보님이 링크 걸어 주신 곳으로 들어가서 xml이랑 파일을 만들었는데.. 컴파일 해서 그냥 켜놓으라는 이야기인가요??ㅋ

    • 머드초보 2008/09/08 13:27  편집/삭제  댓글 주소

      컴파일해서 톰캣으로 띄우는겁니다.
      톰캣이 뜨면서 저 프로그램로직상 843포트를 열어놓게 되는데
      이 포트를 이용해서 클라이언트가 보안파일을 요청하는데
      보안파일에 허용되는 도메인이면
      허용할 수 있게 하는겁니다.

      즉, 톰캣의 $CATALINA_HOME$/webapps/ROOT/WEB-INF/classes에 저 컴파일한게 들어가고, web.xml에는 저기 설정에 맞는 서블릿 설정이 들어가면 되겠죠 ^^

      c로 된 것도 예전에 있었는데요.
      이 놈은 cygwin을 이용해서 gcc로 컴파일해서 그냥 띄워놓으면 되는겁니다.

  10. 꽃녀 2008/09/08 13:56  편집/삭제  댓글 작성  댓글 주소

    그러니깐..

    저위의 예는 서버사이드(JAVA, PHP)없이 ASSQL을 사용한 예이구요..

    실제 개발할때는 ASSQL을 사용하지 않고 Remoting 등으로

    서버사이드를 거쳐 (일반적인 방식으로..) 사용하라는 말인거죠? ^^;

    저도 헷갈리고 사람들도 헷갈릴거 같아서 ㅋ;;

    • 머드초보 2008/09/08 14:23  편집/삭제  댓글 주소

      아넵 맞습니다 ^^
      아직 asSQL이 보안상 문제가 좀 있다고 합니다-_-;
      그리고, DAO단은....따로 빼는게 편한 ^^
      그냥 저 예제는 저 정도가 가능하다는 것을 그냥 보여준거죠 ^^

  11. 네버다이 2008/09/12 14:04  편집/삭제  댓글 작성  댓글 주소

    머드초보님 잘 지내셨는지요? ^^

    assql 찾다가 또 머드초보님 홈피로 왔네요.

    위 예제 따라해보고 있는데요. 로컬은 잘되나 제 홈피계정에서 돌리면 위에서 이미 언급하신분처럼

    에러가 나네요. crossdomain.xml 설정해줬구요.

    http://otl.pe.kr/a/assql.html

    위 페이지입니다.

    호스팅업체에서는 localhost호스트에 대해서 따로 막지는 않았다고 합니다. 포트도 기본포트구요.

    문제가 뭘까요? 그럼 추석 잘 보내세요~


    <?xml version="1.0"?>
    <cross-domain-policy>
    <allow-access-from domain="*" to-ports="3306" secure="false" />
    <allow-access-from domain="*.otl.pe.kr" to-ports="3306" secure="false" />
    <allow-access-from domain="www.otl.pe.kr" to-ports="3306" secure="false" />
    <allow-access-from domain="otl.pe.kr" to-ports="3306" secure="false" />
    </cross-domain-policy>

    • 머드초보 2008/09/12 14:18  편집/삭제  댓글 주소

      안녕하세요~
      assql은 http통신이 아닌 소켓으로 3306포트로 직접 통신하고 있습니다.
      그래서 3306포트로 소켓을 연결할 때 FLEX애플리케이션은 843포트로 크로스도메인파일을 요청합니다.
      그래서 843포트로 크로스도메인파일을 줄 서버프로그램을 만들어야합니다.
      http://code.google.com/p/assql/wiki/JavaPolicyFileServer
      이거대로 톰캣으로 띄워서 843포트를 여시는 방법이 있구요.
      서버가 유닉스나 리눅스 계열이라면 gcc를 이용한 방법이 있습니다.
      http://panzergruppe.hp.infoseek.co.jp/fspfd.html
      그리고 assql은 localhost로 하면 안되더라구요.
      아이피를 직접 써주셔야합니다.
      해당 MySQL서버의 아이피를 직접 써주셔야합니다 ^^

      그나저나 네버다이님 오랜만이네요 ^^

  12. 네버다이 2008/09/12 14:42  편집/삭제  댓글 작성  댓글 주소

    네 오래간만이네요. 오기는 자주왔는데 글을 안써서리.. ^^

    제가 호스팅을 받다보니 제약이 많네요.

    우선 linux서버에 apache,php,mysql 연동된 호스팅받고 있구요.

    업체쪽에서 뭔가 해주지지는 않을꺼 같네요. 이거 되면 홈피에 이거저거 만들어 볼라고 했더만

    843번만이라도 열어달라고 하면될라나... ^^

    ip를 직접써줘야 한다는건 결국 연동했을때 공인ip를 가진 mysql일 경우만 가능한 경우가 되겠군요.

    • 머드초보 2008/09/12 14:53  편집/삭제  댓글 주소

      아 그렇군요.
      843번포트로 서버프로그램만 띄울 수 있다면 됩니다 ^^
      ip말고 도메인으로 해도 될것같은데요.
      mysql이 떠있는 서버의 아이피나, 도메인주소를 알면 되는것이죠^^
      호스팅을 받고 있군요.
      음 샤바샤바만 잘해보시면 ^^

  13. 돌아이비 2008/11/12 12:07  편집/삭제  댓글 작성  댓글 주소

    안녕하세요? 플렉스를 공부하고 있는 초보 프로그래머입니다.^^
    asSQL 관련예제를 검색하다가 머드초보님 블로그를 방문하게 되었는데 플렉스 관련 예제가 많네요~
    머드초보님 예제들로 열공해야겠습니다. 좋은 예제들 감사해요~^^

    • 머드초보 2008/11/15 10:41  편집/삭제  댓글 주소

      저도 초보 프로그래머입니다 ㅠㅠ
      허접한 예제가 도움이 되었으면 합니다 ^^

  14. 돌아이비 2008/11/13 00:02  편집/삭제  댓글 작성  댓글 주소

    예제 받아간지 얼마되지 않아서 바로 질문을 드리게 되네요..^^;;
    #2048 보안샌드박스 문제가 발생하길래 댓글로 알려주신 페이지에 있는 소스들 참고해서
    web.xml / crossdomain.xml / PolicyServerServlet.java 3개 파일을 만들었습니다.

    web.xml은 $CATALINA_HOME$/webapps/ROOT/WEB-INF 내의 web.xml 파일에 내용 추가했고,

    crossdomain.xml 파일은 $CATALINA_HOME$/webapps/ROOT 폴더 내에 두었고요.

    PolicyServerServlet.java 파일은 javac로 컴파일해서
    PolicyServerServlet.class / PolicyServerServlet$1.class / PolicyServerServlet$1$1.class 3개 파일을
    $CATALINA_HOME$/webapps/ROOT/WEB-INF/classes/com/maclema/flash 폴더 내에 넣었습니다.

    그런데도 디버그 모드로 띄워보니

    오류: http://localhost:8080/lcds/assql-ex-debug/main.swf의 SWF는 정책 파일 없이 해당 도메인에서 소켓에 연결할 수 없습니다.

    라는 오류메시지가 뜨네요..ㅠ_ㅠ

    의심가는 부분은 PolicyServerSevlet.java 파일 내 crossdomain.xml 파일 경로 설정 부분 뿐인데..
    어떻게 해야 보안샌드박스 문제를 해결할 수 있을지 도저히 감이 안와서 이렇게 댓글을 남깁니다.

    그럼 즐거운 하루 보내시고 시간 여유있으실 때 답변 부탁드려요^^ 굽신굽신~

    • 머드초보 2008/11/15 10:44  편집/삭제  댓글 주소

      음...우선 정책파일을 못 찾는 것 같은데....
      서블릿에서 생성하는 놈은 843포트로 정책파일을 받는 스레드를
      만드는 겁니다. assql은 소켓을 통해 db내용을 송수신 하기 때문입니다.
      타 도메인에 있는 소켓을 사용하려면 정책파일에 허락이 되어있는지
      정의가 되어있어야 하는데요.
      위는 뭔가 셋팅이 잘못 된 듯 합니다.
      결론은 저...저도 잘모르겠습니다 ㅠㅠ

  15. 돌아이비 2008/11/17 07:32  편집/삭제  댓글 작성  댓글 주소

    음.. 그렇군요.. ㅠ_ㅠ
    여기저기 검색하면서 이렇게 저렇게 고쳐봤는데도 여전히 먹통이네요.. ㅠ_ㅠ
    그래도 로컬에서는 잘 돌아가니까 공부하는데는 별 지장이 없네요~
    정책파일 문제는.. 다 그렇듯이 언젠가는 해결법을 찾겠죠^^;
    답변 감사드려요~ 즐거운 하루 보내세요^^

    • 머드초보 2008/11/19 14:11  편집/삭제  댓글 주소

      음....보안샌드박스문제는 생각해보면 간단합니다.
      해당 서버에서 해당 도메인을 허락하는거죠 ^^
      좀만 더 보시면 알 수 있을겁니다^^

  16. EH71 2008/11/19 12:46  편집/삭제  댓글 작성  댓글 주소

    안녕하세요-
    흔적도 없이 포스팅 잘 보고 있습니다ㅎㅎㅎ

    오늘은 흔적을 좀 남겨야 할 것 같은데요....
    책들을 참조해서 자바 서버 애플리케이션 <-> 플렉스 클라이언트 채팅 프로그램을 만들어보고 있는데요.
    서버는 톰캣에 얹어 돌리는 서블릿은 아니고 소켓이 구현되어 있는 통짜 애플리케이션입니다.

    플렉스 클라이언트에서 접속을 시도하면 보안 샌드박스 에러가 나는데요.
    이 포스트에 써주신 같은 방법으로 이 문제를 해결할 수 있는건지 궁금합니다.
    클라이언트는 80포트로 html 파일에 접근해서, 8401포트로 자바 애플리케이션에 접근합니다.

    이 포스트에 있는 방법을 수정해서 적용해야 한다면 어떤 부분을 수정해주어야 하나요?

    답변 주시면 감사드리겠습니다ㅠ 초보에겐 너무 어렵네요ㅠㅠ

    • 머드초보 2008/11/19 14:12  편집/삭제  댓글 주소

      안녕하세요!
      구조가 어떻게 되어있는지 이해가 잘 안되네요 ㅠ
      클라이언트가 80포트로 html에 접근하다니 무슨 말인지 모르겠어요.

http://mudchobo.tomeii.com/tt/318

새로운 버전에서 방식이 바뀌었습니다.

여기위에것을 보고 하세요 ^^

우연히 지돌스타님 블로그를 구독하다가 좋은 정보가 있어서 보고 있었습니다.
Flex에서 db와 연동하는 좋은 드라이버가 있다는 정보입니다.
http://blog.jidolstar.com/312


그래서 제가 삽질해봤습니다-_-;

보통 DB랑 연동하려면 JAVA, PHP, ASP 등 다른 언어와 연동이 필요합니다.
근데 이 asSQL이라는 것을 이용하면 그냥 Flex단에서 DB와 연결해줍니다.
우선 asSQL을 받아봅시다.
http://code.google.com/p/assql/
여기서 오른쪽에 보면 2.0.1버전용과 3.0.0버전용이 있습니다.
저는 Flex3으로 할 것이기에 3.0.0을 받아보도록 하겠습니다. assql_Beta2_Flex3.0.0.swc
DB에는 이런 테이블과 이런 데이터가 있다고 합시다.


CREATE TABLE `products` (
`id` int(11) NOT NULL,
`description` varchar(255) default NULL,
`price` decimal(15,2) default NULL,
PRIMARY KEY (`id`),
KEY `products_description` (`description`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr;

INSERT INTO `products` (`id`, `description`, `price`) VALUES
(1, 'Lamp', 469.80),
(2, 'Table', 3502.62),
(3, 'Chair', 1061.12);

그럼 플렉스 빌더를 실행합니다.
File -> New -> Flex Project 선택합니다. Project name은 FlexMysqlTest 라고 합시다.
Web application선택하고, Application server type은 None으로 하고 Finish 선택!

libs폴더가 있는데요. 아까 받은 assql_Beta2_Flex3.0.0.swc 파일을 libs폴더에 복사합니다.


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="init();" width="400" height="400">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import com.maclema.mysql.events.MySqlErrorEvent;
import com.maclema.mysql.events.MySqlEvent;
import mx.collections.ArrayCollection;
import com.maclema.mysql.ResultSet;
import com.maclema.mysql.Statement;
import com.maclema.mysql.Connection;

[Bindable]
private var ac:ArrayCollection;
private var con:Connection;
private var st:Statement;

private function init():void {
con = new Connection("DB주소", 3306,
"DB아이디", "DB비밀번호", "DB이름");
con.addEventListener(Event.CONNECT, onConnect);
con.addEventListener(MySqlErrorEvent.SQL_ERROR, onError);
con.connect();
}

private function onConnect(e:Event):void {
st = con.createStatement();
st.addEventListener(MySqlEvent.RESULT, onResult);
st.addEventListener(MySqlEvent.RESPONSE, onResponse);
st.addEventListener(MySqlErrorEvent.SQL_ERROR, onError);

st.executeQuery("SELECT id, description, price FROM products");
}

private function onResult(event:MySqlEvent):void {
//FOR SELECT
var resultset:ResultSet = event.resultSet;
ac = resultset.getRows();
}

private function onResponse(event:MySqlEvent):void {
//FOR INSERT, UPDATE, etc.
}

private function onError(event:MySqlErrorEvent):void {
Alert.show(event.text);
}
]]>
</mx:Script>

<mx:DataGrid id="dg" width="100%" height="100%" dataProvider="{ac}"/>

</mx:Application>

소켓을 이용해서 하는거라 connect를 호출하고 연결한 뒤 소켓으로 막 보내는 것 같아요.
어쨌든 저렇게 하면 되네요. 참 쉽죠?(밥로스 버전-_-)

INSERT, UPDATE 와 SELECT는 이벤트가 서로 틀립니다.
INSERT,UPDATE는 RESPONSE고, SELECT는 RESULT네요 ^^

사용자 삽입 이미지


머드초보 이 작성.

당신의 의견을 작성해 주세요.

  1. Comment RSS : http://mudchobo.tomeii.com/tt/rss/comment/245
  2. 지돌스타 2008/04/03 00:06  편집/삭제  댓글 작성  댓글 주소

    ㅎㅎㅎ 잘봤습니다.
    좋은 글 감사해요~ ^^

  3. 검쉰 2008/04/03 09:47  편집/삭제  댓글 작성  댓글 주소

    phpmyadmin 같은 mysql 관리툴 하나 만들어주세요! ㅋ

  4. 펄렁거스 2008/04/04 17:42  편집/삭제  댓글 작성  댓글 주소

    좋은 예제 감사합니다. 한동안 이것 저것 해봤는데 잘 안됬었는데
    한방에 되는군요...

    그런데.. 한글이 깨지는데 이건 어떻게 처리 해야 하나요?

    • 머드초보 2008/04/07 08:16  편집/삭제  댓글 주소

      보면 flex는 무조건 utf8로 보내게 되어있습니다.
      만약 mysql서버가 euc-kr로 되어있다면 euc-kr로 보내야겠죠.
      보면 저 드라이버는 utf8로 보내게 되어있습니다.
      그래서 저걸 euc-kr로 보내려면 driver소스를 수정해야합니다.
      Connection클래스에서
      //packet.writeUTFBytes(data);
      packet.writeMultiByte(data, "euc-kr";);
      저렇게 하면 euc-kr로 보내게 됩니다.

      그리고 ResultSet에서
      //return data.readUTFBytes(data.bytesAvailable);
      return data.readMultiByte(data.bytesAvailable, "euc-kr";);
      데이터를 받을 때 보면 UTF로 받는데 euc-kr로 받아주면됩니다.

      근데 해보니까 친구서버에서는 잘 되는데 제 로컬에 있는 서버에서는 안되더군요.
      그래서
      st.executeQuery("SET NAMES 'utf8'";);
      저렇게 강제적으로 utf8로 만들고 날리면-_-;
      Response로 받는데 거기서 다시 select를 해보시면 됩니다-_-;

      결론은..아직 불안전한 드라이버같습니다 ㅠ

  5. 펄렁거스 2008/04/07 12:05  편집/삭제  댓글 작성  댓글 주소

    아 감사합니다. ㅠㅠ
    이런저런 연구를 해봐야 겠네요...

    알려주신데로 st.executeQuery("SET NAMES 'utf8'";);
    로 해결 보았습니다..

    감사해요 ^^

    • 머드초보 2008/04/07 12:38  편집/삭제  댓글 주소

      근데 친구서버는 SET NAMES안해도 되던데 이상하네-_-;
      아 그리고 친구말로는 DB접속정보가 SWF에 포함되기 때문에
      보안상 위험하다고 합니다.
      그래서 접속정보만 따로 빼서 보안처리를 해야할 듯 합니다.
      방문해주셔서 감사해요 ^^

  6. 쉭스 2008/04/08 18:54  편집/삭제  댓글 작성  댓글 주소

    좋은정보 감사요~
    콕콕 찝은.. 이런 좋은 정보가.. 역시...ㅋㅋ
    요새 여기 자주 들르네용~ 히히~

    - 한글닉네임의 압박이..;;ㅎ

    • 머드초보 2008/04/08 23:05  편집/삭제  댓글 주소

      정보가 도움이 되셨다니 다행이네요 ^^
      방문해주셔서 감사해요 ^^

  7. 2008/04/19 10:35  편집/삭제  댓글 작성  댓글 주소

    혹시 crud예제는 없나요?

    • 머드초보 2008/04/21 08:01  편집/삭제  댓글 주소

      다 만들면 되죠 ^^
      st.addEventListener(MySqlEvent.RESPONSE, onResponse);
      이렇게 이벤트리스너를 추가하면, delte나 update, insert하면 저 이벤트함수로 들어가게 돼요. ^^

  8. 찌노 2008/05/09 09:46  편집/삭제  댓글 작성  댓글 주소

    크~ 지돌스타님 블로그 타고 왔어욤..; 이래 친절하게 예제를 만들어서 오픈해주시다니..
    감사합니당 ~ ^^ 많은 도움이 되었습니닷..!

  9. 만성피로 2008/05/13 11:29  편집/삭제  댓글 작성  댓글 주소

    머드초보님 안녕하세요~
    올려주신 자료 잘보고 해보고싶은 욕망에 DB에 테이블 생성하고 컬럼 추가한뒤에
    Flex에서 똑같이 프로젝트 생성한뒤에 실행을 시켜 보았습니다.
    그런데 "SQL Error #0:Error #2031" 에러가 뜨네용
    mxml파일에서 쿼리를 Select해서 ID와 PASS 와 이름 불러오는것은알겠는데
    어떤 데이타베이스를 쓰는지 가령
    mysql데이타베이스인지 Flex라는 데이타베이스를 생성했을때 Flex데이타베이스를 어떻게사용하는지
    알려주시기 바랍니다~~
    코딩에서 보면 어디에도 어떤 데이타베이스를 사용하는지를 찾을수가 없네요...개초보에 설움..흑흑

    부탁드리겠습니다~~

    • 머드초보 2008/05/14 08:24  편집/삭제  댓글 주소

      con = new Connection("DB주소", 3306,
      "DB아이디", "DB비밀번호", "DB이름";);
      커넥션을 만들 때 여기다가 입력하면 됩니다.
      DB주소는 jdbc:막이런거 ^^
      db아이디는 아이디고, 비밀번호는 비밀번호고,
      db이름은 db이름쓰시면 됩니다 ^^

  10. 만성피로 2008/05/15 10:13  편집/삭제  댓글 작성  댓글 주소

    아...머드초보님 답변감사합니다....
    그런데 제가
    con = new Connection("jdbc:mysql//localhost:3306/flex",3306,
    "admin","jpaWkd", "flex";);
    admin이 디비아이디이고 jpaWkd가 DB패스워드 flex가 DB이름입니다.
    그런데 에러가 아직두 나네용..흑흑
    jdbc:mysql//localhost:3306/flex가 의심스러운데 흑흑..
    질문드리면서도 X팔려서 흑흑
    답변좀 해주시기 바래요 흑흑

  11. 만성피로 2008/05/15 10:16  편집/삭제  댓글 작성  댓글 주소

    API 살펴보니...이런식인데
    Connection () constructor

    public function Connection(host:String, port:int, username:String, password:String = null, database:String = null)
    흑흑...죽고싶퍼 캬악~

  12. 만성피로 2008/05/15 10:39  편집/삭제  댓글 작성  댓글 주소

    으흐흐...미쳐가는중 ㅋㅋ
    Google의 example가 있더라고용
    con = new Connection("localhost", 3306, "root", "password", "database name";);
    그래서 똑같이 저도 localhost로 불렀는데 데이타가 불러와지질않네요...흠흠...
    이건 머 에러메세지가 뜨질않으니 손을 어디서 대야하는지 몰겠네용..
    1.DB생성여부
    2.DB쿼리
    일단 이두개는 확실한데 말이죠 ㅎㅎ

    • 머드초보 2008/05/16 08:25  편집/삭제  댓글 주소

      음 왜그러지-_-;
      localhost말고 ip로 한번 넣어보세요 ^^
      저도 왜그런지 모르겠네요 ㅠㅠ

  13. 오리대장 2008/06/21 05:38  편집/삭제  댓글 작성  댓글 주소

    언뜻보면은 와 유용하겠다 생각들다가도 조금만 생각해보면...
    보안문제때문에 사실상 쓰지도못할거같네요 ㅜ.ㅜ'
    보안문제와 좀더체계적인 뭔가가 필요한데...

    • 머드초보 2008/06/22 20:28  편집/삭제  댓글 주소

      아네 그렇죠 ^^ swf파일이 완벽하게 디컴파일이 되다보니-_-;
      게다가 소켓통신으로 하는것 같아서 보안상 참 안 좋은 것 같아요.
      DB연동은 JAVA와 함께-_-;

  14. atom 2008/08/18 04:30  편집/삭제  댓글 작성  댓글 주소

    안녕하세요... 어떻게 검색하다.. flex와 mysql이 연동되는 글을 찾았는데 들어 오게 되었네요...

    정말 좋은 자료 인것 같아요..

    그런데 제가 이번에 flex를 처음 해보는거라 잘몰라서요.

    위의 예제 처럼 실행이랑 DB가져 오는건 아주 잘되는것 같아요...

    하지만 DB에서 가져온 arraycollection에 들어 있는 내용을 어떻게 가져와 사용을 하는지 모르겠습니다..

    datagrid는 그냥 ar에 있는걸 그대로 dataprovider에 넣어 주니 바로 나오던데 다른 list나 label이나 이런곳에 가져다 쓸려니 잘 안되더라구요..

    어떻게 하면 되는지 좋은 자료를 얻어 가는데 또 염치 없이 물어 보게 되네요..*^^*

    부탁드립니다.. 아~ 그리고 한글이 디비에 있는걸 가져오는게 위에 적혀 있는게 하는 건지 잘 이해가 가지 않네요..

    • 머드초보 2008/08/19 08:31  편집/삭제  댓글 주소

      안녕하세요!
      ArrayCollection은 배열인데요. label에 사용하시려면 그냥 ac변수에서 해당 값을 접근할 수 있어요. getItem인가? 그런 메소드가 있는데 그걸로 해당 Object로 접근해서 원하는 값에 접근하면 돼죠. 그걸 이용해서 사용하시면 되구요.
      ArrayCollection에 관련된 API나 예제를 찾아보시면 금방 이해하실 수 있을 겁니다 ^^
      java에서 List같은 놈이죠.

  15. atom 2008/08/19 22:56  편집/삭제  댓글 작성  댓글 주소

    안녕하세요~~! 우선 답변 감사합니다.

    저도 머드초보님이 이야기 하신데로 해보았습니다. 하지만 되지 않네요... 댓글 보기 전 글을 남길때 다 해보고 남긴거라서..

    <mx:Label x="31" y="301" width="285" height="47"
    text="{ac.getItemAt(0).toString()}"/>

    이렇게 하니 [object Object] 이렇게만 나오던데..ㅋㅋㅋ

    위의 예제에 맨끝에 출력에 label하나 붙여서 나타내었어요..

    어떻게 해야 할까요?ㅠㅠ 이걸로 이틀이란 시간을 보내니.. 힘드네요..

    • 머드초보 2008/08/19 23:09  편집/삭제  댓글 주소

      getItemAt()메소드는 배열의 0번째의 Object를 가져오는 겁니다.
      Object를 toString()해버리면 당연히 그렇게 나옵니다.
      해당 Object에 대한 속성값을 나타내면 되죠.
      {ac.getItemAt(0).description} 이런식으로 사용하면 됩니다.
      저위의 예제를 따라하셨다면 description, id, price속성이 있을껍니다.
      디버깅해보시면 알 수 있습니다 ^^

  16. atom 2008/08/20 00:39  편집/삭제  댓글 작성  댓글 주소

    감사합니다.. 점을 찍었을때 나오지 않아서 되지 않는 줄 알았는데 되네요..

    C#에서는 점을 찍으면 나오는데.. flex는 처음 접해서 잘 몰랐습니다.

    정말 감사합니다.

    • 머드초보 2008/08/20 08:23  편집/삭제  댓글 주소

      어떤값이 들어갈지 모르니 점찍으면 안나와요 ^^
      아 그리고, Flex단에서 db연동은 보안상 위협(?)을 느낄 수 있습니다-_-;
      DB는 JAVA나 서버단 언어에서 하도록 하는게 좋습니다 ^^

  17. 동그라미 2008/08/23 04:29  편집/삭제  댓글 작성  댓글 주소

    실행을 하면
    st.addEventListener(MySqlEvent.RESULT, onResult);
    st.addEventListener(MySqlEvent.RESPONSE, onResponse);
    st.addEventListener(MySqlErrorEvent.SQL_ERROR, onError);

    에서 1061: 정의되지 않은 메서드 addEventListener을(를) 정적 유형 com.maclema.mysql:Statement의 참조를 통해 호출했습니다. 라고 하는데 무엇이 문제일까요...T_T

    • 머드초보 2008/08/25 08:31  편집/삭제  댓글 주소

      음....이상하네요.
      혹시...그 assql swc파일은 넣으셨는지요?
      없다고 나오는 것보니 라이브러리가 없는 것 같은데요.
      도움이 되지 못해서 죄송해요 ㅠ

  18. keril 2008/09/02 21:46  편집/삭제  댓글 작성  댓글 주소

    저도 동그라미님이랑 같은 오류가납니다
    머드초보님께서 말씀하신 assql_Beta2_Flex3.0.0.swc 는 없구요
    대신 asSQL-Beta2.7.swc 을 받았는데 여기에는 addEventListener메소드가 없나봐요
    이걸 어케해야할지 ㅜㅜ

    • keril 2008/09/02 22:00  편집/삭제  댓글 주소

      애궁 제가 문제제기하구 해결까지했네요
      해결이라긴뭐하지만 assql_Beta2_Flex3.0.0.swc 을 제대로 구해서 넣으니 되더군요
      버전다른 엄한걸받아서 피봤네요 ^^

      무슨이유인지는 모르지만 다운로드 목록에서 assql_Beta2_Flex3.0.0.swc
      이 없어진듯 합니다.

      여기저기 기웃거린 결과 렉스님의 블로그에 링크목록이 있더군요 주소 올립니다...
      http://blog.naver.com/rojinsong?Redirect=Log&logNo=50030139861
      불펌이에요 ^^;;

    • 머드초보 2008/09/02 23:23  편집/삭제  댓글 주소

      아....뭔가 코딩방식이 바뀌었나보군요.
      새로운 버전이 나왔는데 그걸로 다시 예제를 작성해봐야겠습니다.
      감사해요 ^^

  19. keril 2008/09/02 23:56  편집/삭제  댓글 작성  댓글 주소

    거의 다된줄알구 좋아했는데 마지막에 뭔가 틀어졌네요 ㅎ

    run을하면 새창에서 SQL Error #0: Error #2031: 소켓 오류입니다. URL: jdbc:mysql://localhost/aa
    이라는 메세지가 나와요 ㅜㅜ
    mysql-connector 도 제대로 받아서 C:\Program Files\Java\jdk1.6.0_07\jre\lib\ext 경로로 잘 넣어줬는데 더이상 뭐가 잘못된건지 짐작도 가지않아요 ㅜㅜ

    도움 부탁드립니다

    • 머드초보 2008/09/03 08:45  편집/삭제  댓글 주소

      그건 mysql설정문제 인 듯 싶습니다 ^^
      mysql은 포트를 1521을 사용하는데
      mysql://localhost:1521/aa 를 해보면 될 것 같기도하고-_-;
      암튼, 저 주소를 못찾는 것 같아요 ^^

    • 머드초보 2008/09/03 09:17  편집/삭제  댓글 주소

      아그리고, 예제를 보니 코딩방식이 바뀐게 맞네요.
      Statement에 addListener를 하는게 아니라
      token을 만들어서 하는 듯 하네요.
      좀 더 봐야겠네요 ^^

    • keril 2008/09/03 15:08  편집/삭제  댓글 주소

      3.0버전은 날려버리고 mysql설치부터 다시 삽질해봐야겠어요 ㅋ

      mysql://localhost:1521/aa 로 바꿔서 해봐도 역시 같은 메세지가 나옵니다 ^^

    • 머드초보 2008/09/03 18:59  편집/삭제  댓글 주소

      아 mysql의 버전이 낮아서 일 수도 있겠네요.
      저는 테스트할 때 5.0에서 했습니다.
      그리고, 새로운 버전asSQL2.7Beta용으로 예제를 만들어봤습니다.
      참고해주세요 ^^
      mysql버전을 올리고 다시 해보세요 ^^