데이터베이스에서 데이터 검색

Adobe AIR 1.0 이상

데이터베이스에서 데이터를 검색하는 작업은 두 단계로 이루어집니다. 먼저, 데이터베이스에서 원하는 데이터 집합을 설명하는 SQL SELECT 문을 실행합니다. 다음으로, 검색된 데이터에 액세스하고 응용 프로그램에서 필요한 대로 표시하거나 조작합니다.

SELECT 문 실행

데이터베이스에서 기존 데이터를 검색하려면 SQLStatement 인스턴스를 사용합니다. 적절한 SQL SELECT 문을 인스턴스의 text 속성에 할당한 다음 execute() 메서드를 호출합니다.

SELECT 문의 구문에 대한 자세한 내용은 로컬 데이터베이스의 SQL 지원을 참조하십시오.

다음 예제에서는 비동기 실행 모드를 사용하는 경우 SELECT 문을 실행하여 "products"라는 테이블에서 데이터를 검색하는 방법을 보여 줍니다.

var selectStmt:SQLStatement = new SQLStatement(); 
     
// A SQLConnection named "conn" has been created previously 
selectStmt.sqlConnection = conn; 
     
selectStmt.text = "SELECT itemId, itemName, price FROM products"; 
     
selectStmt.addEventListener(SQLEvent.RESULT, resultHandler); 
selectStmt.addEventListener(SQLErrorEvent.ERROR, errorHandler); 
     
selectStmt.execute(); 
     
function resultHandler(event:SQLEvent):void 
{ 
    var result:SQLResult = selectStmt.getResult(); 
     
    var numResults:int = result.data.length; 
    for (var i:int = 0; i < numResults; i++) 
    { 
        var row:Object = result.data[i]; 
        var output:String = "itemId: " + row.itemId; 
        output += "; itemName: " + row.itemName; 
        output += "; price: " + row.price; 
        trace(output); 
    } 
} 
     
function errorHandler(event:SQLErrorEvent):void 
{ 
    // Information about the error is available in the 
    // event.error property, which is an instance of  
    // the SQLError class. 
}
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.errors.SQLError; 
            import flash.events.SQLErrorEvent; 
            import flash.events.SQLEvent; 
             
            private function init():void 
            { 
                var selectStmt:SQLStatement = new SQLStatement(); 
                 
                // A SQLConnection named "conn" has been created previously 
                selectStmt.sqlConnection = conn; 
                 
                selectStmt.text = "SELECT itemId, itemName, price FROM products"; 
                 
                selectStmt.addEventListener(SQLEvent.RESULT, resultHandler); 
                selectStmt.addEventListener(SQLErrorEvent.ERROR, errorHandler); 
                 
                selectStmt.execute(); 
            } 
             
            private function resultHandler(event:SQLEvent):void 
            { 
                var result:SQLResult = selectStmt.getResult(); 
                 
                var numResults:int = result.data.length; 
                for (var i:int = 0; i < numResults; i++) 
                { 
                    var row:Object = result.data[i]; 
                    var output:String = "itemId: " + row.itemId; 
                    output += "; itemName: " + row.itemName; 
                    output += "; price: " + row.price; 
                    trace(output); 
                } 
            } 
             
            private function errorHandler(event:SQLErrorEvent):void 
            { 
                // Information about the error is available in the 
                // event.error property, which is an instance of  
                // the SQLError class. 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

다음 예제에서는 동기 실행 모드를 사용하는 경우 SELECT 문을 실행하여 "products"라는 테이블에서 데이터를 검색하는 방법을 보여 줍니다.

var selectStmt:SQLStatement = new SQLStatement(); 
     
// A SQLConnection named "conn" has been created previously 
selectStmt.sqlConnection = conn; 
     
selectStmt.text = "SELECT itemId, itemName, price FROM products"; 
     
try 
{ 
    selectStmt.execute(); 
     
    var result:SQLResult = selectStmt.getResult(); 
     
    var numResults:int = result.data.length; 
    for (var i:int = 0; i < numResults; i++) 
    { 
        var row:Object = result.data[i]; 
        var output:String = "itemId: " + row.itemId; 
        output += "; itemName: " + row.itemName; 
        output += "; price: " + row.price; 
        trace(output); 
    } 
} 
catch (error:SQLError) 
{ 
    // Information about the error is available in the 
    // error variable, which is an instance of  
    // the SQLError class. 
}
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.errors.SQLError; 
            import flash.events.SQLErrorEvent; 
            import flash.events.SQLEvent; 
             
            private function init():void 
            { 
                var selectStmt:SQLStatement = new SQLStatement(); 
                 
                // A SQLConnection named "conn" has been created previously 
                selectStmt.sqlConnection = conn; 
                 
                selectStmt.text = "SELECT itemId, itemName, price FROM products"; 
                 
                try 
                { 
                    selectStmt.execute(); 
                     
                    var result:SQLResult = selectStmt.getResult(); 
                     
                    var numResults:int = result.data.length; 
                    for (var i:int = 0; i < numResults; i++) 
                    { 
                        var row:Object = result.data[i]; 
                        var output:String = "itemId: " + row.itemId; 
                        output += "; itemName: " + row.itemName; 
                        output += "; price: " + row.price; 
                        trace(output); 
                    } 
                } 
                catch (error:SQLError) 
                { 
                    // Information about the error is available in the 
                    // error variable, which is an instance of  
                    // the SQLError class. 
                } 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

비동기 실행 모드에서는 이 문의 실행이 완료되면 SQLStatement 인스턴스가 이 문이 성공적으로 실행되었음을 나타내는 result 이벤트(SQLEvent.RESULT)를 전달합니다. 또는 Responder 객체가 execute() 메서드에서 인수로 전달되면 Responder 객체의 결과 핸들러 함수가 호출됩니다. 동기 실행 모드에서는 execute() 작업이 완료될 때까지 실행이 일시 중지된 후 다음 코드 줄에서 계속됩니다.

SELECT 문 결과 데이터 액세스

SELECT 문의 실행이 완료된 후의 다음 단계는 검색된 데이터에 액세스하는 것입니다. 결과 데이터는 SQLStatement 객체의 getResult() 메서드를 호출하여 SELECT 문을 실행해서 검색합니다.

var result:SQLResult = selectStatement.getResult();

getResult() 메서드는 SQLResult 객체를 반환합니다. SQLResult 객체의 data 속성은 SELECT 문의 결과를 포함하는 배열입니다.

var numResults:int = result.data.length; 
for (var i:int = 0; i < numResults; i++) 
{ 
    // row is an Object representing one row of result data 
    var row:Object = result.data[i]; 
}

SELECT 결과의 각 데이터 행은 data 배열에 포함된 객체 인스턴스가 됩니다. 이 객체에는 결과 집합의 열 이름과 일치하는 이름의 속성이 있습니다. 이러한 속성에는 결과 집합의 열에 있는 값이 포함됩니다. 예를 들어, SELECT 문에서 “itemId”, “itemName” 및 “price”라는 세 열이 포함된 결과 집합을 지정하는 경우 결과 집합의 행마다 itemId, itemNameprice라는 속성과 함께 Object 인스턴스가 만들어집니다. 이러한 속성에는 해당하는 열의 값이 포함됩니다.

다음 코드 샘플에서는 SELECT 문이 텍스트로 포함된 SQLStatement 인스턴스를 정의합니다. 이 문은 employees라는 테이블에 있는 모든 행의 firstNamelastName 열 값이 포함된 행을 검색합니다. 이 예제에서는 비동기 실행 모드를 사용합니다. 실행이 완료되면 selectResult() 메서드가 호출되고 결과 데이터 행이 SQLStatement.getResult()를 사용하여 액세스되고 trace() 메서드를 사용하여 표시됩니다. 이 샘플에서는 이미 인스턴스화되고 데이터베이스에 연결된 conn이라는 SQLConnection 인스턴스가 있다고 가정합니다. 또한 “employees” 테이블이 이미 만들어져서 데이터로 채워져 있다고 가정합니다.

import flash.data.SQLConnection; 
import flash.data.SQLResult; 
import flash.data.SQLStatement; 
import flash.events.SQLErrorEvent; 
import flash.events.SQLEvent; 
     
// ... create and open the SQLConnection instance named conn ... 
     
// create the SQL statement 
var selectStmt:SQLStatement = new SQLStatement(); 
selectStmt.sqlConnection = conn; 
     
// define the SQL text 
var sql:String =  
    "SELECT firstName, lastName " +  
    "FROM employees"; 
selectStmt.text = sql; 
     
// register listeners for the result and error events 
selectStmt.addEventListener(SQLEvent.RESULT, selectResult); 
selectStmt.addEventListener(SQLErrorEvent.ERROR, selectError); 
     
// execute the statement 
selectStmt.execute(); 
     
function selectResult(event:SQLEvent):void 
{ 
    // access the result data 
    var result:SQLResult = selectStmt.getResult(); 
     
    var numRows:int = result.data.length; 
    for (var i:int = 0; i < numRows; i++) 
    { 
        var output:String = ""; 
        for (var columnName:String in result.data[i]) 
        { 
            output += columnName + ": " + result.data[i][columnName] + "; "; 
        } 
        trace("row[" + i.toString() + "]\t", output); 
    } 
} 
     
function selectError(event:SQLErrorEvent):void 
{ 
    trace("Error message:", event.error.message); 
    trace("Details:", event.error.details); 
} 
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.events.SQLErrorEvent; 
            import flash.events.SQLEvent; 
             
            private function init():void 
            { 
                // ... create and open the SQLConnection instance named conn ... 
                 
                // create the SQL statement 
                var selectStmt:SQLStatement = new SQLStatement(); 
                selectStmt.sqlConnection = conn; 
                 
                // define the SQL text 
                var sql:String =  
                    "SELECT firstName, lastName " +  
                    "FROM employees"; 
                selectStmt.text = sql; 
                 
                // register listeners for the result and error events 
                selectStmt.addEventListener(SQLEvent.RESULT, selectResult); 
                selectStmt.addEventListener(SQLErrorEvent.ERROR, selectError); 
                 
                // execute the statement 
                selectStmt.execute(); 
            } 
             
            private function selectResult(event:SQLEvent):void 
            { 
                // access the result data 
                var result:SQLResult = selectStmt.getResult(); 
                 
                var numRows:int = result.data.length; 
                for (var i:int = 0; i < numRows; i++) 
                { 
                    var output:String = ""; 
                    for (var columnName:String in result.data[i]) 
                    { 
                        output += columnName + ": " + result.data[i][columnName] + "; "; 
                    } 
                    trace("row[" + i.toString() + "]\t", output); 
                } 
            } 
             
            private function selectError(event:SQLErrorEvent):void 
            { 
                trace("Error message:", event.error.message); 
                trace("Details:", event.error.details); 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

다음 코드 샘플에서는 이전 코드와 동일한 방법을 보여 주지만 동기 실행 모드를 사용합니다. 이 예제에서는 SELECT 문이 텍스트로 포함된 SQLStatement 인수를 정의합니다. 이 문은 employees라는 테이블에 있는 모든 행의 firstNamelastName 열 값이 포함된 행을 검색합니다. 결과 데이터 행은 SQLStatement.getResult()를 사용하여 액세스되고 trace() 메서드를 사용하여 표시됩니다. 이 샘플에서는 이미 인스턴스화되고 데이터베이스에 연결된 conn이라는 SQLConnection 인스턴스가 있다고 가정합니다. 또한 “employees” 테이블이 이미 만들어져서 데이터로 채워져 있다고 가정합니다.

import flash.data.SQLConnection; 
import flash.data.SQLResult; 
import flash.data.SQLStatement; 
import flash.errors.SQLError; 
     
// ... create and open the SQLConnection instance named conn ... 
     
// create the SQL statement 
var selectStmt:SQLStatement = new SQLStatement(); 
selectStmt.sqlConnection = conn; 
     
// define the SQL text 
var sql:String =  
    "SELECT firstName, lastName " +  
    "FROM employees"; 
selectStmt.text = sql; 
     
try 
{ 
    // execute the statement 
    selectStmt.execute(); 
     
    // access the result data 
    var result:SQLResult = selectStmt.getResult(); 
     
    var numRows:int = result.data.length; 
    for (var i:int = 0; i < numRows; i++) 
    { 
        var output:String = ""; 
        for (var columnName:String in result.data[i]) 
        { 
            output += columnName + ": " + result.data[i][columnName] + "; "; 
        } 
        trace("row[" + i.toString() + "]\t", output); 
    } 
} 
catch (error:SQLError) 
{ 
    trace("Error message:", error.message); 
    trace("Details:", error.details); 
} 
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.errors.SQLError; 
             
            private function init():void 
            { 
                // ... create and open the SQLConnection instance named conn ... 
                 
                // create the SQL statement 
                var selectStmt:SQLStatement = new SQLStatement(); 
                selectStmt.sqlConnection = conn; 
                 
                // define the SQL text 
                var sql:String =  
                    "SELECT firstName, lastName " +  
                    "FROM employees"; 
                selectStmt.text = sql; 
                 
                try 
                { 
                    // execute the statement 
                    selectStmt.execute(); 
                     
                    // access the result data 
                    var result:SQLResult = selectStmt.getResult(); 
                     
                    var numRows:int = result.data.length; 
                    for (var i:int = 0; i < numRows; i++) 
                    { 
                        var output:String = ""; 
                        for (var columnName:String in result.data[i]) 
                        { 
                            output += columnName + ": "; 
                            output += result.data[i][columnName] + "; "; 
                        } 
                        trace("row[" + i.toString() + "]\t", output); 
                    } 
                } 
                catch (error:SQLError) 
                { 
                    trace("Error message:", error.message); 
                    trace("Details:", error.details); 
                } 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

SELECT 결과 데이터의 데이터 유형 정의

기본적으로 SELECT 문에서 반환되는 각 행은 결과 집합의 열 이름과 동일하게 명명된 속성과 각 열의 값이 연결된 속성의 값으로 포함된 Object 인스턴스로 만들어집니다. 그러나 SQL SELECT 문을 실행하기 전에 SQLStatement 인스턴스의 itemClass 속성을 클래스로 설정할 수 있습니다. SELECT 문에서 반환되는 각 행은 itemClass 속성을 설정하여 지정된 클래스의 인스턴스로 만들어집니다. 런타임은 SELECT 결과 집합에 있는 열 이름과 itemClass 클래스에 있는 속성의 이름을 일치시켜 결과 열 값을 속성 값에 할당합니다.

itemClass 속성 값으로 할당된 모든 클래스에는 매개 변수가 필요하지 않은 생성자가 있어야 합니다. 또한 이러한 클래스에는 SELECT 문에서 반환되는 각 열에 대해 하나의 속성이 있어야 합니다. SELECT 목록의 열에 itemClass 클래스의 속성 이름과 일치하는 이름이 없는 경우 오류로 간주됩니다.

SELECT 결과 중 일부 검색

기본적으로 SELECT 문을 실행하면 결과 집합의 모든 행이 한 번에 검색됩니다. 이 문이 완료되면 대개 객체를 만들거나 화면에 데이터를 표시하는 등의 방법으로 검색된 데이터를 처리합니다. 이 문에서 많은 행이 반환되는 경우 모든 데이터를 한 번에 처리하면 컴퓨터 리소스가 많이 사용될 수 있으며 이렇게 되면 사용자 인터페이스가 다시 그려지지 않습니다.

특정 수의 결과 행을 한 번에 반환하도록 런타임에 지시하여 응용 프로그램의 성능을 눈에 띄게 향상시킬 수 있습니다. 이렇게 하면 초기 결과 데이터가 더 빨리 반환됩니다. 또한 결과 행을 집합으로 분할할 수 있으므로 사용자 인터페이스가 각 행 집합이 처리된 후 업데이트됩니다. 이 방법은 비동기 실행 모드에서 사용할 때만 효과적입니다.

SELECT 결과 중 일부를 검색하려면 SQLStatement.execute() 메서드의 첫 번째 매개 변수(prefetch 매개 변수)에 대한 값을 지정합니다. prefetch 매개 변수는 이 문이 처음 실행될 때 검색할 행 수를 나타냅니다. SQLStatement 인스턴스의 execute() 메서드를 호출할 때 prefetch 매개 변수를 지정하면 해당하는 수의 행만 검색됩니다.

var stmt:SQLStatement = new SQLStatement(); 
stmt.sqlConnection = conn; 
     
stmt.text = "SELECT ..."; 
     
stmt.addEventListener(SQLEvent.RESULT, selectResult); 
     
stmt.execute(20); // only the first 20 rows (or fewer) are returned 

이 문은 result 이벤트를 전달하여 결과 행의 첫 번째 집합을 사용할 수 있음을 나타냅니다. 생성되는 SQLResult 인스턴스의 data 속성에는 데이터 행이 포함되어 있으며 complete 속서은 검색할 추가 결과 행이 있는지 여부를 나타냅니다. 추가 결과 행을 검색하려면 SQLStatement 인스턴스의 next() 메서드를 호출합니다. execute() 메서드와 마찬가지로 next() 메서드의 첫 번째 매개 변수는 다음에 결과 이벤트가 전달될 때 검색할 행 수를 나타내는 데 사용됩니다.

function selectResult(event:SQLEvent):void 
{ 
    var result:SQLResult = stmt.getResult(); 
    if (result.data != null) 
    { 
        // ... loop through the rows or perform other processing ... 
         
        if (!result.complete) 
        { 
            stmt.next(20); // retrieve the next 20 rows 
        } 
        else 
        { 
            stmt.removeEventListener(SQLEvent.RESULT, selectResult); 
        } 
    } 
} 

next() 메서드가 결과 행의 이후 집합을 반환할 때마다 SQLStatement는 result 이벤트를 전달합니다. 따라서 동일한 리스너 함수를 사용하여 모든 행이 검색될 때까지 next() 호출을 통해 결과를 계속 처리할 수 있습니다.

자세한 내용은 SQLStatement.execute() 메서드(prefetch 매개 변수 설명) 및 SQLStatement.next() 메서드에 대한 설명서의 설명을 참조하십시오.