C编写的OCI连接Oracle数据库
- 格式:doc
- 大小:32.50 KB
- 文档页数:3
Vc++6.0通过ODBC操作Oracle数据库Visual C ++6.0 中提供了CDatabase 、CRecordset 、CRecordView、CDBException、Clong Binary 和CFieldExchange 6 个类,这些类封装了ODBC SDK函数,从而使用户可以无需了解SDK函数就可以很方便地操作支持ODBC 的数据库。
Vc++6.0通过ODBC操作数据库(如sqlsever、Access)代码可以直接移植到操作Oracle中,以下这段代码就是一个Vc++6.0连接sqlsever的代码,连接Oracle数据库时,如不需验证,在SQLConnect()加入用户名和密码就可以了,如scott tiger 其连接数据库的过程,就是通过ODBC连接的一般方法// 定义环境句柄、连接句柄、语句句柄SQLHENV henv;SQLHDBC hdbc;SQLHSTMT hstmt;// 定义返回值SQLRETURN rtcode;//m_strSqlStmt="123456";// 分配环境句柄rtcode = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);if(rtcode == SQL_SUCCESS || rtcode == SQL_SUCCESS_WITH_INFO){// 设置环境属性(ODBC版本号)rtcode = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ ODBC3,0);if(rtcode == SQL_SUCCESS || rtcode == SQL_SUCCESS_WITH_INFO){// 分配连接句柄rtcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc);if(rtcode == SQL_SUCCESS || rtcode == SQL_SUCCESS_WITH_INFO){// 设置连接属性(登录超时 = 10s)SQLSetConnectAttr(hdbc,SQL_ATTR_LOGIN_TIMEOUT,(void* )10,0);// 连接数据源LPTSTR lpstrDsn = m_strDB.GetBuffer(m_strDB.GetLength());rtcode = SQLConnect(hdbc,(SQLCHAR*)lpstrDsn,SQL_NTS,(SQLCHAR*)"scott",SQL_NTS,(SQLCHAR*)"tiger",SQL_NTS);if(rtcode == SQL_SUCCESS || rtcode == SQL_SUCCESS_WITH_INFO){// 分配语句句柄rtcode = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);if(rtcode == SQL_SUCCESS || rtcode == SQL_SUCCESS_WITH_INFO){/******** 查询数据 ********/// 定义参数SQLCHARsqlSelList[SEL_LIST_LEN],sqlTabList[SEL_TAB_LEN],sqlConList[SEL _CON_LEN];// 获得参数CString strList = _GetSelList();CString strTab = _GetSelTab();CString strCon = _GetSelCon();strcpy((char*) sqlSelList ,strList);strcpy((char*) sqlTabList ,strTab);strcpy((char*) sqlConList ,strCon);// 直接执行char str[2000];strcpy( str, "SELECT ");strcat( str, strList);strcat( str, " FROM ");strcat( str, strTab);if( !strCon.IsEmpty()){strcat( str, " WHERE ");strcat( str, strCon);}rtcode = SQLExecDirect( hstmt, (SQLCHAR*)str,SQL_NTS);m_strSqlStmt = CString(str);UpdateData(FALSE);// 释放语句句柄SQLFreeHandle(SQL_HANDLE_STMT,hstmt);}// 断开连接SQLDisconnect(hdbc);}// 释放连接句柄SQLFreeHandle(SQL_HANDLE_DBC,hdbc);}}// 释放环境句柄SQLFreeHandle(SQL_HANDLE_ENV,henv);。
oci后缀OCI后缀是指Object Connector Interface的简称,是Oracle公司推出的一种数据库连接技术。
通过OCI,开发人员可以使用各种编程语言与Oracle数据库进行交互,实现数据的读取、写入和修改等操作。
本文将介绍OCI后缀的概念、优势以及使用方法。
一、概念介绍OCI后缀即Object Connector Interface,它是Oracle数据库提供的一种应用编程接口,用于实现程序与数据库的连接和交互。
通过OCI后缀,开发者可以使用C、C++等编程语言来编写与Oracle数据库的应用程序,实现数据的访问和操作。
二、优势分析1. 高性能:OCI后缀采用了Oracle数据库底层的C语言接口,能够直接与数据库进行交互,因此具有较高的性能优势。
相比其他的数据库连接方式,OCI可以更高效地对数据库进行读写操作,提供更好的响应速度和并发性能。
2. 数据安全:OCI后缀支持使用Oracle数据库的安全特性,如数据加密、访问控制等,可以有效保护数据库中的数据安全。
开发者可以通过OCI来实现对敏感数据的加密处理,避免数据泄露和非法访问。
3. 多语言支持:OCI后缀提供了对多种编程语言的支持,如C、C++等。
这意味着开发者可以根据自己的编程习惯和需求,选择合适的编程语言来编写与Oracle数据库的应用程序。
同时,OCI还提供了一系列的开发工具和文档,方便开发者进行开发和调试。
三、使用方法1. 安装OCI驱动程序:在开始使用OCI后缀之前,首先需要安装相应的OCI驱动程序。
可以从Oracle官方网站下载并安装最新的OCI驱动程序,根据操作系统和编程语言选择合适的版本。
2. 配置连接参数:在编写OCI应用程序时,需要正确配置连接参数。
包括数据库的地址、端口、用户名、密码等信息。
使用OCI提供的API或者相关库函数,可以方便地进行连接参数的配置和管理。
3. 连接数据库:使用OCI提供的连接函数,可以与Oracle数据库建立起连接。
Oracle数据库连接的⼏种⽅式⼀、本地通过JDBC获得Oracle数据库连接通过JDBC获得Oracle数据库连接,有三种⽅式:OCI⽅式、thin⽅式和JdbcOdbc桥⽅式。
OCI⽅式依赖于本地的动态链接库,如果在本地安装了Oracle数据库客户端可以采⽤该⽅式;⽽thin⽅式为纯java的数据库连接⽅式;JdbcOdbc桥⽅式依赖于本地ODBC数据库源的配置,这种⽅式⼀般不太被采⽤。
1、OCI⽅式 先在本地安装Oracle客户端,安装完之后,在安装的路径中可以找到…/jdbc/lib/classes12.zip⽂件,我们在环境变量classpath中设置classes12.zip所在的路径。
然后通过以下的数据库连接类,在本地通过OCI⽅式获得Oracle数据库连接。
/*** 在本地获得数据库连接*/package com.j2ee.db;import java.util.*;import java.sql.*;import javax.sql.*;import java.io.*;import oracle.jdbc.driver.*;import javax.naming.*;/*** 通过OCI⽅式获得Oracle数据库连接*/public class DbConnection{ final static String sDBDriver = "oracle.jdbc.driver.OracleDriver"; final static String sConnStr = "jdbc:oracle:oci8:sr/sr@ora199"; /** * */ public DbConnection() { } /** * 获得Oracle数据库连接 */ public java.sql.Connection connectDbByOci() { java.sql.Connection conn=null; try { Class.forName(sDBDriver); conn = DriverManager.getConnection(sConnStr); } catch (Exception e) { System.out.println("ERROR:"+e.getMessage()); } return conn; }}/*** 在本地获得数据库连接*/package com.j2ee.db;import java.util.*;import java.sql.*;import javax.sql.*;import java.io.*;import oracle.jdbc.driver.*;import javax.naming.*;/*** 通过thin⽅式获得Oracle数据库连接*/public class DbConnection{ private String sConnStr = ""; /** * 缺省构造器 */ public DbConnection() { sConnStr = "jdbc:oracle:thin:@10.1.4.199:1521:ora199"; } /** * @param ip,serviceName */ public DbConnection(String ip,String serviceName) { sConnStr = "jdbc:oracle:thin:@"+ip+":1521:"+serviceName; } /** * 通过thin⽅式获得Oracle数据库的连接. */ public java.sql.Connection connectDbByThin() { java.sql.Connection conn=null; try { Class.forName(sDBDriver); conn = DriverManager.getConnection(sConnStr,"sr","sr"); } catch (Exception e) { System.out.println("ERROR:"+e.getMessage()); } return conn; } /** * 通过thin⽅式获得Oracle数据库的连接. * @param userId,password */ public java.sql.Connection connectByJdbc(String userId,String password) { java.sql.Connection conn=null; try { Class.forName(sDBDriver); conn = DriverManager.getConnection(sConnStr,userId,password); } catch (Exception e) { System.out.println("ERROR:"+e.getMessage()); } return conn; }} 这种⽅式运⽤起来⽐较灵活,简单,具有较强的移植性和适⽤性。
C#连接Oracle数据库(三种方式:OracleClient、ODBC、OLEDB)1、OracleClient//基于.NET 2.0,只有2.0中包含OracleClientusing System;using System.Collections;using ponentModel;using System.Data;using System.Web;using System.Web.Services;using System.Web.Services.Protocols;using System.Security.Cryptography;using System.IO;using System.Collections.Generic;using System.Configuration;using System.Data.SqlClient;using System.Data.OracleClient;public partial class orclService : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){Response.AddHeader("Access-Control-Allow-Origin", "*");List<info> result = new List<info>();string callback = Request.QueryString["method"];if (callback == "getTableInfo")result = getTableInfo();Response.Write(result);Response.End();}//<add key="orclCon" value="Data Source=ORCL;User Id=sa;Password=123;"/>private static string strConn = ConfigurationSettings.AppSettings["orclCon"];[WebMethod(Description = "<h3>Oracle连接测试</h3>")] public List<info> getTableInfo(){List<info> list = new List<info>();OracleConnection conn = new OracleConnection(strConn);conn.Open();string strComm = "select * from ATEST_POLYGON";OracleCommand comm = new OracleCommand(strComm, conn);OracleDataReader sdr = comm.ExecuteReader();info strInfo = null;while (sdr.Read()){strInfo = new info();strInfo.ID = sdr["ID"].ToString();strInfo.Content = sdr["CONTENT"].ToString();list.Add(strInfo);}if (!sdr.HasRows){strInfo.Content = "无匹配记录";list.Add(strInfo);sdr.Close();return list;}public class info{private string id;public string ID{get { return this.id; }set { this.id = value; }}private string content;public string Content{get { return this.content; }set { this.content = value; }}}}2、ODBC(参见“Oracle 通过 ODBC 连接”)using System;using System.Collections;using ponentModel;using System.Data;using System.Linq;using System.Web;using System.Web.Services;using System.Web.Services.Protocols;using System.Xml.Linq;using System.Security.Cryptography;using System.IO;using System.Collections.Generic;using System.Configuration;using System.Data.SqlClient;using System.Data.Odbc;public partial class orclService : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){Response.AddHeader("Access-Control-Allow-Origin", "*");int result = 0;string callback = Request.QueryString["method"];if (callback == "getTableInfo")result = getTableInfo();Response.Write(result);Response.End();}//<add key="orclCon_windows" value="DSN=oracle_windows;UID=sa;PWD=123;"/>// <add key="orclCon_linux" value="DSN=oracle_linux;UID=sde;PWD=sde;"/>private static string strConn = ConfigurationSettings.AppSettings["orclCon_linux"];[WebMethod(Description = "<h3>Oracle连接测试</h3>")]public int getTableInfo(){OdbcConnection odbcconn = new OdbcConnection(strConn);odbcconn.Open();string strComm = "select * from ATEST_POLYGON";OdbcDataAdapter odbcda = new OdbcDataAdapter(strComm, odbcconn);DataSet ds = new DataSet();odbcda.Fill(ds);DataTable dt = new DataTable();dt = ds.Tables[0];odbcconn.Close();odbcconn.Dispose();return dt.Rows.Count;}}3、OLEDBusing System;using System.Collections;using ponentModel;using System.Data;using System.Linq;using System.Web;using System.Web.Services;using System.Web.Services.Protocols;using System.Xml.Linq;using System.Security.Cryptography;using System.IO;using System.Collections.Generic;using System.Configuration;using System.Data.SqlClient;using System.Data.OleDb;public partial class orclService : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){Response.AddHeader("Access-Control-Allow-Origin", "*");List<info> result = new List<info>();string callback = Request.QueryString["method"];if (callback == "getTableInfo")result = getTableInfo();Response.Write(result);Response.End();}//<add key="orclCon_windows" value="Provider=OraOLEDB.Oracle.1;Data Source=ORCL;User ID=sa;Password=123;Persist Security Info=False;"/>//<add key="orclCon_linux" value="Provider=OraOLEDB.Oracle.1;DataSource=ORCL_LINUX;User ID=sde;Password=sde;Persist Security Info=False;"/>private static string strConn = ConfigurationSettings.AppSettings["orclCon_windows"];[WebMethod(Description = "<h3>Oracle连接测试</h3>")] public List<info> getTableInfo(){List<info> list = new List<info>();OleDbConnection conn = new OleDbConnection(strConn);conn.Open();string strComm = "select * from ATEST_POLYGON";OleDbCommand comm = new OleDbCommand(strComm, conn);OleDbDataReader sdr = comm.ExecuteReader();info strInfo = null;while (sdr.Read()){strInfo = new info();strInfo.ID = sdr["ID"].ToString();strInfo.Content = sdr["CONTENT"].ToString();list.Add(strInfo);}if (!sdr.HasRows){strInfo.Content = "无匹配记录";list.Add(strInfo);}sdr.Close();return list;conn.Close();conn.Dispose();return list;}public class info{private string id;public string ID{get { return this.id; }set { this.id = value; }}private string content; public string Content {get { return this.content; } set { this.content = value; } }}}。
收稿日期:2003-12-03基金项目:广东省科技计划项目资助项目(2003C101037);广东省自然科学基金重点资助项目(010421)作者简介:曾志聪(1979 ),男,广东韶关人,硕士研究生,研究方向为计算机网络。
基于OCI 技术的Oracle 数据库连接曾志聪,姚国祥(暨南大学网络中心,广东广州510632)摘 要:Oracle 数据库是目前应用最广泛的数据库之一,基于Oracle 数据库的大型应用对系统响应时间提出了越来越高的要求,如何有效地提高Oracle 数据库的访问效率,减少系统等待时间成为一个热门的研究问题。
文中介绍了Oracle Call In ter face(OCI)技术及其新特性,并通过分析和对比ODBC,JDBC 的实现机理,表明了OCI 技术在访问Oracle 数据库上性能的优越性。
最后描述了OCI 技术的编程机制,用OCI 技术实现了访问Oracle 数据库的典型应用,为OCI 技术的应用提供了技术参考。
关键词:Oracle 调用接口;JDBC 驱动接口;ODBC 驱动接口;Oracle 数据库;数据库接口中图分类号:T P311.138 文献标识码:A 文章编号:1005-3751(2004)08-0011-03Oracle Database Connection Based on OCI TechnologyZENG Zhi cong ,YAO Guo x iang(N etw ork Center of Jinan University,Guang zhou 510632,China)Abstract:Oracle i s one of the most popular databases.As the demand for a shorter response ti m e in large applicati ons based on Oracle database is i ncreasing,how to shorten the response time and effectivel y acces s an Oracle database become a hot topic and gain our research interest.In this paper Oracle call i nterface (OCI )technology and its new features are introduced.T he implementing mechanism of ODBC,JDBC and OC I are compared to show the better performance of OC I on accessing an Oracle database.Finally,the mechanism of OCI programming is particularly described and some typical functions implemented with OC I for accessing Oracle databases are provided for references.Key words:OCI;JDBC;ODBC;Oracle;database API0 引 言Oracle Call Interface(OCI)是Ora cle 的数据库调用接口。
用oci开发oracle数据库的方法OCI是Oracle提供的一种基于C/C++语言的接口,用于访问Oracle数据库。
在OCI开发的过程中,可以使用OCI提供的函数来执行各种类型的数据库操作。
本文将介绍OCI开发Oracle数据库的一般步骤。
1. 安装Oracle数据库客户端在使用OCI开发Oracle数据库之前,您需要安装Oracle数据库客户端。
Oracle客户端包含OCI库和头文件。
建议使用与目标Oracle数据库版本相同的客户端。
2. 配置开发环境为了使用OCI进行开发,你需要在你的开发环境中配置相关的Oracle环境变量。
设置ORACLE_HOME和LD_LIBRARY_PATH环境变量,以便OCI库和头文件所在的目录被正确找到。
3. 设置OCI环境使用OCI开发Oracle数据库之前,需要创建OCI环境和错误处理器。
OCI环境是OCI函数调用所需的上下文信息,可通过OCIEnvCreate函数创建。
OCIEnvCreate函数需要连接模式和错误处理器作为输入参数。
4. 连接到Oracle数据库在使用OCI连接Oracle数据库之前,您需要知道以下信息:· Oracle数据库的SID或服务名称;· 数据库主机名或IP地址;· 使用的端口号;· 连接的用户名和密码。
您可以使用OCI函数OCILogon或OCIConnect来连接Oracle数据库。
其中OCILogon函数使用数据库SID或服务名来连接数据库,而OCIConnect函数使用主机名、端口号和服务名称。
5. 执行SQL语句使用OCI函数OCIStmtPrepare和OCIStmtExecute来执行SQL语句。
OCIStmtPrepare用于准备一个SQL语句的执行,而OCIStmtExecute函数用于实际执行该SQL语句。
执行SQL语句可能涉及到绑定参数和获取结果集,您可以使用OCI函数OCIBindByPos、OCIDefineByPos和OCIStmtFetch来完成这些操作。
C#连接Oracle数据库的四种⽅法C#连接数据库的四种⽅法在进⾏以下连接数据库之前,请先在本地安装好Oracle Client,同时本次测试System.Data的版本为:2.0.0.0。
在安装Oracle Client上请注意,如果OS是3-BIT请安装32-BIT的Oracle Client,但OS是64-BIT,需要根据实际情况安装,如果你的APP是按32-BIT运⾏的,则需要安装32-BIT客户端,如果是按64位运⾏的,则安装64位客户端,⽽不是OS是64-BIT的,就要安装64-BIT的ORACLE 客户端。
本次测试会在32-BIT 和64-BIT 上同时测试,32-BIT Oracle10G。
1.ODBC1.1 ⾸先需要在控制⾯板->管理⼯具->数据源(odbc)。
1.2 using System.Data.Odbc;1.3 连接数据库OdbcConnection conn = new OdbcConnection(DSN=XXX;UID=XXX;Pwd=XXX;);conn.Open();conn.Close();32-BIT 和64-BIT 都OK。
2.OleDb2.1 OleDB连接驱动有MSDAORA和OraOLEDB.Oracle,他们分别由微软和Oracle提供。
使⽤OraOLEDB.Oracle驱动,需要安装Oracle Data Provider for OLE DB 。
在32位机器上两者都可以,在64位机器上,使⽤“MSDAORA”会出现“未在本地计算机上注册“MSDAORA.1”提供程序”的问题,OraOLEDB.Oracle⼀切正常。
2.2 连接数据库//using System.Data.OleDb;OleDbConnection conn = new OleDbConnection("Provider=MSDAORA.1;User ID=XXX;password=XXX;Data Source=XXX;Persist Security Info=False"); Provider需要根据实际情况修改conn.Open();conn.Close();3.OracleClient3.1 //using System.Data.OracleClient;3.2 连接数据库OracleConnection conn = new OracleConnection(“data source=XXX;user=XXX;password=XXX;”);conn.Open();conn.Close();32-BIT 和64-BIT 都OK。
OCI(Oracle Call Interface)是Oracle公司提供的由头文件和库函数等组成的一个访问Oracle数据库的应用程序编程接口(Application Programming Interface,API)。
它允许开发人员在第三代编程语言(包括C, C++, COBOL与FORTRAN)中通过SQL(Structure Query Language)来操纵Oracle数据库。
OCI是一种开放标准,其规范被广泛应用于各种应用程序开发,使得不同的软件和系统可以相互协作。
OCI接口标准提供了一组通用的函数和协议,用于与Oracle数据库进行交互。
这些函数和协议使得开发人员可以执行SQL查询、管理数据库连接、处理数据等操作。
OCI接口标准具有以下特点:
跨平台性:OCI接口标准可以在不同的操作系统和硬件平台上使用,使得开发人员可以轻松地在不同的环境中开发和部署应用程序。
高效性:OCI接口标准提供了高效的数据库访问机制,可以快速地执行SQL 查询和处理数据。
安全性:OCI接口标准提供了安全机制,可以保护应用程序和数据库免受攻击。
灵活性:OCI接口标准提供了丰富的函数和协议,可以满足各种不同的应用程序需求。
总之,OCI接口标准是一种广泛使用的应用程序编程接口,它为开发人员提供了与Oracle数据库交互的便捷方式,同时也为应用程序的开发和部署提供了灵活性和高效性。
orcale应用技巧大多数应用程序使用 OCI 的ODAC 标准方式来连接 Oracle 数据库服务器。
这是使用第三方开发语言设计 Oracle 应用程序最常用的方法。
所有的 OCI 接口都作为内部库来使用,使得编译生成的应用程序非常小。
但是,这需要在客户机上安装 Oracle 客户端软件,这使得安装和管理要花费额外的开销。
有时,安装 Oracle 客户端程序甚至是不可能的。
例如,如果你需要在远程计算机上设置你的应用程序,你不能提供特殊的文件支持。
ODAC Net 允许你的应用程序直接通过 TCP/IP 协议来连接 Oracle,而不需要 Oracle 客户端软件。
运行使用 ODAC Net 的应用程序,仅需要有一个支持 TCP/IP 协议的操作系统。
使用 ODAC Net 连接 Oracle 服务器,你需要知道 Oracle 服务器的地址,监听端口号以及数据库实例名称。
在你的应用程序中使用 Net 选项前,你只需要设置 TOraSession 对象的选项 Net 为True 且指定它的Server 属性为指定的数据库。
如果使用 ODAC 的标准方式通过 OCI 来连接数据库,你必须设置 Server 属性为 TNS 别名,但现在使用 ODAC 的 Net 选项,你只需要指定数据库字符串,格式如下: Host:Port:SID.这里, Host 指服务器地址, Port 指服务器监听端口号, SID 指特定的系统实例名称。
这里有个例子示范不使用 OCI 而连接数据库:varSession: TOraSession;. . . := True;ername := 'Scott';Session.Password := 'tiger';Session.Server := '205.227.44.44:1521:orcl';Session.Connect;注意:这些是你的应用程序要支持 Net 选项时所必须的。
CVI数据库操作方法在CVI中,数据库操作一般需要以下步骤:1. 引入数据库头文件:根据要使用的数据库类型,引入对应的头文件。
例如,对于Oracle数据库,可以使用`#include <ocilib.h>`引入OCI库的头文件。
2.建立数据库连接:使用数据库提供的接口,建立与数据库的连接。
连接参数包括数据库地址、用户名、密码等。
3.执行SQL语句:使用数据库提供的接口,执行SQL语句。
SQL语句可以是查询语句(SELECT)、插入语句(INSERT)、更新语句(UPDATE)或删除语句(DELETE)等。
4.处理执行结果:根据执行结果,进行相应的处理。
对于查询语句,可以使用数据库提供的接口获取查询结果并进行相关处理;对于更新、插入和删除语句,可以根据返回值判断操作是否成功。
5.关闭数据库连接:释放数据库资源,关闭与数据库的连接。
下面以Oracle数据库为例,给出CVI中数据库操作的示例代码:```#include <ocilib.h>int mainOCI_Connection* cn;OCI_Statement* st;OCI_Resultset* rs;if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT))printf("Failed to initialize OCI.\n");return -1;}cn = OCI_ConnectionCreate(CONN_STR, "", "",OCI_SESSION_DEFAULT);if (cn == NULL)printf("Failed to connect to Oracle.\n");return -1;}st = OCI_StatementCreate(cn);OCI_ExecuteStmt(st, "SELECT * FROM Employee");rs = OCI_GetResultset(st);while (OCI_FetchNext(rs))printf("Employee ID: %d\n", OCI_GetInt(rs, 1));printf("Employee Name: %s\n", OCI_GetString(rs, 2));printf("Employee Age: %d\n", OCI_GetInt(rs, 3));}OCI_Cleanup(;return 0;```以上代码演示了CVI连接Oracle数据库,并执行查询语句的操作。
C#连接oracle数据库报错:OCIEnvCreate失败,返回代码为-1,但错误消息⽂本不可⽤原因⼤概是OracleOraDb11g_home1TNSListener服务没启动的原因步骤⼀、停⽌并重新启动OracleOraDb11g_home1TNSListener服务,试⼀下是否可⾏。
如在启动此服务出现“本地计算机上的OracleOraDb11g_home1TNSListener服务启动后停⽌。
某些服务在未由其它服务或程序使⽤时将⾃动停⽌。
” 应该是Oracle的ORACLE_HOME出现问题,打开环境变量,找到系统变量中的ORACLE_HOME,把值改为ORACLE的安装⽬录,如下路径:E:\app\Administrator\product\11.2.0\dbhome_1再重新启动OracleOraDb11g_home1TNSListener服务,发现可以成功启动。
步骤⼆、再次启动C#软件出现了新报错:ORA-12541: TNS: ⽆监听程序解决⽅法:开始-->所有程序-->Oracle OraDb11g_home1--配置和移植⼯具--Net Configuration Assistant,重新配置.如下图。
步骤三、再次启动C#软件发现⼜出现如下报错:ora-12514:TNS:监听服务当前⽆法识别描述中的请求服务原因:没有注册监听器解决⽅法:E:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN中的listener.ora修改如下所⽰:# listener.ora Network Configuration File: e:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora# Generated by Oracle configuration tools.SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(SID_NAME = CLRExtProc)(ORACLE_HOME = e:\app\Administrator\product\11.2.0\dbhome_1)(PROGRAM = extproc)(ENVS = "EXTPROC_DLLS=ONLY:e:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")))LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))))ADR_BASE_LISTENER = e:\app\Administrator再次重启服务,重启C#软件发现已经可以连上ORACLE数据库!步骤四、注意:如果⽤C#写的客户端可以访问ORACLE数据库,但是⽤C#写的webservice却访问不了oracle数据库,并报错:OCIEnvCreate 失败,返回代码为 -1,但错误消息⽂本不可⽤解决⽅法:找到ORACLE的安装⽬录如:app\ ,右键此⽂件,属性,web共享,此处找到已发布的webservice,并添加共享。
OCI简介1.OCI概述OCI(Oracle Call Interfce,即Oracle调用层接口)是Oracle公司提供的由头文件和库函数等组成的一个访问Oracle数据库的应用程序编程接口(application programming interface API),它允许开发人员在第三代编程语言(包括C,C++,COBOL与FORTRAN)中通过SQL(Structure Query Language)来操纵Oracle数据库,而且OCI在一定程度上支持第三代编程语言(诸如C,C++,COBOL与FORTRAN)的数据类型、语法等等。
OCI的显著特点是全面支持Oracle的面向对象技术,同时OCI 还具有如下的一些特点:1)非常有利于应用程序的设计;2)高度控制应用程序的执行;3)允许开发人员应用已熟悉的第三代程序设计语言来应用OCI;4)支持动态SQL;5)几乎所有的Oracle的开发工具都支持OCI;6)通过回调技术(callbacks)来实现动态绑定与定义;7)通过OCI的描述函数可以获取Oracle数据库的各种参数;8)增强了数组在DML(data manipulation language)语言中的应用;OCI接口支持Windows NT和Windows 95/98/2O0o/xP操作系统,它所支持的C语言编译器包括Borland C++和MicrosoftVisualC++等。
在使用OCI开发Oralce数据库应用程序之前,应首先安装这些操作系统和C语言编译工具。
在选择安装OCI开发工具包后,Oracle安装程序将OCI文件拷贝到oracle主目录内的以下子目录中:.. BIN\:执行文件和帮助文件:..\OCIINCLUDE头文件;.. OCI\LIB\其中包含仍bc和\msvc两个子目录,分别用于存储支持Borland C++和MicroSoflVisualC++的OCI库文件,这些库文件与OCI源程序编译后所产生的目标文件进行链接生成可执行程序。
1、VC++采用OO4O方式连接Oracle数据库COM(Component Object Model)是微软在基于Window平台上,实现软件的构件化设计和软件再利用的一种技术策略。
OO4O是基于组件对象模型的技术,能和Oracle数据库进行无缝连接和优化访问的一组编程对象的集合。
自上而下层次关系如下:Visual C++oracle data control oracle c++ class library automation controllersmicrosoft oleoracle object serveroraclient oradynasetorasession orasql stmtoraconnection orafieldoradatabase oraparameterOracle Call Interface(OCI)SQL * NET and NetworkOracle DBMS2、Visual C++ 采用ODBC方式连接Oracle数据库ODBC(Open Database Commectivity 开放数据库连接)是解决异种数据库访问的问题,减少了数据库访问的复杂性,提高了数据库的独立性。
在微软封装ODBC功能的MFC类:CDatabase CRecordset CRecordView CDBException。
用ODBC开放的程序Microsoft驱动程序管理ODBC驱动程序1 ODBC驱动程序2 ODBC驱动程序3数据库1 数据库2 数据库33、采用Pro*C方式连接Oracle数据库Pro*C是Oracle公司提供的在第三代高级程序设计语言中嵌入SQL语句来访问数据库的一套预编译程序,利用Oracle公司提供的工具生成高级语言格式的源程序,然后就可以将这些源程序加入用户的程序中。
4、三种方法的比较(1)3中方法的数据访问应用程序接口特性:OO4O在开放性、可视化开放、Oracle 的连接能力方面比较好,但只适用于Oracle数据库。
Oracle数据库C++调用接口Oracle C++ Call Interface(OCCI)简介•OCCI是一种用于访问Oracle数据库的C++ API •OCCI是一组封装完善,易于使用的C++类和接口•为关系存取、O-R存取等提供了丰富的特性。
优点•用于关系存取数据库时,类似于JDBC,易学,易用。
基于标准C++,采用面向对象思想设计。
为应用程序设计提供了较高的效率和编程质量。
可用于C/S模式编程、中间件编写以及基于复杂对象的应用开发。
•Oracle将持续改进并为其增加更多功能。
特性•完整的SQL/PL SQL支持。
•为数量不断增长的用户与访问请求,提供了弹性选项。
•为用户自定义类型和C++自带类型之间的互操作提供无缝接口。
•支持Oracle中所有的数据类型和大对象类型(BLOB)。
•支持数据库元数据访问。
构建应用程序应用程序源文件(使用OCCI API ) OCCI API 头文件OCCI 头文件•occi.h•occiCommon.h•occiControl.h•occiData.h•occiObjects.h OCCI 库文件C++ 编译器链接器OCCI 库文件( 静态库或者动态库)•libocci.a•libocci.so/oraocci9.dll应用程序预备工作•下载OCCI库文件和SDK。
•将OCCI库文件拷贝到/usr/lib,解压SDK压缩文件包•为OCCI库文件做好文件链接:–ln -s libocci.so.11.1 libocci.so – ln -s libclntsh.so.11.1 libclntsh.so步骤一:初始化•OCCI应用程序的初始化是通过创建Environment类的对象来实现的。
•一个Environment类的对象实例包括:–应用程序模式:OBJECT/THREADED/MUTEXED etc–对象缓存设定–OCCI类对象堆空间•Environment是连接到远程数据库的基础。
OCI学习资料--Oracle8及以后版本的OCI 1.简介Oracle调用接口(Oracle Call Interface)是一个让我们通过函数调用来访问Oracle数据库和控制SQL语句执行各个阶段的应用程序编程接口(API)。
OCI支持C和C++的数据类型、调用惯例、语法和语义。
1.1创建一个OCI应用程序我们编译和连接一个OCI程序的方法与编译和连接一个非数据库应用程序的方法相同。
不需要独立的预处理或者预编译步骤。
1.2OCI的组成部分OCI具有如下功能:·能够安全地支持大量用户的灵活的、多线程API集合。
·为管理数据库访问、处理SQL语句和管理Oracle数据库对象的SQL访问函数。
·管理Oracle类型的数据属性的数据类型映射和操作函数。
·不经SQL语句直接向数据库加载数据的数据加载函数。
1.3封装的接口所有的OCI函数使用的数据结构都以被称为句柄的不透明的接口之形式封装。
句柄是指向OCI库分配的保存着上下文信息、连接信息、错误信息或者关于SQL及PL/SQL的绑定信息的不透明指针。
客户端分配一定类型的句柄,通过已经定义好的接口来填充一个或者多个句柄,并通过这些句柄向服务器发送请求。
应用程序可以通过访问函数来访问句柄中包含的相关信息。
2.OCI基本编程这部分介绍OCI编程中涉及到的基本概念。
2.1OCI编程概要一个OCI应用程序的基本目标就是代表多个用户进行数据库操作。
OCI使用以下基本编程顺序:1.初始化OCI编程环境和线程。
2.分配必要的句柄,并且设置服务器连接和用户会话。
3.通过在服务器上执行SQL语句来交换数据,并且执行必要的应用程序数据处理。
4.执行准备好的语句或者准备即将要执行的语句。
5.终止用户会话并且断开服务器连接。
6.释放句柄。
图2-1显示了一个OCI应用程序的编程步骤。
图2-1这幅图及其所列出的步骤提供了一个OCI编程步骤的简单概括。
C#连接Oracle数据库,通过EF⾃动⽣成与数据库表相关的实体类C#连接Oracle数据库,通过EF⾃动⽣成与数据库表相关的实体类
ps:如需转载,请在转载⽂章明显处,i标注作者和原⽂地址
⼀、准备条件
需要⾃⼰电脑上已经安装了Oracle数据库,并且已经创建了相关实例
使⽤vs创建⼀个项⽬
⼆、连接Oracle数据库
下载安装 Oracle Developer Tools for Visual Studio
博主的使⽤的是vs2017
⼯具下载地址:
⾃带的oracle database显⽰
安装完整版后 oracle database的显⽰
下载后,直接安装好就⾏(安装前需要关闭vs,否则会提⽰错误)
三、⾃动⽣成实体类
1、下载安装相应的程序框架
⼯具-->NuGet包管理器-->管理NuGet程序包
搜索安装EntityFramework
下载安装Oracle 实体类框架Oracle.ManagedDataAccess.EntityFramework(如图)
2、添加实体数据模型
3、⽣成结果。
C# 连接 Oracle 的几种方式一:通过System.Data.OracleClient(需要安装Oracle客户端并配置tnsnames.ora)1. 添加命名空间System.Data.OracleClient引用2. using System.Data.OracleClient;3.string connString = "UserID=IFSAPP;Password=IFSAPP;Data Source=RACE;"; OracleConnection conn = newOracleConnection(connString);try{conn.Open();MessageBox.Show(conn.State.ToString()); }catch (Exception ex){ShowErrorMessage(ex.Message.ToString()); }finally{conn.Close();}二:通过System.Data.OracleClient(需要安装Oracle客户端不需配置tnsnames.ora)1. 添加命名空间System.Data.OracleClient引用2. using System.Data.OracleClient;3.string connString = "User ID=IFSAPP;Password=IFSAPP;DataSource=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA =(SERVICE_NAME = RACE)))";OracleConnection conn = new OracleConnection(connString);try{conn.Open();MessageBox.Show(conn.State.ToString());}catch (Exception ex){ShowErrorMessage(ex.Message.ToString());}finally{conn.Close();}三:通过System.Data.OleDb和Oracle公司的驱动1. 添加命名空间System.Data.OracleClient引用2. using System.Data.OleDb;3.string connString = "Provider=OraOLEDB.Oracle.1;UserID=IFSAPP;Password=IFSAPP;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = RACE)))";OleDbConnection conn = new OleDbConnection(connString);try{conn.Open();MessageBox.Show(conn.State.ToString());}catch (Exception ex){ShowErrorMessage(ex.Message.ToString());}finally{conn.Close();}四:通过System.Data.OleDb和微软公司的Oracle驱动1. 添加命名空间System.Data.OracleClient引用2. using System.Data.OleDb;3.string connString = "Provider=MSDAORA.1;UserID=IFSAPP;Password=IFSAPP;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = RACE)))";OleDbConnection cnn = new OleDbConnection(connString);try{conn.Open();MessageBox.Show(conn.State.ToString());}catch (Exception ex){ShowErrorMessage(ex.Message.ToString());}finally{conn.Close();}备注:a.XP操作系统已经安装了微软公司的Oracle驱动C:\Program Files\Common Files\System\Ole DB\msdaora.dllb.该驱动需要Oracle客户端的三个文件(oraocixe10.dll、oci.dll、ociw32.dll)放在System32下即可五:使用ODP连接1. 下载安装(/technetwork/developer-tools/visual-studio/downlo ads/index.html)2. 安装完全成后会产生一序列文件。
linux下用C编写的OCI连接Oracle数据库程序代码2009-11-28 15:57206人阅读评论(0)收藏举报在Oracle 建立数据库create table employees(employee_id number(3), name varchar2(20), sex varchar2(5), birthday date);alter session set nls_date_format = 'yyyy-mm-dd';insert into employees values('101', '耳温枪', 'na', '1999-05-03');insert into employees values('102', 'xiaoli ', 'na', '1999-02-03');insert into employees values('103', 'xiaozhang ', '男', '1999-02-03');insert into employees values('104', '五千万', '男', '1999-02-03');insert into employees values('105', '问问', '女', '1999-02-03');insert into employees values('106', '阿散酸', '女', '1999-02-03');insert into employees values('107', '阿斯顿', '男', '1999-02-03');insert into employees values('108', '撒旦', 'na', '2001-5-05');insert into employees values ('001','张三','三','2001-07-05');insert into employees values('111','张三','一','2003-02-08');OCI代码:/*gcc -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64-I${ORACLE_HOME}/rdbms/public -I${ORACLE_HOME}/rdbms/demo-L${ORACLE_HOME}/lib -lclntsh -o oracle_test oracle_test.c*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <oci.h>static OCIEnv *p_env;static OCIError *p_err;static OCISvcCtx *p_svc;static OCIStmt *p_sql;static OCIDefine *p_dfn = (OCIDefine *) 0;static OCIBind *p_bnd = (OCIBind *) 0;int main(){int p_bvi;char *p_sli;char *p_sli1;int rc;char errbuf[100];int errcode;char mysql[20];p_sli=(char *)malloc(20);memset(p_sli,0,20);p_sli1=(char *)malloc(20);memset(p_sli1,0,20);/* Initialize OCI evironment*/rc = OCIEnvCreate((OCIEnv **) &p_env,OCI_DEFAULT,(dvoid *)0,(dvoid * (*)(dvoid *, size_t)) 0,(dvoid * (*)(dvoid *, dvoid *, size_t))0,(void (*)(dvoid *, dvoid *)) 0,(size_t) 0, (dvoid **) 0);/* Initialize handles */rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_err, OCI_HTYPE_ERROR,(size_t) 0, (dvoid **) 0);rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_svc, OCI_HTYPE_SVCCTX,(size_t) 0, (dvoid **) 0);/* Connect to database server */rc = OCILogon(p_env, p_err, &p_svc, "scott", 5, "tiger", 5, "orcl", 4);//rc = OCILogon(p_env, p_err, &p_svc, "hr/hr@orcl", 10, NULL, -1, NULL, -1);if (rc != 0) {OCIErrorGet((dvoid *)p_err, (ub4) 1, (text *) NULL, &errcode, errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);printf("Error - %.*s/n", 512, errbuf);exit(8);}else{printf("Connect to orcl successful! 已连接!/n");}/* Allocate and prepare SQL statement */rc = OCIHandleAlloc((dvoid *) p_env, (dvoid **) &p_sql,OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0);/* set my sql statement */// strcpy(mysql,"select name from employees where emploee_id=:x");strcpy(mysql, "select * from employees ");// strcpy(mysql, "insert into employees values('109', 'x12er', 'na', '1888-06-08')");//strcpy(mysql,"delete from employees where emploee_id='108'");// strcpy(mysql,"desc employees;");rc = OCIStmtPrepare(p_sql, p_err, mysql,(ub4) strlen(mysql), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);/* Bind the values for the bind variables */// p_bvi = 101; /* Use employee_id=102 */// rc = OCIBindByName(p_sql, &p_bnd, p_err, (text *) ":x",// -1, (dvoid *) &p_bvi, sizeof(int), SQLT_INT, (dvoid *) 0,// (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT);/* Define the select list items */rc = OCIDefineByPos(p_sql, &p_dfn, p_err, 1, (dvoid *) p_sli,(sword) 20, SQLT_STR, (dvoid *) 0, (ub2 *)0,(ub2 *)0, OCI_DEFAULT);rc = OCIDefineByPos(p_sql, &p_dfn, p_err, 2, (dvoid *) p_sli1,(sword) 20, SQLT_STR, (dvoid *) 0, (ub2 *)0,(ub2 *)0, OCI_DEFAULT);/* Execute the SQL statment */rc = OCIStmtExecute(p_svc, p_sql, p_err, (ub4) 1, (ub4) 0,(CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT);while (rc != OCI_NO_DATA) { /* Fetch the remaining data */printf("%s %s/n",p_sli,p_sli1);rc = OCIStmtFetch(p_sql, p_err, 1, 0, 0);}/* if(rc != OCI_SUCCESS && rc != OCI_SUCCESS_WITH_INFO){printf("insert error!/n");OCIErrorGet((dvoid *)p_err, (ub4) 1, (text *) NULL, &errcode, errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);}elseprintf("insert success!/n");*/rc = OCILogoff(p_svc, p_err); /* Disconnect */rc = OCIHandleFree((dvoid *) p_sql, OCI_HTYPE_STMT); /* Free handles */rc = OCIHandleFree((dvoid *) p_svc, OCI_HTYPE_SVCCTX);rc = OCIHandleFree((dvoid *) p_err, OCI_HTYPE_ERROR);return;}。