概述

近期我们项目正处于将Oracle数据库迁移到OceanBase Oracle租户模式的阶段。考虑到我们项目采用了C++和C#混合开发,并且使用了多种技术,因此存在多种数据库连接方式。然而,针对C#连接OceanBase的案例相对较少,因此我特意记录下这一过程。

开放数据库互连(ODBC)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,基本思想是为用户提供简单、标准、透明的数据库连接的公共编程接口,开发厂商根据 ODBC 的标准去实现底层的驱动程序,这个驱动对用户是透明的,并允许根据不同的 DBMS 采用不同的技术加以优化实现。

驱动下载

下载地址:https://www.oceanbase.com/softwarecenter-cloud

根据平台类型选择驱动。

驱动配置

打开 ODBC 数据源管理员:在 Windows 中,按下 Windows键 + R 打开“运行”对话框,然后输入 odbcad32 并按下 Enter 键,这将打开 ODBC 数据源管理员。

选择系统的或用户的数据源:在 ODBC 数据源管理员中,有两个选项卡:用户 DSN 和 系统 DSN。选择一个适合你的选项,通常建议选择 系统 DSN,因为它对所有用户都可用。

添加一个新的数据源:点击 添加 按钮,然后在弹出的对话框中选择 OceanBase ODBC 2.0 Driver 数据库。

配置数据源连接信息:在配置 OceanBase 数据库数据源时,你需要提供以下信息:

数据源名称(DSN):为你的数据源指定一个唯一的名称。这里命名为OceanBase ODBC

描述:提供有关此数据源的描述,以便识别它。

TNS 服务名称:输入你要连接的 Oracle 服务的 TNS 服务名称。IP: XX.XX.XX.XX

用户名和密码:提供用于连接到 Oracle 数据库的用户名和密码。

UserName: 用户名@租户名#集群

测试连接:在完成配置后,你可以点击 测试连接 按钮来验证是否能够成功连接到 OceanBase Oracle 数据库。

注意:不通过DSN也可以连接

C++ 代码案例

#include <stdio.h>
#include <assert.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <iostream> void print_error(SQLSMALLINT HandleType, SQLHANDLE Handle) {
SQLWCHAR SQLState[6];
SQLINTEGER NativeError;
SQLWCHAR SQLMessage[SQL_MAX_MESSAGE_LENGTH] = { 0 };
SQLSMALLINT TextLengthPtr; SQLGetDiagRec(HandleType, Handle, 1, SQLState, &NativeError, SQLMessage, SQL_MAX_MESSAGE_LENGTH, &TextLengthPtr);
std::wcerr << L"[" << SQLState << L"] (" << NativeError << L") " << SQLMessage << std::endl;
} int main() {
// Allocate environment handle
SQLHANDLE henv;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); // Allocate connection handle
SQLHANDLE hdbc;
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); // Connection string //使用DSN
SQLWCHAR* connectionString = (SQLWCHAR*)L"DSN=OceanBase ODBC;UID=用户名@住户名#集群;PWD=密码"; //不使用DSN
//SQLWCHAR* connectionString = (SQLWCHAR*)L"Driver={OceanBase ODBC 2.0 Driver};Server=xx.xx.xx.xx;Port=2883;Database=用户名;User=用户名@住户名#集群;Password=密码;Option=3;"; // Connect to the database
SQLRETURN retcode = SQLDriverConnect(hdbc, NULL, connectionString, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
std::cerr << "Error connecting to database:" << std::endl;
print_error(SQL_HANDLE_DBC, hdbc);
return 1;
} std::cout << "Connected to database successfully!" << std::endl; // Allocate statement handle
SQLHANDLE hstmt;
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); // Execute a query
SQLWCHAR* query = (SQLWCHAR*)L"SELECT * FROM TIERS WHERE ROWNUM <= 1;";
retcode = SQLExecDirect(hstmt, query, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
std::cerr << "Error executing query:" << std::endl;
print_error(SQL_HANDLE_STMT, hstmt);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 1;
} // Fetch and print results
SQLCHAR name[256];
SQLLEN nameLen;
while (SQLFetch(hstmt) == SQL_SUCCESS) {
SQLGetData(hstmt, 1, SQL_C_CHAR, name, sizeof(name), &nameLen);
std::cout << "Name: " << name << std::endl;
} // Cleanup
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0;
}

C# 代码案例

using System;
using System.Data.Odbc; namespace ConsoleApp
{
internal class Program
{
static void Main(string[] args)
{
//使用DSN
string connectionString = "DSN=OceanBase ODBC;Uid=用户名@住户名#集群;Pwd=你的密码;"; //不使用DSN
//string connectionString = "Driver={OceanBase ODBC 2.0 Driver};Server=xx.xx.xx.xx;Port=2883;Database=用户名;User=用户名@住户名#集群;;Password=密码;Option=3;";
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
try
{
connection.Open();
Console.WriteLine("Connected to Oracle database!"); // Perform database operations here string query = "SELECT *FROM TIERS WHERE ROWNUM <= 1;";
using (OdbcCommand command = new OdbcCommand(query, connection))
{
using (OdbcDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32(0); // 假设第一列是 ID
string name = reader.GetString(1); // 假设第二列是 Name
Console.WriteLine($"ID: {id}, Name: {name}");
}
}
} connection.Close();
} }
}
}

NHibernate示例

安装NHibernate

使用NuGet包管理器安装NHibernate。你可以在Visual Studio中打开NuGet包管理器控制台,然后运行以下命令:

Install-Package NHibernate

这将自动下载并安装NHibernate及其所有依赖项到你的项目中。

配置NHibernate

NHibernate.cfg.xml
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.driver_class">NHibernate.Driver.OdbcDriver</property>
<!--<property name="connection.connection_string">DSN=OceanBase ODBC;Database=用户名;Uid=用户名@住户名#集群;Pwd=密码;</property>-->
<property name="connection.connection_string">Driver={OceanBase ODBC 2.0 Driver};Server=xx.xx.xx.xx;Port=2883;Database=用户名;Uid=用户名@住户名#集群;Pwd=密码;</property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
</session-factory>
</hibernate-configuration>

配置映射类

public class TestEntity
{
public virtual int Ident { get; set; } public virtual string Name { get; set; }
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="ConsoleApp2.TestEntity, ConsoleApp2" table="TESTENTITY">
<id name="Ident" column="IDENT" />
<property name="Name" column="NAME" />
<!-- 其他属性映射... -->
</class>
</hibernate-mapping>

查询案例

using NHibernate.Cfg;
using System;
using System.IO; class Program
{
static void Main(string[] args)
{
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
var cfg = new Configuration().Configure(Path.Combine(baseDirectory, "NHibernate.cfg.xml"));
cfg.AddFile(Path.Combine(baseDirectory, "TestEntity.xml")); var sessionFactory = cfg.BuildSessionFactory();
using (var session = sessionFactory.OpenSession())
{
var query = session.CreateQuery("FROM TestEntity")
.SetMaxResults(10); var results = query.List();
}
}
}

C#/C++ 通过ODBC连接OceanBase Oracle租户的更多相关文章

  1. 采用ODAC,ODBC连接Oracle【转】

    采用ODAC,ODBC连接Oracle 在没有装oracle的环境中,偶尔会需要访问数据库(Word文档查看数据,开发项目运行等等),简单介绍我用过的方案. 一:ODAC 1.介绍.ODAC,全称:o ...

  2. vb.net写的odbc连接dsn数据源和ole链接oracle的小例子

    最近由于工作需要开始接触vb2010,也叫vb.net.相比vb6.0有面向对象编程的优势.同时接触一门新语言,要更快的实际应用起来,链接数据库是必不可少的.之前用vba写过一个售书工具,正好可以拿来 ...

  3. oracle 11g odbc连接串及配置

    首先先安装HA-Instant Client-v11.2.0.3.0-x86.rar 下载地址: ftp://hhdown:2-2@58.23.131.52/download/HA-Instant%2 ...

  4. 解决ODBC连接Oracle数据库报Unable to connect SQLState=08004问题

    今天用ODBC连接Oracle数据库时,报了这么一个错“Unable to connect SQLState=08004 Oracle ODBC Ora-12154”,上网查了好久都说PowerDes ...

  5. Asp.Net通过ODBC连接Oracle数据库

    本来有个项目是通过安装Oracle client然后让asp.net引用System.Data.OracleClient来访问Oracle数据库的,但是不知道为什么老是报:ORA-12170:连接超时 ...

  6. ODBC方式操作oracle数据库

    ODBC方式操作oracle数据库 一.查询语句: var strConn = System.Configuration.ConfigurationManager.ConnectionStrings[ ...

  7. [原]php远程odbc连接sqlsvr数据库,自定义端口,命名实例的连接方式

    远程odbc连接sqlsvr数据库,自定义端口,命名实例的连接方式,默认如果不修改的话sqlsvr的端口号是1433,默认实例名就是机器名,,如果既用了命名实例,又改了默认端口,改怎么连接数据库呢? ...

  8. ODBC连接发生错误:未发现数据源名称并且未指定默认驱动程序

    程序在使用ODBC方式连接数据库时发生错误: ERROR [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序. 什么原因造成的呢? 本人使用&l ...

  9. 通过MSSQL连接服务器连接至Oracle数据库

    前言 有很多时候,我们需要MSSQL与Oracle进行跨库查询或数据交互.本篇随笔将阐述如何通过MSSQL的连接服务器连接至Oracle数据库,并且读取数据的示例. 具体步骤 首先需要到Oracle的 ...

  10. PLSQL Developer连接远程Oracle方法(非安装客户端)

    Oracle比较麻烦,通常需要安装oracle的客户端才能实现.通过instantclient可以比较简单的连接远程的Oracle. 1.新建目录D:\Oracle_Cleint用于存放相关文件,新建 ...

随机推荐

  1. DRConv:旷视提出区域感知动态卷积,多任务性能提升 | CVPR 2020

    论文提出DRConv,很好地结合了局部共享的思想并且保持平移不变性,包含两个关键结构,从实验结果来看,DRConv符合设计的预期,在多个任务上都有不错的性能提升   来源:晓飞的算法工程笔记 公众号 ...

  2. JavaScript二代公民身份证号验证

    身份证号码中的校验码是身份证号码的最后一位,是根据[中华人民共和国国家标准GB 11643-1999]中有关公民身份号码的规定, 根据精密的计算公式计算出来的,公民身份号码是特征组合码,由十七位数字本 ...

  3. #线段树,二分#洛谷 2824 [HEOI2016/TJOI2016]排序

    题目 分析 这排序就很难实现,考虑定一个基准,小于该基准的视为0,否则视为1, 那排序可以看作将0和1分开,这就很好用线段树实现了 如果该位置是0,说明这个基准太高,显然可以用二分答案(基准),那么时 ...

  4. 文档贡献与写作必读-OpenHarmony开发者文档风格指南

    在您使用OpenHarmony文档或参与OpenHarmony文档/生态内容贡献时,是否遇到过如下问题: ● 应该使用第一人称还是第二人称来写作? ● Markdown文件应该如何命名? ● 代码块及 ...

  5. .Net 代码分析工具对比 visual studio 2022 current

    目录 原因 背景知识 名词解释 分析器 分析器在IDE里 目标 查找思路及过程 CodeMaid Roslyn StyleCop.Analyzer StyleCop? StyleCop.Analyze ...

  6. 重新整理 .net core 实践篇—————应用层[三十]

    前言 简单介绍一下应用层. 正文 应用层用来做什么的呢? 应用层用来做处理api请求的. [HttpPost] public Task<long> CreateOrder([FromBod ...

  7. 老夫当年手写的js动画库

    前言 当年我学习js的时候,那时候学生时代不知道有jquery,所以手写了一些东西,留下的不多作为回忆. 正文 ``` javascript window.onload = function () { ...

  8. 我们为什么需要操作系统(Operating System)?

    我们为什么需要操作系统(Operating System)? a) 从计算机体系的角度,OS向下统筹了所有硬件资源(1),向上为所有软件提供API调用(2),使得软件程序员不必知晓硬件的具体细节,实现 ...

  9. C#的基于.net framework的Dll模块编程(一) - 编程手把手系列文章

    从此博文开始分几篇介绍C#的开发.这次讲讲C#的.net framework的Dll文件类库模块的编程方法. 对于Windows来说,要运行应用程序要基于Dll类库和Exe执行文件.对于笔者来说,模块 ...

  10. OpenYurt v1.1.0: 新增 DaemonSet 的 OTA 和 Auto 升级策略

    简介: 在 OpenYurt v1.1.0 版本中,我们提供了 Auto 和 OTA 的升级策略.Auto 的升级策略重点解决由于节点 NotReady 而导致 DaemonSet升级阻塞的问题,OT ...