Skip to content

Fox DB Access 시작 하기

NeoDEEX 는 Fox DB Access 기능을 제공하여 데이터베이스 액세스를 위한 프레임워크를 제공합니다. 이 문서는 Fox DB Access 의 주요 기능들에 대한 구체적인 예를 간략히 보여줍니다.

Basic DB access

Fox DB Access 를 사용하여 PostgreSQL 데이터베이스에 접근하는 가장 간단한 Console App 예제를 먼저 살펴보도록 하겠습니다.

Information

Fox DB Access 는 데이터베이스 접근을 위한 기능이므로 ASP.NET Web API 와 같이 백앤드 앱에서 대부분 사용됩니다. 특히 Fox TransactionFoxDacBase 클래스와 함께 사용할 때 가장 효과적으로 사용할 수 있습니다. 이 예제는 간단하게 Fox DB Access 를 이해하기 위한 것이므로 콘솔 앱을 사용합니다.

  1. Visual Studio 를 구동하고 새 프로젝트 생성을 선택합니다. 그리고 콘솔 어플리케이션 프로젝트 템플릿을 선택합니다.

  2. 프로젝트 구성 대화 상자에서 프로젝트/솔루션 이름을 적절히 입력합니다.

  3. 프로젝트 추가 정보 대화 상자에서 .NET 8.0 (혹은 그 이상) 을 선택합니다.

  4. PostgreSQL 에 접근하기 위해 NeoDEEX.Data.NpgsqlClient 패키지를 추가 합니다.

    DB Access 패키지 추가

    PostgreSQL 이 아닌 다른 데이터베이스에 접근하고자 한다면 다음 패키지들을 선택할 수 있습니다.

    • MS-SQL : NeoDEEX.Data.SqlClient
    • Oracle : NeoDEEX.Data.OracleClient
    • MySQL : NeoDEEX.Data.MySqlClient
    • ODBC : NeoDEEX.Data.Odbc
  5. 다음과 같이 테이블에서 데이터를 읽는 코드를 작성합니다.

    using NeoDEEX.Data.NpgsqlClient;
    using System.Data;
    
    namespace simple_dbaccess;
    
    internal class Program
    {
        static void Main(string[] args)
        {
            string connectionString = "Server=your_server;Database=your_db;User Id=your_id;Password=your_pwd;";
            string query = "SELECT * FROM products WHERE product_id < 5";
            using FoxNpgsqlDbAccess dbAccess = new(connectionString);
            DataSet ds = dbAccess.ExecuteSqlDataSet(query);
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                Console.WriteLine($"product_id: {row["product_id"]}, product_name: {row["product_name"]}");
            }
        }
    }
    

    Information

    이 예제는 northwind 데이터베이스 스키마를 PostgreSQL 로 전환하여 사용하였습니다. 예제 코드에서 northwind 데이터베이스 스키마를 찾을 수 있습니다.

    Fox DB Access 에서 PostgreSQL 액세스를 위한 구체적인 클래스(concrete class)는 FoxNpgsqlDbAccess 클래스 입니다. 따라서 위 코드는 FoxNpgsqlDbAccess 클래스의 인스턴스를 생성하고 데이터베이스에 대한 연결 문자열을 전달하였습니다.

    ExecuteSqlDataSet 메서드는 주어진 쿼리를 수행하고 그 결과를 DataSet 으로 반환합니다. 이 과정에서 연결 열기(open), 쿼리 수행, DataSet 생성 및 채우기(fill), 연결 닫기(close)와 같은 필요한 여러 과정들은 자동으로 수행됩니다.

    Note

    Fox DB Access 를 사용하면 일반적인 .Net 데이터액세스와 달리 Connection 객체나 Command 객체를 사용하지 않고 곧바로 쿼리를 수행하고 그 결과를 받을 수 있습니다. FoxNpgsqlDbAccess 클래스는 내부적으로 NpgsqlConnection 객체를 생성하고 유지하며 Open/Close 를 수행하고 NpgsqlCommandNpgsqlDataAdapter 객체를 생성하여 쿼리를 수행하여 결과를 반환합니다.

Parmeterized Query

위 예제와 같은 정적인 쿼리보다는 다양한 매개변수가 사용되는 쿼리가 실제로 많이 사용됩니다. Fox DB Access 는 보다 편리하게 DB 매개변수를 사용할 수 있도록 FoxDbParameterCollection 컬렉션을 제공합니다. 기본적인 .NET 데이터액세스에서는 DB 매개변수를 설정하기 위해 Command 객체를 생성하고 이 객체의 Parameters 컬렉션에 접근해야 합니다. 반면, FoxDbParameterCollection 컬렉션은 독립적으로 DB 매개변수 컬렉션을 생성하여 매개변수를 지정할 수 있습니다.

  1. 이 예제에서 사용할 매개변수가 포함된 SQL 문장을 지정합니다.

    string query = "SELECT * FROM products WHERE product_id < :product_id";
    
  2. FoxDbParameterCollection 추상 클래스(abstract class)에 대한 PostgreSQL 의 구체 클래스(concrete class)는 FoxNpgsqlParameterCollection 클래스 입니다. 이 클래스의 인스턴스를 생성하고 AddWithValue 메서드를 호출하여 DB 매개변수의 DB 타입, 값을 지정합니다.

    FoxNpgsqlParameterCollection parameters = [];   // new();
    parameters.AddWithValue("product_id", NpgsqlDbType.Integer, 5);
    

    Note

    DB 매개변수 컬렉션을 구성할 때 매개변수 이름과 값만을 사용하여 간단히 매개변수 설정이 가능합니다.

    parameters.AddWithValue("product_id", 5);
    

    하지만 가능하면 매개변수의 DB 타입을 명시해 주는 것이 좋습니다. 물론 ADO.NET 데이터 프로바이더가 매개변수 값으로부터 추측하여 DB 타입을 지정해 주지만 명시적으로 DB 타입을 전달함으로써 명확성을 높이고 데이터베이스 서버에서 발생할 수 있는 불필요한 타입 전환을 예방할 수 있습니다.

  3. ExecuteSqlDataSet 메서드를 호출할 때 설정해둔 FoxNpgsqlParameterCollection 매개변수 컬렉션을 전달합니다.

    using FoxNpgsqlDbAccess dbAccess = new(connectionString);
    DataSet ds = dbAccess.ExecuteSqlDataSet(query, parameters);
    

Single API DB Access

Fox DB Access 는 MS SQL, Oracle, PostgreSQL, MySQL 등 다양한 데이터베이스를 지원하며 이들 데이터베이스에 대해 단일 API 를 사용하여 액세스가 가능합니다. 단일 API 를 사용하면 데이터베이스 액세스 코드에 대한 이식성이 높아진다는 장점이 있습니다.

다양한 DB 에 대한 단일 API 는 FoxDbAccessFoxDbParameterCollection 추상 클래스(abstract class)를 통해 접근이 가능하며, DI (Dependency Injection) 방식을 사용하여 접근하고자 하는 데이터베이스를 명시할 수 있습니다. 접근하고자 하는 구체적인 DB 설정은 Fox Configuration 기능의 구성 설정 파일을 사용합니다.

  1. 데이터베이스 연결 문자열 등을 위해 NeoDEEX 구성 설정 파일을 추가 합니다. 프로젝트 아이템 추가 메뉴를 선택하고 JSON 파일 템플릿에서 파일 이름을 neodeex.config.json 로 지정합니다.

    Warning

    NeoDEEX 구성 파일 이름은 명시적으로 바꾸지 않는 한 neodeex.config.json 이므로 파일 이름 지정에 주의해야 합니다.

    솔루션 탐색기에서 추가된 neodeex.config.json 파일을 선택하고 설정창(properties)에서 Copy to Output Directory 속성의 값이 Copy if newer 임을 확인하십시요.

    Set Copy if Newer

  2. neodeex.config.json 파일의 내용은 다음과 같이 지정합니다.

    {
        "$schema": "https://neodeex.github.io/doc/neodeex.config.schema.json",
        "database": {
            "connectionStrings": {
                "Northwind": {
                    "type": "NeoDEEX.Data.NpgsqlClient.FoxNpgsqlDbAccess",
                    "connectionString": "Server=your_server;Database=your_db;User Id=your_uid;Password=your_pwd;",
                }
            }
        }
    }
    

    Information

    NeoDEEX 구성 파일에 $schema 속성을 명시하여 JSON 스키마를 지정하면 Visual Studio 의 자동 완성 기능을 사용하여 보다 편리하게 설정을 작성할 수 있습니다.

    구성 설정에서 database 섹션은 Fox DB Access 와 관련된 여러가지 설정을 지정할 수 있습니다. connecionStrings 속성은 앱에서 사용할 FoxDbAccess 의 구체 클래스 타입과 연결 문자열을 지정합니다.

  3. 이제 코드에서 직접 FoxNpgsqlDbAccess 인스턴스를 생성하는 대신 FoxDbAccess.CreateDbAccess 메서드를 호출하여 구성 설정에 지정된 타입의 FoxDbAccess 인스턴스를 생성하도록 합니다.

    using FoxDbAccess dbAccess = FoxDbAccess.CreateDbAccess();
    Debug.Assert(dbAccess is FoxNpgsqlDbAccess);
    

    Debug.Assert 호출은 CreateDbAccess 메서드가 FoxNpgsqlDbAccess 인스턴스를 반환함을 확인해 줍니다.

  4. 매개변수 컬렉션 역시 FoxNpgsqlParameterCollection 객체를 직접 생성하는 대신 FoxDbAccess.CreateParamCollection 메서드를 호출합니다. 그리고 추상 클래스인 FoxDbParameterCollection 타입을 사용하여 쿼리에 대한 매개변수 설정을 수행합니다.

    1
    2
    3
    FoxDbParameterCollection parameters = dbAccess.CreateParamCollection();
    Debug.Assert(parameters is FoxNpgsqlParameterCollection);
    parameters.AddWithValue("product_id", DbType.Int32, 4);
    

    Debug.Assert 호출을 통해 CreateParamCollection 메서드가 반환한 타입이이 FoxNpgsqlParameerCollection 타입임을 확인할 수 있습니다.

    Warning

    위 코드에서 AddWithValue 메서드를 호출할 때 사용한 DB 타입이 NpgsqlType 이 아니라 DbType 임에 주의 하십시요. FoxDbParameterCollection 타입은 DB 에 독립적인 타입이므로 PostgreSQL 에서만 사용할 수 있는 NpgsqlType 을 사용할 수 없습니다.

    나머지 코드는 ExecuteSqlDataSet 메서드를 호출하여 쿼리를 수행하고 그 결과를 표시하는 코드로서 동일합니다. 단일 API 를 사용하는 전체 코드는 다음과 같습니다.

    string query = "SELECT * FROM products WHERE product_id < :product_id";
    using FoxDbAccess dbAccess = FoxDbAccess.CreateDbAccess();
    FoxDbParameterCollection parameters = dbAccess.CreateParamCollection();
    
    parameters.AddWithValue("product_id", DbType.Int32, 4);
    DataSet ds = dbAccess.ExecuteSqlDataSet(query, parameters);
    foreach (DataRow row in ds.Tables[0].Rows)
    {
        Console.WriteLine($"product_id: {row["product_id"]}, product_name: {row["product_name"]}");
    }
    

Changing DB

만약 DB 가 PostgreSQL 에서 Oracle 로 변경되었다고 가정해 봅시다. FoxNpgsqlDbAccessFoxNpgsqlParameterCollection 과 같은 구체 클래스를 사용했다면 앱의 모든 코드에서 이들 클래스를 찾고 FoxOracleDbAccess, FoxOracleParameterCollection 클래스로 변경해야 합니다. 하지만 위 예제처럼 단일 API 로 작성한 코드는 DB 중립적인 추상 클래스인 FoxDbAccess, FoxDbParameterCollection 타입을 사용하므로 코드 변경이 필요 없습니다.

  1. Oracle 데이터베이스에 접근하기 위해 프로젝트에서 NuGet 관리자를 선택하여 NeoDEEX.Data.OracleClient 패키지를 참조 합니다.

    Oracle 패키지 추가

  2. neodeex.config.json 파일을 열고 Oracle 에 접근가능 하도록 설정을 변경합니다.

    • type 속성: NeoDEEX.Data.OracleClient.FoxOracleDbAccess
    • connectionString 속성: Oracle 접속 용 연결 문자열
    {
        "$schema": "https://neodeex.github.io/doc/neodeex.config.schema.json",
        "database": {
            "connectionStrings": {
                "Northwind": {
                    "type": "NeoDEEX.Data.OracleClient.FoxOracleDbAccess",
                    "connectionString": "Data Source=your_server;User Id=your_id;Password=your_pwd;"
                }
            }
        }
    }
    

    Warning

    neodeex.config.json 구성 파일을 변경하면 코드 변경이 없더라도 프로젝트를 다시 빌드하여 변경된 구성 파일이 복사되도록 해야 합니다.

  3. 앱을 구동하여 정상작동 되는지 확인합니다.

    Information

    이 예제에서처럼 구성 설정만을 변경하여 다른 데이터베이스를 액세스 하기 위한 조건은 사용된 쿼리와 스키마가 두 데이터베이스에 동일하게 적용이 될 수 있을 때만 가능합니다. 예를 들어 사용된 쿼리가 특정 데이터베이스에서만 사용가능한 구문, 함수 등을 사용한다면 단순히 구성 설정만을 변경한다고 코드가 작동하지 않습니다.

Fox Query

지금까지의 예제에서 사용된 쿼리는 코드내에 SQL 문장을 하드 코드 했었습니다. 이처럼 SQL 문장이 코드 내에 포함되면 쿼리가 변경될 때마다 코드 빌드와 배포의 과정을 거쳐야 합니다. 하드 코드된 SQL 문장을 외부 파일로 분리할 수 있도록 해주는 Fox DB Accees 의 기능이 Fox Query 입니다. 이 예제는 Fox Query 를 적용하여 기존 코드를 수정하는 방법에 대해 간략히 살펴보겠습니다.

  1. neodeex.config.json 을 다시 수정하여 PostgreSQL 데이터베이스 액세스로 원상 복구 합니다.

  2. 프로젝트에 foxml 폴더를 추가합니다.

    Add foxml folder

  3. 생성한 foxml 폴더에 XML 파일 템플릿을 사용하여 northwind.foxml 파일을 추가 합니다.

    Add foxml file

    추가한 northwind.foxml 파일이 빌드 결과로 복사되도록 속성 창에서 복사 설정을 수행합니다.

    Copy if newer 설정

  4. northwind.foxml 파일을 열고 다음과 같이 쿼리를 작성합니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <queryMap xmlns="http://schema.neodeex.net/fx/foxml/2023/04/">
        <statements>
            <statement id="get_product">
            <text>
                <![CDATA[
                SELECT * FROM products WHERE product_id < #product_id#
                ]]>
            </text>
            <parameters>
                <parameter name="product_id" dbType="Integer"/>
            </parameters>
            </statement>
        </statements>    
    </queryMap>
    
    • Fox Query 를 위한 XML 파일(.foxml 파일)의 스키마는 http://schema.neodeex.net/fx/foxml/2023/04/ 을 사용해야 합니다. 스키마가 명시되지 않거나 다른 스키마를 사용하면 오류가 발생됩니다.

    • 하나의 .foxml 파일에는 여러 SQL 문장들 혹은 저장 프로시저들이 존재할 수 있습니다. 이들은 <statement> 태그 혹은 <procedure> 태그로 <statements> 태그 밑에 나열되며 id 속성(attribute)으로 구분됩니다. 이 아이디는 코드에서 사용할 SQL 문장을 지정하는데 사용됩니다.

    • .foxml 파일에 기록된 SQL 문장들은 단순한 SQL 텍스트 뿐만아니라 쿼리에서 사용되는 매개변수들을 포함합니다. <parameters> 컬렉션 내부의 <parameter> 요소를 사용하여 쿼리에서 사용하는 매개변수 정보를 기록할 수 있습니다. SQL 텍스트에서 사용된 매개변수는 # 문자로 둘러싸여 있으며 이 매개변수에 대한 정보는 <parameter> 요소에 기록하게 됩니다. 위 예제에서 #product_id# 매개변수의 DB 타입으로 Integer 가 지정되었습니다. 즉, 쿼리를 수행할 때 매개변수의 DB 타입으로 NpgsqlDbType.Integer 가 적용됩니다.

  5. 작성한 northwind.foxml 파일을 사용하는 코드는 다음과 같습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    using FoxDbAccess dbAccess = FoxDbAccess.CreateDbAccess();
    Dictionary<string, object> parameters = new() {
        { "product_id", 5 }
    };
    DataSet ds = dbAccess.ExecuteQueryDataSet("northwind:get_product", parameters);
    foreach (DataRow row in ds.Tables[0].Rows)
    {
        Console.WriteLine($"product_id: {row["product_id"]}, product_name: {row["product_name"]}");
    }
    

    Fox Query를 사용하기 위해서는 ExecuteQueryDataSet 메서드를 호출하면 됩니다. 이 메서드의 첫번째 매개변수로 주어지는 쿼리 아이디는 .foxml 파일의 확장자를 제외한 이름과 .foxml 파일 내의 SQL 문장 아이디 조합입니다. 이 예제에서 사용된 northwind:get_product 아이디가 주어지면 Fox Query 엔진은 northwind.foxml 파일을 찾고 그 파일 내에서 get_product 라는 아이디를 가진 쿼리의 SQL 텍스트와 매개변수 정보를 로드하고 수행합니다.

    Fox Query에서 정의한 매개변수 값을 전달하기 위해 Dictionary<string, object> 객체를 생성하고 <parameter> 태그의 name 속성이 지정하는 이름의 매개변수 값을 지정해야 합니다. 그리고 이 매개변수 컬렉션을 ExecuteQueryDataSet 메서드 호출에 사용합니다.

    Note

    Fox Query에서 정의한 매개변수들의 값을 지정하기 위해 DataRow, IDictionary<string, object> 객체, POCO(Plain Old C# Object)를 사용할 수 있습니다. 이 예제는 Dictionary<string, object> 객체를 사용하였습니다만 다음과 같이 익명 타입의 POCO를 사용할 수도 있습니다.

    var parameters = new { product_id = 5 };
    

Fox DB Profile

Fox DB Access 는 FoxNpgsqlDbAccess, FoxOracleDbAccess 등과 같은 FoxDbAccess 타입 및 파생 클래스스릍 통해 수행되는 모든 쿼리들에 대한 정보를 수집하는 기능을 제공합니다. 이러한 쿼리 로깅 기능을 Fox DB Profile 이라 부릅니다.

Fox DB Profile 은 수행되는 쿼리의 다양한 정보를 수집합니다. SQL 텍스트, 매개변수 값, 쿼리 수행 시간, 쿼리 결과, 예외 정보 등이 수집되며 Fox Logging 을 통해 로그 기록이 가능합니다.

  1. Fox DB Profile 이 수집한 쿼리 정보를 기록하기 위한 설정을 neodeex.config.json 파일에 다음과 같이 추가 합니다.

    {
      "$schema": "https://neodeex.github.io/doc/neodeex.config.schema.json",
      "database": {
        "connectionStrings": {
          "PostgreSQL": {
            "type": "NeoDEEX.Data.NpgsqlClient.FoxNpgsqlDbAccess",
            "connectionString": "Server=test-prostgresql.postgres.database.azure.com;Database=testdb;Port=5432;User Id=tester;  Password=test;Ssl Mode=Require;",
            "dbProfile": {
              "enable": true,
              "loggerName": "db_profile",
              "diagnostics": true
            }
          }
        }
      },
      "logging": {
        "loggers": {
          "db_profile": {
            "providerType": "NeoDEEX.Diagnostics.Loggers.FoxConsoleLoggerProvider",
            "filter": "Verbose"
          }
        }
      }
    }
    

    기존 연결 문자열에 추가된 dbProfile 속성은 Fox DB Profile 에 관련된 설정입니다. enable 속성은 Fox DB Profile 기능의 활성화 여부를 나타내며 loggerName 속성은 DbProfile 정보를 기록할 로거의 이름입니다. 마지막으로 diagnostics 속성은 Fox DB Profile 기능의 자체 진단을 위한 속성으로서 여기서는 활성화 하도록 합니다.

    Note

    Fox DB Profile 은 거의 모든 쿼리에 대해 상당한 양의 데이터를 로그에 기록하므로 데이터 액세스 성능을 저하시킬 수도 있습니다. 이를 막기 위해 Fox DB Access 는 DbProfile 정보를 비동기적으로 로그에 기록하여 성능에 영향을 주지않도록 설계되어 있습니다. 비동기적으로 로그가 기록되기 때문에 로그 기록 도중 발생하는 오류들은 무시됩니다.

    따라서 DB Profile 설정을 했음에도 불구하고 로그가 기록되지 않는 상황에서는 어떠한 로깅 오류가 있는지 파악하기 어렵습니다. 이를 위해 diagnostics 속성을 제공하며 이 속성이 true 인 경우 로그 기록은 동기적으로 수행되며 발생되는 오류는 곧바로 throw 되게 됩니다.

    또한, 이 예제와 같이 간단한 콘솔 앱은 DbProfile 정보가 비동기적으로 로그에 기록하기 전에 앱이 종료될 수 있습니다. 이러한 상황에서도 diagnostics 속성을 true 로 지정하여 동기적으로 로그를 기록하면 앱 종료전에 로그를 기록하도록 할 수 있습니다.

    간단한 예제를 작성하거나 개발 시에는 diagnostics 속성을 true 로 지정하고 운영 시에는 이 속성을 삭제하거나 false 로 지정해야 합니다.

    logging 섹션은 로거를 설정하는 부분으로 콘솔에 로그를 기록하는 db_profile 이라는 이름의 로거(logger)를 구성하고 있습니다. 연결 문자열의 dbProfile 속성의 loggerName 속성에서 이 로거를 참조하도록 동일한 로거 이름을 사용하고 있습니다.

    로깅에 관련된 상세한 내용은 Fox Logging 문서를 참조하십시요.

  2. 변경된 구성 파일을 저장하고 프로젝트를 빌드하고 수행하면 다음과 유사한 결과가 콘솔에 출력될 것입니다.

    I 2025-02-07 00:35:03.18745 [db_profile]
    USER_ID              :
    Id                   :   DB-{92B72428-B338-4745-9BD7-883FE1615A71}
    FOXQUERY_ID          :   northwind:get_product
    FOXQUERY_FILENAME    :   D:\Work\....\Foxml\northwind.foxml
    CALLER               :
    EXECUTION_TIME       :   188.22 msec
    RESULT               :   4 (DataSet rows)
    EXECUTION_TYPE       :   ExecuteDataSet
    QUERY                :
    SELECT * FROM products WHERE product_id < :product_id
    PARAMETERS           :
    product_id=5
    INLINE_QUERY         :
    SELECT * FROM products WHERE product_id < 5
    
    product_id: 1, product_name: Chai
    product_id: 2, product_name: Chang
    product_id: 3, product_name: Aniseed Syrup
    product_id: 4, product_name: Chef Anton's Cajun Seasoning
    

    Fox DB Profile 이 제공하는 쿼리 정보에는 .foxml 파일에 기록된 SQL 텍스트를 물론이며 매개변수 값들(PARAMETERS), 그리고 매개변수 값이 적용된 SQL 택스트(INLINE_QUERY)를 비롯하여 쿼리 수행 시간(EXEUCTE_TIME), 쿼리 수행결과(4개의 row를 가진 DataSet)에 대한 정보를 제공합니다. 그리고 Fox Query를 통해 수행된 쿼리의 경우 쿼리 ID 와 .foxml 파일 경로 정보도 포함합니다.

    이 예제에서는 단순히 DbProfile 정보를 콘솔에 출력하였지만 실제 앱 환경에서는 텍스트 파일이나 데이터베이스에 로그를 저장하여 성능이 느린 쿼리가 어떤 쿼리이며 어떤 매개변수 값이 사용되었을 때 성능이 저하되는지 분석할 수도 있습니다. DbProfile 로그를 파일이나 데이터베이스에 기록하기 위해서는 간단히 로거 설정을 변경하거나 간단한 코드를 작성하여 DbProfile 전용 로거를 작성할 수도 있습니다.

What else?

Fox DB Access 는 여기에서 다루었던 예제들 보다 많은 기능들을 가지고 있습니다. 데이터베이스 연결 관리, 트랜잭션 제어, Command 객체 생성 등의 기능들은 개별 문서 항목에서 상세한 설명과 예제를 제공할 것입니다.

Fox DB Access 는 Fox Transaction 과 함께 사용될 때 강력한 시너지를 냅니다. Fox Transaction 에서 제공하는 FoxDacBase 클래스는 FoxDbAccess 클래스를 활용하여 강력한 트랜잭션 처리 환경과 더불어 편리하고 안정적인 개발 환경을 제공할 수 있습니다. 예를 들어 FoxDacBase 클래스는 메서드 호출전에 자동으로 FoxDbAccess 인스턴스를 생성하며 메서드 종료이후 예외 발생 여부에 관계없이 FoxDbAccess 객체를 정리하여 데이터베이스 연결이 닫아 줍니다. 다음 Fox Transaction 예제 코드는 자동으로 생성된 FoxDbAccess 인스턴스를 제공하는 DbAccess 속성을 통해 데이터베이스에 접근하는 예를 보여줍니다.

public class DacComp : FoxDacBase, IDacComp
{
    public void InsertData(int id)
    {
        string query = "INSERT INTO TxTestTable(PK, COL1, COL2) VALUES(@id, 1, 'A')";
        FoxDbParameterCollection parameters = this.DbAccess.CreateParamCollection();
        parameters.AddWithValue("id", id);
        this.DbAccess.ExecuteSqlNonQuery(query, parameters);
    }
}

Fox Transaction 에서 데이터베이스를 액세스하는 상세한 내용은 해당 문서를 참고 하십시요.