:meta-keywords: ADO.NET driver, adonet driver, cubrid ADO.NET :meta-description: How to install, configure and user CUBRID ADO.NET driver. **************** ADO.NET 드ë¼ì´ë²„ **************** ADO.NETì€ .NET 개발ìžì—게 ë°ì´í„° 액세스 서비스를 ì œê³µí•˜ëŠ” í´ëž˜ìФ ì§‘í•©ì´ë‹¤. ADO.NETì€ ë¶„ì‚°ëœ ë°ì´í„°ë¥¼ ë¶„ì‚°ëœ ë°ì´í„° ê³µìœ ì‘ìš© í”„ë¡œê·¸ëž¨ì„ ê°œë°œí• ë•Œ ì‚¬ìš©í• ìˆ˜ 있는 다양한 구성 요소를 ì œê³µí•œë‹¤. ë˜í•œ 관계형, XML ë° ì‘ìš© 프로그램 ë°ì´í„°ì— 대한 액세스를 ì œê³µí•˜ëŠ” .NET Frameworkì˜ í•µì‹¬ 부분ì´ë‹¤. ADO.NETì€ ì‘ìš© 프로그램, ë„구, 언어 ë˜ëŠ” 웹 브ë¼ìš°ì €ì—서 사용ë˜ëŠ” 중간 계층 비즈니스 개체 ë° í”„ëŸ°íŠ¸ 엔드 ë°ì´í„°ë² ì´ìФ í´ë¼ì´ì–¸íЏ ê°œë°œì„ ë¹„ë¡¯í•˜ì—¬ 다양한 개발 요구 사í•ì„ ì§€ì›í•œë‹¤. .. FIXME: 별ë„로 ADO.NET 드ë¼ì´ë²„를 다운로드하거나 ADO.NET 드ë¼ì´ë²„ì— ëŒ€í•œ ìµœì‹ ì •ë³´ë¥¼ 확ì¸í•˜ë ¤ë©´ http://www.cubrid.org/wiki_apis/entry/cubrid-ado-net-driver\ì— ì ‘ì†í•œë‹¤. ADO.NET 설치 ë° ì„¤ì • ==================== **기본 환경** * Windows(Windows Vista ë˜ëŠ” Windows 7 권장) * .NET í”„ë ˆìž„ì›Œí¬ 2.0 ì´ìƒ(4.0 ì´ìƒ 권장): * Microsoft Visual Studio Express edition( https://visualstudio.microsoft.com/ ) **설치 ë° ì„¤ì •** CUBRID를 사용하는 .NET ì‘ìš© í”„ë¡œê·¸ëž¨ì„ ê°œë°œí•˜ë ¤ë©´ CUBRID ADO.NET Data Provider(Cubrid.Data.dll)ê°€ 필요하다. CUBRID ADO.NET Data Provider를 ì„¤ì¹˜í•˜ë ¤ë©´ ë‹¤ìŒ ì¤‘ 하나를 수행한다. * CUBRID ADO.NET Data Provider Installer를 ë‹¤ìŒ ì£¼ì†Œì—서 다운로드하여 실행한다. https://www.cubrid.org/downloads#adonet * 소스코드ì—서 ì§ì ‘ 빌드한다. 소스코드는 GitHubì—서 다운 ë°›ì„ ìˆ˜ 있습니다. :: https://github.com/CUBRID/cubrid-adonet CUBRID .NET Data Provider는 full-managed .NET 코드로 작성ë˜ì–´ CUBRID ë¼ì´ë¸ŒëŸ¬ë¦¬ 파ì¼ì— ì˜ì¡´í•˜ì§€ 않는다. ë”°ë¼ì„œ CUBRID를 설치하거나 CUBRID 파ì¼ì„ 다운로드하지 ì•Šì•„ë„ CUBRID .NET Data Provider를 ì‚¬ìš©í• ìˆ˜ 있다. CUBRID ADO.NET Data Provider를 가장 간단하게 설치하는 ë°©ë²•ì€ CUBRID ADO.NET Data Provider Installer를 실행하는 것ì´ë‹¤. 기본 ì„¤ì •(x86)으로 설치하면 **Program Files\\CUBRID\\CUBRID ADO.NET Data Provider 8.4.1** ë””ë ‰í„°ë¦¬ì— ì„¤ì¹˜ëœë‹¤. 드ë¼ì´ë²„를 GAC( https://en.wikipedia.org/wiki/Global_Assembly_Cache )ì— ì„¤ì¹˜í• ìˆ˜ë„ ìžˆë‹¤. 드ë¼ì´ë²„를 GACì— ì„¤ì¹˜í•˜ëŠ” 가장 ì¢‹ì€ ë°©ë²•ì€ tlbimp( `https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-2.0/tt0cf3sx(v=vs.80) <https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-2.0/tt0cf3sx(v=vs.80)>`_ )를 사용하는 것ì´ë‹¤. 필요한 네임스페ì´ìŠ¤ëŠ” 다ìŒê³¼ ê°™ì´ import한다. .. image:: /images/image88.png ADO.NET í”„ë¡œê·¸ëž˜ë° ================== CUBRID ADO.NET API 문서는 http://ftp.cubrid.org/CUBRID_Docs/Drivers/ADO.NET/\를 ì°¸ê³ í•œë‹¤. 단순 질ì˜/조회 -------------- CUBRID ë°ì´í„°ë² ì´ìŠ¤ì˜ í…Œì´ë¸”ì—서 ê°’ì„ ì¡°íšŒí•˜ëŠ” 간단한 코드를 살펴보ìž. ì—°ê²°ì€ ì´ë¯¸ ìƒì„±ë˜ì—ˆë‹¤ê³ ê°€ì •í•œë‹¤. .. code-block:: c# String sql = "select * from nation order by `code` asc"; using (CUBRIDCommand cmd = new CUBRIDCommand(sql, conn)) { using (DbDataReader reader = cmd.ExecuteReader()) { reader.Read(); //(read the values using: reader.Get...() methods) } } 위와 ê°™ì´ `DbDataReader <https://docs.microsoft.com/en-us/dotnet/api/system.data.common.dbdatareader?view=netcore-3.1>`_ ê°ì²´ë¥¼ ìƒì„±í•œ 후ì—는 Get...() 메서드를 사용하여 칼럼 ë°ì´í„°ë¥¼ ì¡°íšŒí• ìˆ˜ 있다. CUBRID ADO.NET 드ë¼ì´ë²„는 다ìŒê³¼ ê°™ì´ CUBRIDì˜ ëª¨ë“ ë°ì´í„° íƒ€ìž…ì„ ì½ëŠ” ë° í•„ìš”í•œ ëª¨ë“ ë©”ì„œë“œë¥¼ ì œê³µí•œë‹¤. .. code-block:: c# reader.GetString(3) reader.GetDecimal(1) Get...() ë©”ì„œë“œì˜ íŒŒë¼ë¯¸í„°ë¡œ 0부터 시작하는 숫ìžë¥¼ ìž…ë ¥í•˜ì—¬ 칼럼ì—서 ì¡°íšŒí• ì¹¼ëŸ¼ ë°ì´í„°ì˜ ì¸ë±ìФ 위치를 ì§€ì •í•œë‹¤. íŠ¹ì • CUBRID ë°ì´í„° íƒ€ìž…ì˜ ë°ì´í„°ë¥¼ ì¡°íšŒí•˜ë ¤ë©´ `DbDataReader <https://docs.microsoft.com/en-us/dotnet/api/system.data.common.dbdatareader?view=netcore-3.1>`_ ì¸í„°íŽ˜ì´ìФ ëŒ€ì‹ ë‹¤ìŒê³¼ ê°™ì´ CUBRIDDataReader를 사용해야 한다. .. code-block:: c# using (CUBRIDCommand cmd = new CUBRIDCommand("select * from t", conn)) { CUBRIDDataReader reader = (CUBRIDDataReader)cmd.ExecuteReader(); reader.Read(); Debug.Assert(reader.GetDateTime(0) == newDateTime(2008, 10, 31, 10, 20, 30, 040)); Debug.Assert(reader.GetDate(0) == "2008-10-31"); Debug.Assert(reader.GetDate(0, "yy/MM/dd") == "08-10-31"); Debug.Assert(reader.GetTime(0) == "10:20:30"); Debug.Assert(reader.GetTime(0, "HH") == "10"); Debug.Assert(reader.GetTimestamp(0) == "2008-10-31 10:20:30.040"); Debug.Assert(reader.GetTimestamp(0, "yyyy HH") == "2008 10"); } batch ëª…ë ¹ì–´ ------------ CUBRID ADO.NET Data Provider를 사용하면 í•˜ë‚˜ì˜ batchì—서 ë°ì´í„° ì„œë¹„ìŠ¤ì— í•˜ë‚˜ ì´ìƒì˜ 질ì˜ë¥¼ ì‹¤í–‰í• ìˆ˜ 있다. batchì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ `https://docs.microsoft.com/en-us/previous-versions/dd744839(v=vs.90) <https://docs.microsoft.com/en-us/previous-versions/dd744839(v=vs.90)>`_\를 ì°¸ê³ í•œë‹¤. 예를 들면 다ìŒê³¼ ê°™ì€ ì½”ë“œë¥¼ ìž‘ì„±í• ìˆ˜ 있다. .. code-block:: c# string[] sql_arr = newstring3; sql_arr0 = "insert into t values(1)"; sql_arr1 = "insert into t values(2)"; sql_arr2 = "insert into t values(3)"; conn.BatchExecute(sql_arr); 위 코드는 다ìŒê³¼ ê°™ì´ ìž‘ì„±í• ìˆ˜ë„ ìžˆë‹¤. .. code-block:: c# string[] sqls = newstring3; sqls0 = "create table t(id int)"; sqls1 = "insert into t values(1)"; sqls2 = "insert into t values(2)"; conn.BatchExecuteNoQuery(sqls); ì—°ê²° 문ìžì—´ ----------- .NET ì‘ìš© 프로그램ì—서 CUBRID ì—°ê²°ì„ ìƒì„±í•˜ë ¤ë©´ 다ìŒê³¼ ê°™ì€ í˜•ì‹ì˜ ì—°ê²° 문ìžì—´ì„ ìƒì„±í•´ì•¼ 한다. :: ConnectionString = "server=<server address>;database=<database name>;port=<port number to use for connection to broker>;user=<user name>;password=<user password>;" **port**\ 를 ì œì™¸í•œ ëª¨ë“ íŒŒë¼ë¯¸í„°ëŠ” 반드시 ê°’ì„ ìž…ë ¥í•´ì•¼ 한다. **port** ê°’ì„ ìž…ë ¥í•˜ì§€ ì•Šì•˜ì„ ë•Œì˜ ê¸°ë³¸ê°’ì€ **30000** ì´ë‹¤. ì—°ê²° ì˜µì…˜ì— ë”°ë¥¸ ì—°ê²° 문ìžì—´ì˜ 예는 다ìŒê³¼ 같다. * 로컬 ì„œë²„ì˜ *demodb* ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•˜ëŠ” ì—°ê²° 문ìžì—´ì€ 다ìŒê³¼ 같다. :: ConnectionString = "server=127.0.0.1;database=demodb;port=30000;user=public;password=" * ì›ê²© ì„œë²„ì˜ *demodb* ë°ì´í„°ë² ì´ìŠ¤ì— **dba** 사용ìžë¡œ 연결하는 문ìžì—´ì€ 다ìŒê³¼ 같다. :: ConnectionString = "server=10.50.88.1;database=demodb;user=dba;password=" * ì›ê²© ì„œë²„ì˜ *demodb* ë°ì´í„°ë² ì´ìŠ¤ì— **dba** 사용ìž, 비밀번호는 *secret* 으로 연결하는 문ìžì—´ì€ 다ìŒê³¼ 같다. :: ConnectionString = "server=10.50.99.1;database=demodb;port=30000;user=dba;password=secret" ì—°ê²° 문ìžì—´ì€ CUBRIDConnectionStringBuilder í´ëž˜ìŠ¤ë¥¼ 사용하여 다ìŒê³¼ ê°™ì´ ìƒì„±í• ìˆ˜ë„ ìžˆë‹¤. .. code-block:: c# CUBRIDConnectionStringBuilder sb = new CUBRIDConnectionStringBuilder(localhost,"33000","demodb","public",""); using (CUBRIDConnection conn = new CUBRIDConnection(sb.GetConnectionString())) { conn.Open(); } 위 코드와 ê°™ì€ ë™ìž‘ì„ ìˆ˜í–‰í•˜ëŠ” 코드를 다ìŒê³¼ ê°™ì´ ìž‘ì„±í• ìˆ˜ë„ ìžˆë‹¤. .. code-block:: c# sb = new CUBRIDConnectionStringBuilder(); sb.User = "public" ; sb.Database = "demodb"; sb.Port = "33000"; sb.Server = "localhost"; using (CUBRIDConnection conn = new CUBRIDConnection(sb.GetConnectionString())) { conn.Open(); } .. note:: ìŠ¤ë ˆë“œ 기반 프로그램ì—서 ë°ì´í„°ë² ì´ìФ ì—°ê²°ì€ ê° ìŠ¤ë ˆë“œë§ˆë‹¤ ë…립ì 으로 사용해야 한다. CUBRID ì»¬ë ‰ì…˜ ------------- ì»¬ë ‰ì…˜ì€ CUBRIDì—서 사용하는 ë°ì´í„° 타입ì´ë‹¤. ì»¬ë ‰ì…˜ íƒ€ìž…ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ :ref:`collection-data-type` ì„ ì°¸ê³ í•œë‹¤. ì»¬ë ‰ì…˜ íƒ€ìž…ì€ ë‹¤ë¥¸ ë°ì´í„°ë² ì´ìФì—서 í”히 사용하지 않으므로, ì´ íƒ€ìž…ì„ ì‚¬ìš©í•˜ë ¤ë©´ 다ìŒê³¼ ê°™ì€ CUBRID ì»¬ë ‰ì…˜ 메서드를 사용해야 한다. .. code-block:: c# public void AddElementToSet(CUBRIDOid oid, String attributeName, Object value) public void DropElementInSet(CUBRIDOid oid, String attributeName, Object value) public void UpdateElementInSequence(CUBRIDOid oid, String attributeName, int index, Object value) public void InsertElementInSequence(CUBRIDOid oid, String attributeName, int index, Object value) public void DropElementInSequence(CUBRIDOid oid, String attributeName, int index) public int GetCollectionSize(CUBRIDOid oid, String attributeName) 다ìŒì€ ì»¬ë ‰ì…˜ 타입ì—서 ê°’ì„ ì½ëŠ” ì½”ë“œì˜ ì˜ˆì´ë‹¤. .. code-block:: c# using (CUBRIDCommand cmd = new CUBRIDCommand("SELECT * FROM t", conn)) { using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { object[] o = (object[])reader0; for (int i = 0; i <SeqSize; i++) { //... } } } } 다ìŒì€ ì»¬ë ‰ì…˜ íƒ€ìž…ì„ ê°±ì‹ í•˜ëŠ” ì½”ë“œì˜ ì˜ˆì´ë‹¤. .. code-block:: c# conn.InsertElementInSequence(oid, attributeName, 5, value); SeqSize = conn.GetCollectionSize(oid, attributeName); using (CUBRIDCommand cmd = new CUBRIDCommand("SELECT * FROM t", conn)) { using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { int[] expected = { 7, 1, 2, 3, 7, 4, 5, 6 }; object[] o = (object[])reader0; } } } conn.DropElementInSequence(oid, attributeName, 5); SeqSize = conn.GetCollectionSize(oid, attributeName); BLOB/CLOB 사용 -------------- CUBRID 2008 R4.0(8.4.0) ì´ìƒ ë²„ì „ì—서는 GLO ë°ì´í„° íƒ€ìž…ì„ ë” ì´ìƒ 사용하지 ì•Šê³ BLOB, CLOB와 ê°™ì€ LOB ë°ì´í„° íƒ€ìž…ì„ ì‚¬ìš©í•œë‹¤. ì´ ë°ì´í„° íƒ€ìž…ì€ ë‹¤ë¥¸ ë°ì´í„°ë² ì´ìФì—서 í”히 사용하지 않으므로, ì´ íƒ€ìž…ì„ ì‚¬ìš©í•˜ë ¤ë©´ CUBRID ADO.NET Data Providerê°€ ì œê³µí•˜ëŠ” 메서드를 사용해야 한다. 다ìŒì€ BLOB ë°ì´í„°ë¥¼ ì½ëŠ” ì½”ë“œì˜ ì˜ˆì´ë‹¤. .. code-block:: c# CUBRIDCommand cmd = new CUBRIDCommand(sql, conn); DbDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { CUBRIDBlob bImage = (CUBRIDBlob)reader0; byte[] bytes = newbyte(int)bImage.BlobLength; bytes = bImage.getBytes(1, (int)bImage.BlobLength); //... } 다ìŒì€ CLOB ë°ì´í„°ë¥¼ ê°±ì‹ í•˜ëŠ” ì½”ë“œì˜ ì˜ˆì´ë‹¤. .. code-block:: c# string sql = "UPDATE t SET c = ?"; CUBRIDCommand cmd = new CUBRIDCommand(sql, conn); CUBRIDClobClob = new CUBRIDClob(conn); str = conn.ConnectionString; //Use the ConnectionString for testing Clob.setString(1, str); CUBRIDParameter param = new CUBRIDParameter(); param.ParameterName = "?"; param.CUBRIDDataType = CUBRIDDataType.CCI_U_TYPE_CLOB; param.Value = Clob; cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); CUBRID 메타ë°ì´í„° ì§€ì› ---------------------- CUBRID ADO.NET Data Provider는 ë°ì´í„°ë² ì´ìФ 메타ë°ì´í„°ë¥¼ ì§€ì›í•˜ëŠ” 메서드를 ì œê³µí•œë‹¤. 메타ë°ì´í„°ë¥¼ ì§€ì›í•˜ëŠ” 메서드는 CUBRIDSchemaProvider í´ëž˜ìŠ¤ì— êµ¬í˜„ë˜ì–´ 있다. .. code-block:: c# public DataTable GetDatabases(string[] filters) public DataTable GetTables(string[] filters) public DataTable GetViews(string[] filters) public DataTable GetColumns(string[] filters) public DataTable GetIndexes(string[] filters) public DataTable GetIndexColumns(string[] filters) public DataTable GetExportedKeys(string[] filters) public DataTable GetCrossReferenceKeys(string[] filters) public DataTable GetForeignKeys(string[] filters) public DataTable GetUsers(string[] filters) public DataTable GetProcedures(string[] filters) public static DataTable GetDataTypes() public static DataTable GetReservedWords() public static String[] GetNumericFunctions() public static String[] GetStringFunctions() public DataTable GetSchema(string collection, string[] filters) 다ìŒì€ ë°ì´í„°ë² ì´ìФì—서 í…Œì´ë¸”ì˜ ëª©ë¡ì„ 얻는 ì½”ë“œì˜ ì˜ˆì´ë‹¤. .. code-block:: c# CUBRIDSchemaProvider schema = new CUBRIDSchemaProvider(conn); DataTable dt = schema.GetTables(newstring[] { "%" }); Debug.Assert(dt.Columns.Count == 3); Debug.Assert(dt.Rows.Count == 10); Debug.Assert(dt.Rows00.ToString() == "demodb"); Debug.Assert(dt.Rows01.ToString() == "demodb"); Debug.Assert(dt.Rows02.ToString() == "stadium"); Get the list of Foreign Keys in a table: CUBRIDSchemaProvider schema = new CUBRIDSchemaProvider(conn); DataTable dt = schema.GetForeignKeys(newstring[] { "game" }); Debug.Assert(dt.Columns.Count == 9); Debug.Assert(dt.Rows.Count == 2); Debug.Assert(dt.Rows00.ToString() == "athlete"); Debug.Assert(dt.Rows01.ToString() == "code"); Debug.Assert(dt.Rows02.ToString() == "game"); Debug.Assert(dt.Rows03.ToString() == "athlete_code"); Debug.Assert(dt.Rows04.ToString() == "1"); Debug.Assert(dt.Rows05.ToString() == "1"); Debug.Assert(dt.Rows06.ToString() == "1"); Debug.Assert(dt.Rows07.ToString() == "fk_game_athlete_code"); Debug.Assert(dt.Rows08.ToString() == "pk_athlete_code"); 다ìŒì€ í…Œì´ë¸”ì˜ ì¸ë±ìФ 목ë¡ì„ 얻는 ì½”ë“œì˜ ì˜ˆì´ë‹¤. .. code-block:: c# CUBRIDSchemaProvider schema = new CUBRIDSchemaProvider(conn); DataTable dt = schema.GetIndexes(newstring[] { "game" }); Debug.Assert(dt.Columns.Count == 9); Debug.Assert(dt.Rows.Count == 5); Debug.Assert(dt.Rows32.ToString() == "pk_game_host_year_event_code_athlete_code"); //Index name Debug.Assert(dt.Rows34.ToString() == "True"); //Is it a PK? DataTable ì§€ì› -------------- `DataTable <https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netcore-3.1>`_ ì€ ADO.NETì—서 가장 ì¤‘ì‹¬ì´ ë˜ëŠ” ê°ì²´ë¡œ, CUBRID ADO.NET Data Provider는 다ìŒê³¼ ê°™ì€ ê¸°ëŠ¥ì„ ì§€ì›í•œë‹¤. * `DataTable <https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netcore-3.1>`_ ë°ì´í„° 채우기 * 기본 ì œê³µ ëª…ë ¹ì–´: **INSERT**, **UPDATE**, **DELETE** * 칼럼 메타ë°ì´í„°/ì†ì„± * `DataSet <https://docs.microsoft.com/en-us/dotnet/api/system.data.dataset?view=netcore-3.1>`_ , `DataView <https://docs.microsoft.com/en-us/dotnet/api/system.data.dataview?view=netcore-3.1>`_ ìƒí˜¸ ì—°ê²° 칼럼 ì†ì„±ì„ 얻는 ì½”ë“œì˜ ì˜ˆëŠ” 다ìŒê³¼ 같다. .. code-block:: c# String sql = "select * from nation"; CUBRIDDataAdapter da = new CUBRIDDataAdapter(); da.SelectCommand = new CUBRIDCommand(sql, conn); DataTable dt = newDataTable("nation"); da.FillSchema(dt, SchemaType.Source);//To retrieve all the column properties you have to use the FillSchema() method Debug.Assert(dt.Columns0.ColumnName == "code"); Debug.Assert(dt.Columns0.AllowDBNull == false); Debug.Assert(dt.Columns0.DefaultValue.ToString() == ""); Debug.Assert(dt.Columns0.Unique == true); Debug.Assert(dt.Columns0.DataType == typeof(System.String)); Debug.Assert(dt.Columns0.Ordinal == 0); Debug.Assert(dt.Columns0.Table == dt); **INSERT** 문 ì§€ì› ê¸°ëŠ¥ì„ ì´ìš©í•˜ì—¬ í…Œì´ë¸”ì— ê°’ì„ ì‚½ìž…í•˜ëŠ” ì½”ë“œì˜ ì˜ˆëŠ” 다ìŒê³¼ 같다. .. code-block:: c# String sql = " select * from nation order by `code` asc"; using (CUBRIDDataAdapter da = new CUBRIDDataAdapter(sql, conn)) { using (CUBRIDDataAdapter daCmd = new CUBRIDDataAdapter(sql, conn)) { CUBRIDCommandBuildercmdBuilder = new CUBRIDCommandBuilder(daCmd); da.InsertCommand = cmdBuilder.GetInsertCommand(); } DataTable dt = newDataTable("nation"); da.Fill(dt); DataRow newRow = dt.NewRow(); newRow"code" = "ZZZ"; newRow"name" = "ABCDEF"; newRow"capital" = "MyXYZ"; newRow"continent" = "QWERTY"; dt.Rows.Add(newRow); da.Update(dt); } 트랜ìžì…˜ -------- CUBRID ADO.NET Data Provider는 ì§ì ‘ SQL 트랜ìžì…˜(direct-SQL transaction)ê³¼ 비슷한 방법으로 트랜ìžì…˜ ì§€ì›ì„ 구현한다. 다ìŒì€ 트랜ìžì…˜ì„ 사용하는 ì½”ë“œì˜ ì˜ˆì´ë‹¤. .. code-block:: c# conn.BeginTransaction(); string sql = "create table t(idx integer)"; using (CUBRIDCommand command = new CUBRIDCommand(sql, conn)) { command.ExecuteNonQuery(); } conn.Rollback(); conn.BeginTransaction(); sql = "create table t(idx integer)"; using (CUBRIDCommand command = new CUBRIDCommand(sql, conn)) { command.ExecuteNonQuery(); } conn.Commit(); 파ë¼ë¯¸í„° 사용 ------------- CUBRIDì—서는 위치 기반 파ë¼ë¯¸í„°ë§Œ ì§€ì›í•˜ë©° ëª…ëª…ëœ íŒŒë¼ë¯¸í„°ëŠ” ì§€ì›í•˜ì§€ 않으므로, CUBRID ADO.NET Data Provider는 위치 기반 파ë¼ë¯¸í„° ì§€ì›ì„ 구현한다. 파ë¼ë¯¸í„° ì´ë¦„ì€ ìžìœ ë¡ê²Œ ì‚¬ìš©í• ìˆ˜ 있으며 파ë¼ë¯¸í„° ì´ë¦„ 앞ì—는 물ìŒí‘œ 기호를 붙여야 한다. 파ë¼ë¯¸í„°ë¥¼ ì„ ì–¸í•˜ê³ ì´ˆê¸°í™”í• ë•Œ 반드시 파ë¼ë¯¸í„°ì˜ 순서를 지켜야 한다. 다ìŒì€ 파ë¼ë¯¸í„°ë¥¼ 사용하여 SQLë¬¸ì„ ì‹¤í–‰í•˜ëŠ” ì½”ë“œì˜ ì˜ˆì´ë‹¤. ë‹¤ìŒ ì½”ë“œì—서 중요한 ê²ƒì€ **Add** () 메서드가 호출ë˜ëŠ” 순서ì´ë‹¤. .. code-block:: c# using (CUBRIDCommand cmd = new CUBRIDCommand("insert into t values(?, ?)", conn)) { CUBRIDParameter p1 = new CUBRIDParameter("?p1", CUBRIDDataType.CCI_U_TYPE_INT); p1.Value = 1; cmd.Parameters.Add(p1); CUBRIDParameter p2 = new CUBRIDParameter("?p2", CUBRIDDataType.CCI_U_TYPE_STRING); p2.Value = "abc"; cmd.Parameters.Add(p2); cmd.ExecuteNonQuery(); } 오류 코드 ë° ë©”ì‹œì§€ ------------------- 다ìŒì€ CUBRID ADO.NET Data Provider를 사용하면서 오류가 ë°œìƒí• 때 나타나는 오류ì´ë‹¤. +----------------+------------------------+-----------------------------------------------------------------------+ | 오류 코드 번호 | 오류 코드 | 오류 메시지 | +================+========================+=======================================================================+ | 0 | ER_NO_ERROR | "No Error" | +----------------+------------------------+-----------------------------------------------------------------------+ | 1 | ER_NOT_OBJECT | "Index's Column is Not Object" | +----------------+------------------------+-----------------------------------------------------------------------+ | 2 | ER_DBMS | "Server error" | +----------------+------------------------+-----------------------------------------------------------------------+ | 3 | ER_COMMUNICATION | "Cannot communicate with the broker" | +----------------+------------------------+-----------------------------------------------------------------------+ | 4 | ER_NO_MORE_DATA | "Invalid dataReader position" | +----------------+------------------------+-----------------------------------------------------------------------+ | 5 | ER_TYPE_CONVERSION | "DataType conversion error" | +----------------+------------------------+-----------------------------------------------------------------------+ | 6 | ER_BIND_INDEX | "Missing or invalid position of the bind variable provided" | +----------------+------------------------+-----------------------------------------------------------------------+ | 7 | ER_NOT_BIND | "Attempt to execute the query when not all the parameters are binded" | +----------------+------------------------+-----------------------------------------------------------------------+ | 8 | ER_WAS_NULL | "Internal Error: NULL value" | +----------------+------------------------+-----------------------------------------------------------------------+ | 9 | ER_COLUMN_INDEX | "Column index is out of range" | +----------------+------------------------+-----------------------------------------------------------------------+ | 10 | ER_TRUNCATE | "Data is truncated because receive buffer is too small" | +----------------+------------------------+-----------------------------------------------------------------------+ | 11 | ER_SCHEMA_TYPE | "Internal error: Illegal schema paramCUBRIDDataType" | +----------------+------------------------+-----------------------------------------------------------------------+ | 12 | ER_FILE | "File access failed" | +----------------+------------------------+-----------------------------------------------------------------------+ | 13 | ER_CONNECTION | "Cannot connect to a broker" | +----------------+------------------------+-----------------------------------------------------------------------+ | 14 | ER_ISO_TYPE | "Unknown transaction isolation level" | +----------------+------------------------+-----------------------------------------------------------------------+ | 15 | ER_ILLEGAL_REQUEST | "Internal error: The requested information is not available" | +----------------+------------------------+-----------------------------------------------------------------------+ | 16 | ER_INVALID_ARGUMENT | "The argument is invalid" | +----------------+------------------------+-----------------------------------------------------------------------+ | 17 | ER_IS_CLOSED | "Connection or Statement might be closed" | +----------------+------------------------+-----------------------------------------------------------------------+ | 18 | ER_ILLEGAL_FLAG | "Internal error: Invalid argument" | +----------------+------------------------+-----------------------------------------------------------------------+ | 19 | ER_ILLEGAL_DATA_SIZE | "Cannot communicate with the broker or received invalid packet" | +----------------+------------------------+-----------------------------------------------------------------------+ | 20 | ER_NO_MORE_RESULT | "No More Result" | +----------------+------------------------+-----------------------------------------------------------------------+ | 21 | ER_OID_IS_NOT_INCLUDED | "This ResultSet do not include the OID" | +----------------+------------------------+-----------------------------------------------------------------------+ | 22 | ER_CMD_IS_NOT_INSERT | "Command is not insert" | +----------------+------------------------+-----------------------------------------------------------------------+ | 23 | ER_UNKNOWN | "Error" | +----------------+------------------------+-----------------------------------------------------------------------+ .. FIXME: NHibernate .. FIXME: ---------- .. FIXME: CUBRID ADO.NET Data Provider를 사용하면 NHibernateì—서 CUBRID ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ì‚¬ìš©í• ìˆ˜ 있다. ì´ì— 대한 ìžì„¸í•œ ë‚´ìš©ì€ http://www.cubrid.org/wiki_apis/entry/cubrid-nhibernate-support\ 를 ì°¸ê³ í•œë‹¤. .. FIXME: Java ì €ìž¥ í”„ë¡œì‹œì € .. FIXME: ------------------ .. FIXME: .NETì—서 Java ì €ìž¥ í”„ë¡œì‹œì €ë¥¼ 사용하는 ë°©ë²•ì€ http://www.cubrid.org/wiki_apis/entry/how-to-calling-java-stored-functionprocedurec\ 를 ì°¸ê³ í•œë‹¤. ADO.NET API =========== http://ftp.cubrid.org/CUBRID_Docs/Drivers/ADO.NET/\ì„ ì°¸ê³ í•œë‹¤.