C#/C++ 通過ODBC連接OceanBase Oracle租戶的詳細(xì)過程
概述
近期我們項目正處于將Oracle數(shù)據(jù)庫遷移到OceanBase Oracle租戶模式的階段??紤]到我們項目采用了C++和C#混合開發(fā),并且使用了多種技術(shù),因此存在多種數(shù)據(jù)庫連接方式。然而,針對C#連接OceanBase的案例相對較少,因此我特意記錄下這一過程。
開放數(shù)據(jù)庫互連(ODBC)是微軟公司開放服務(wù)結(jié)構(gòu)(WOSA,Windows Open Services Architecture)中有關(guān)數(shù)據(jù)庫的一個組成部分,基本思想是為用戶提供簡單、標(biāo)準(zhǔn)、透明的數(shù)據(jù)庫連接的公共編程接口,開發(fā)廠商根據(jù) ODBC 的標(biāo)準(zhǔn)去實現(xiàn)底層的驅(qū)動程序,這個驅(qū)動對用戶是透明的,并允許根據(jù)不同的 DBMS 采用不同的技術(shù)加以優(yōu)化實現(xiàn)。
驅(qū)動下載
下載地址:https://www.oceanbase.com/softwarecenter-cloud
根據(jù)平臺類型選擇驅(qū)動。

驅(qū)動配置
打開 ODBC 數(shù)據(jù)源管理員:在 Windows 中,按下 Windows鍵 + R 打開“運行”對話框,然后輸入 odbcad32 并按下 Enter 鍵,這將打開 ODBC 數(shù)據(jù)源管理員。

選擇系統(tǒng)的或用戶的數(shù)據(jù)源:在 ODBC 數(shù)據(jù)源管理員中,有兩個選項卡:用戶 DSN 和 系統(tǒng) DSN。選擇一個適合你的選項,通常建議選擇 系統(tǒng) DSN,因為它對所有用戶都可用。

添加一個新的數(shù)據(jù)源:點擊 添加 按鈕,然后在彈出的對話框中選擇 OceanBase ODBC 2.0 Driver 數(shù)據(jù)庫。

配置數(shù)據(jù)源連接信息:在配置 OceanBase 數(shù)據(jù)庫數(shù)據(jù)源時,你需要提供以下信息:
數(shù)據(jù)源名稱(DSN):為你的數(shù)據(jù)源指定一個唯一的名稱。這里命名為OceanBase ODBC
描述:提供有關(guān)此數(shù)據(jù)源的描述,以便識別它。

TNS 服務(wù)名稱:輸入你要連接的 Oracle 服務(wù)的 TNS 服務(wù)名稱。IP: XX.XX.XX.XX
用戶名和密碼:提供用于連接到 Oracle 數(shù)據(jù)庫的用戶名和密碼。
UserName: 用戶名@租戶名#集群

測試連接:在完成配置后,你可以點擊 測試連接 按鈕來驗證是否能夠成功連接到 OceanBase Oracle 數(shù)據(jù)庫。

注意:不通過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); // 假設(shè)第一列是 ID
string name = reader.GetString(1); // 假設(shè)第二列是 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();
}
}
}到此這篇關(guān)于C#/C++ 通過ODBC連接OceanBase Oracle租戶的文章就介紹到這了,更多相關(guān)C++ 連接OceanBase Oracle租戶內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中Convert.ToString和ToString的區(qū)別分析
這篇文章主要介紹了C#中Convert.ToString和ToString的區(qū)別,是C#初學(xué)者需要牢固掌握的技巧,需要的朋友可以參考下2014-08-08
C#利用SharpPcap實現(xiàn)網(wǎng)絡(luò)包捕獲嗅探
這篇文章主要為大家詳細(xì)介紹了C#利用SharpPcap實現(xiàn)網(wǎng)絡(luò)包捕獲嗅探,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
混合語言編程—C#使用原生的Directx和OpenGL繪圖的方法
本文要說的是混合C#和C/C++語言編程,在C#的Winform和WPF下使用原生的Direct和OpenGL進(jìn)行繪圖2013-09-09

