このトピックでは、C# 、Java、Python、またはCアプリケーションを使用して、Tabular Data Stream (TDS) ポートを介してBabelfishが有効になっているApsaraDB RDS for PostgreSQLインスタンスに接続する方法について説明します。
前提条件
- Babelfishが有効になっているApsaraDB RDS for PostgreSQLインスタンスが作成されます。 詳細については、「Babelfishが有効になっているApsaraDB RDS For PostgreSQLインスタンスの作成」をご参照ください。
- Babelfishアカウントが作成されます。 詳細については、「Babelfishアカウントの管理」をご参照ください。
- ホワイトリストは、クライアントが存在するサーバーがRDSインスタンスにアクセスできるように設定されています。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのIPアドレスホワイトリストの設定」をご参照ください。
- RDSインスタンスのエンドポイントとTDSポートが取得されます。 詳細については、「エンドポイントとTDSポートの表示」をご参照ください。
準備
- RDSインスタンスに接続します。 詳細については、「クライアントを使用した接続の確立」をご参照ください。
- テストデータベースを作成します。
データベースsqlserverdbを作成します。
説明 Single-DB移行モードを使用する場合、作成できるデータベースは1つだけです。 データベースを作成した場合、別のデータベースを作成することはできません。 移行モードの詳細については、「Babelfishのステータスの表示」をご参照ください。 - テストテーブルを作成します。
USE sqlserverdb GO CREATE TABLE dbo.tb_test ( id int not null IDENTITY(1,1) PRIMARY KEY, 名前varchar (50) GO
C# アプリケーションを使用してRDSインスタンスに接続する
この例では、C# アプリケーションはWindows Serverシステムで構成されています。 他のオペレーティングシステムでC# アプリケーションを構成する方法の詳細については、公式のチュートリアルを参照してください。NETdocumentation
環境準備
. NET 6 SDK (64ビット) がインストールされています。 詳細は、ダウンロードをご参照ください。. NET手順
- Windows Serverデスクトップで、Win + Qキーを押して検索ボックスを開き、cmdと入力し、enterキーを押してコマンドプロンプトを開きます。 次に、次のコマンドを実行してプロジェクトを作成します。
dotnet new console -o <プロジェクトの名前> -f net6.0
- プロジェクトが存在するディレクトリに移動し、Program.csファイルを編集します。 ディレクトリは、手順1のコマンド出力から取得できます。 この例では、C:\Users\Administrator\MyApp\ ディレクトリが使用されています。
- 次のサンプルコードをコピーして、Program.csファイルに貼り付けます。
システムを使用して; System.Collections.Generic; の使用 System.Linqを使用する。System.Textを使用する。System.Threading.Tasksを使用します。System.Data.SqlClientを使用する。名前空間のサンプル { class Program { static void Main(string[] args) { // MSSQL資格情報の設定 SqlConnection con; // エンドポイント、TDSポート、Babelfishアカウントのユーザー名とパスワード、およびRDSインスタンスへの接続に使用されるデータベースの名前を設定します。 string conString = "Server=" + @ "pgm-**** .pg.rds.aliyuncs.com、1433" + ";" + "User id=" + "babelfish_user" + ";" + "Password=" + "babelfish_pwd" + ";" + "Database=" + "sqlserverdb" + ";" + "MultipleActiveResultSets=true;"; con=新しいSqlConnection(conString); SqlCommand cmd=新しいSqlCommand(); // MSSQL接続の作成 try { con. オープン (); Console.WriteLine("Connection established\n") ; } キャッチ { Console.WriteLine("データベースに接続できません!\n資格情報を確認してください!"); 環境終了 (1); } 文字列sqlQuery = ""; // 値の選択例 select_all(con); // トランザクションの例 // サンプルテーブルに値を挿入する cmd = con.CreateCommand(); SqlTransaction transaction = con.BeginTransaction("SampleTransaction"); try { sqlQuery = "dbo.tb_test(name) 値 (@ name) に挿入する"; cmd.CommandType = System.Data.CommandType.Text; cmd.CommandText = sqlQuery; cmd.Transaction = transaction; cmd.Parameters.AddWithValue("@ name", "A"); cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@ name", "B"); cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@ name", "C"); cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@ name", "D"); cmd.ExecuteNonQuery(); transaction.Commit(); Console.WriteLine("\nInsert successful!\n"); } キャッチ { トランザクションRollback(); Console.WriteLine("\nInsert failed!\n"); } select_all(con); // 挿入された値の削除 sqlQuery = "dbo.tb_testから削除"; cmd = con.CreateCommand(); cmd.CommandText = sqlQuery; int row_count = cmd.ExecuteNonQuery(); // メタデータの選択 // 削除から行数を選択する Console.WriteLine("\nDeleted rows: " + row_count + "\n"); // テーブルから列名を選択する sqlQuery = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'dbo.tb_test '"; cmd = con.CreateCommand(); cmd.CommandText = sqlQuery; SqlDataReader reader = cmd.ExecuteReader(); 文字列値=""; while (reader.Read()) { value += reader.GetValue(0) + ""; } Console.WriteLine (値); リーダー。閉じる (); // 接続を閉じる con. 閉じる (); Console.WriteLine("\nConnection closed!"); } プライベート静的void select_all(SqlConnection con) { 文字列sqlQuery = "select id,name from dbo.tb_test order by id"; SqlCommand cmd = con.CreateCommand(); cmd.CommandText = sqlQuery; SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { 文字列値=""; for (int i = 0; i != reader.FieldCount; i ++) { value += reader.GetValue(i) + ""; } Console.WriteLine (値); } リーダー。閉じる (); } } }
- プロジェクトが存在するディレクトリに移動し、次の依存関係をMyApp.csprojファイルに追加します。
<ItemGroup> <PackageReference Include="System.Data.SqlClient" バージョン="4.8.3" /> </ItemGroup>
- コマンドプロンプトを開き、プロジェクトが存在するディレクトリに切り替えます。 次に、次のコマンドを実行してC# アプリケーションを実行します。
cd MyAPP dotnet run Program.cs
コマンド出力:
Javaアプリケーションを使用してRDSインスタンスに接続する
この例では、JavaプロジェクトはMavenを使用してセットアップされます。
環境準備
Java 1.8以降がインストールされています。
手順
- Mavenプロジェクトのpom.xmlファイルに次の依存関係を追加します。
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>9.4.0.jre8</version> </dependency>
- Java Database Connectivity (JDBC) 経由でRDSインスタンスに接続します。
パブリッククラスBabelfishDemo { パブリック静的接続getRdsPgConnection(){ // RDSインスタンスへの接続に使用されるエンドポイント。 文字列rdsPgConnStr = "pgm-**** .pg.rds.aliyuncs.com"; // TDSポート。 文字列rdsPgPort = "1433"; // データベースの名前。 文字列databaseName = "sqlserverdb"; // Babelfishアカウントのユーザー名。 文字列userName = "babelfish_user"; // Babelfishアカウントのパスワード。 文字列パスワード="babelfish_pwd"; String connectionUrl = String.format("jdbc:sqlserver:// % s:% s;databaseName=% s;user=% s;password=% s;connectTimeout=600;socketTimeout=600", rdsPgConnStr, rdsPgPort, databaseName, userName, パスワード); Connection connection = null; try{ connection = DriverManager.getConnection(connectionUrl); } catch (例外例外) { exception.printStackTrace(); } リターン接続; } public static void insertRecord(String name, Connection dbConnObj){ try{ PreparedStatement stmt = dbConnObj.prepareStatement("dbo.tb_testから削除; dbo.tb_test(name) values(?)" に挿入); stmt.setString(1, name); stmt.execute(); } catch (例外) { exception.printStackTrace(); } } public static void queryDataRecords (接続dbConnObj){ try (Statement stmt = dbConnObj.createStatement()) { 文字列SQL = "select * from dbo.tb_test order by id;"; ResultSet rs = stmt.exe cuteQuery(SQL); // 結果セットのデータを繰り返して表示します。 while (rs.next()) { System.out.println(rs.getString("id") + "" rs.getString("name")); } } // 発生した可能性のあるエラーを処理します。 catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println("Babelfish Demo startd ....."); // 接続を取得 接続dbConnObj = getRdsPgConnection(); // dbにレコードを書き込む insertRecord("B" 、dbConnObj); // データの照会 queryDataRecords(dbConnObj); System.out.println("Babelfish Demo Touchdown ....."); } }
コマンド出力:
Pythonアプリケーションを使用してRDSインスタンスに接続する
この例では、PythonアプリケーションはCentOS 7.9で構成されています。
環境準備
必要な依存関係がインストールされます。
sudo yumインストールgcc gcc-c ++ -y
sudo wget https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo rpm -ivh packages-microsoft-prod.rpm
sudo yumインストールmsodbcsql17.x86_64 -y
sudo pip3インストールpyodbc
手順
- vimコマンドを実行してファイルを作成します。 たとえば、次のコマンドを実行して、main01.pyという名前のファイルを作成できます。
vim main01.py
- iを入力して挿入モードに入ります。 次のサンプルコードをコピーしてmain01.pyファイルに貼り付けます。
import sys osのインポート pyodbcをインポートする # エンドポイント、TDSポート、Babelfishアカウントのユーザー名とパスワード、およびRDSインスタンスへの接続に使用されるデータベースの名前を設定します。 server = 'pgm-***** .pg.rds.aliyuncs.com,1433' database = 'sqlserverdb' username = 'babelfish_user' password = 'babelfish_pwd' # 接続を確立しようとしています connection, cursor=なし, なし トライ: connection = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+ server +';DATABASE='+ database +';UID='+ username +';PWD='+ password) cursor = connection.cursor() プリント (「選択例の接続確立!\n」) pyodbc.ProgrammingErrorを除く: print (「データベースに接続できません!\n資格情報を確認してください! 」) exit(1) sql = "insert into dbo.tb_test(name) 値 ('A') 、('B') 、('C') 、('D')" cursor.exeかわいい (sql) # 値を選択する cursor.exe cute("select id,name from dbo.tb_test order by id") cursor.fetchall() の行のために: プリント (行) sql = "dbo.tb_testから削除" cursor.exeかわいい (sql) cursor.close() connection.close() プリント ("\n success!\n")
- Escを押して挿入モードを終了し、:wqと入力してファイルを保存して閉じます。
- 次のコマンドを実行して、Pythonアプリケーションを実行します。
python3 main01.py
コマンド出力:
Cアプリケーションを使用してRDSインスタンスに接続する
この例では、CアプリケーションはCentOS 7.9で構成されています。
環境準備
必要な依存関係がインストールされます。
sudo yum install freetds freetds-devel unixODBC-devel -y
手順
- vimコマンドを実行してファイルを作成します。 たとえば、次のコマンドを実行して、main01.cという名前のファイルを作成できます。
vim main01.c
- iを入力して挿入モードに入ります。 次のサンプルコードをコピーして、main01.cファイルに貼り付けます。
#include <stdio.h> # include <stdlib.h> # include <unistd.h> # include <sys/param.h> # include <sybfront.h> # include <sybdb.h> # include <syberror.h> # define DBNAME "sqlserverdb" // データベースの名前。 # define UID "babelfish_user" // Babelfishアカウントのユーザー名。 # define PWD "babelfish_pwd" // Babelfishアカウントのパスワード。 # define DBSERVER "pgm-***** .pg.rds.aliyuncs.com" // RDSインスタンスへの接続に使用されるエンドポイント。 # define TDSPORT 1433 /* サーバーからのメッセージからのハンドラー * / 静的int msg_handler(DBPROCESS * dbproc, DBINT msgno, int msgstate, int severity, char * msgtext, char * srvname, char * procname, int line) { /* 通常のエラーはエラーハンドラーによって処理されます * / if (重大度 <11) fprintf(stderr, "サーバーメッセージ (重大度 % d): % s\n", 重大度, msgtext); 0を返します。} /* error handler * / static int err_handler(DBPROCESS * dbproc, int severity, int dberr, int oserr, char * dberrstr, char * oserrstr) { fprintf(stderr, "サーバーエラー % d: % s\n", dberr, dberrstr); if (oserr != 0) fprintf(stderr、"システムエラーの原因 % d: % s\n" 、oserr、oserrstr); INT_CANCELを返します。} int main(void) { LOGINREC * ログイン; DBPROCESS * dbconn; charホスト名 [MAXHOSTNAMELEN]; int max_len = MAXHOSTNAMELEN; DBCHAR accession[10]; DBCHARのexamdesc[10]; DBCHARのexamcode[255]; char portstr[20]; int rc; char sql[65535]; if (dbinit() == FAIL) { fprintf(stderr、"Could not init db.\n"); return 1; } /* ログインパラメーター構造を割り当てる * / if ((login = dblogin()) == FAIL) { fprintf(stderr, "dblogin() 構造体を初期化できませんでした。\n"); リターン2; } /* 構造内のログインパラメーターを初期化する * / DBSETLUSER (ログイン、UID); DBSETLPWD (ログイン、PWD); if (gethostname(hostname, max_len) == 0) { DBSETLHOST (ログイン、ホスト名); fprintf(stderr, "setting login hostname: % s\n", hostname); } /* ポートは環境変数を介してのみ設定できます * / rc = snprintf(portstr, 20, "TDSPORT=% d", TDSPORT); if (rc < 0 | | rc >= 20) { fprintf(stderr、"環境変数TDSPORT\nのエラー構成文字列"); return 0; } if (putenv(portstr))! =0) { fprintf(stderr, "エラー設定TDSPORT環境変数 \n"); return 0; } /* エラーハンドラのインストール * / dberrhandle(err_handler); dbmsghandle(msg_handler); /* DBサーバーに接続する * / if ((dbconn = dbopen(login, DBSERVER)) == NULL) { fprintf(stderr, "DBサーバーに接続できませんでした: % s\n", DBSERVER); リターン3; } /* 操作したいデータベースを使用する * / if (dbuse(dbconn, DBNAME) == FAIL) { fprintf(stderr, "データベースを使用できませんでした: % s\n", DBNAME); リターン4; } /* sqlを準備する * / snprintf(sql、65535、"dbo.tb_test(name) に挿入する値 ('A') 、('B') 、('C') 、('D')"); if (dbcmd(dbconn, sql) == FAIL) { fprintf(stderr, "Could not prepare sql: % s\n", sql); リターン5; } /* sqlを実行 * / if (dbsqlexec(dbconn) == FAIL) { fprintf(stderr, "Could not execute sql: % s\n", sql); 戻り6; } /* Judge sql execute result * / if (dbresults(dbconn))! =成功) { fprintf(stderr, "Could not execute sql: % s\n", sql); 7を返す。 } /* sqlを準備する * / snprintf(sql、65535、"select id,name from dbo.tb_test order by id"); if (dbcmd(dbconn, sql) == FAIL) { fprintf(stderr, "Could not prepare sql: % s\n", sql); リターン8; } /* sqlを実行 * / if (dbsqlexec(dbconn) == FAIL) { fprintf(stderr, "Could not execute sql: % s\n", sql); 9を返す。 } /* フェッチsql execute result * / int retcode; char id[65535]; char名 [65535]; if ((retcode = dbresults(dbconn)) ! =NO_MORE_RESULTS && retcode == SUCCEED) { dbbind(dbconn, 1, CHARBIND, (DBCHAR)0, (BYTE *)id); dbbind(dbconn, 2, CHARBIND, (DBCHAR)0, (BYTE *)name); (dbnextrow(dbconn))! =NO_MORE_ROWS) { printf("id: % s, name: % s\n", id, name); } } else { fprintf(stderr, "sqlの結果を取得できませんでした: % s\n", sql); 10を返す。 } /* sqlを準備する * / snprintf(sql、65535、"dbo.tb_testから削除"); if (dbcmd(dbconn, sql) == FAIL) { fprintf(stderr, "Could not prepare sql: % s\n", sql); 11を返す。 } /* sqlを実行 * / if (dbsqlexec(dbconn) == FAIL) { fprintf(stderr, "Could not execute sql: % s\n", sql); リターン12; } /* Judge sql execute result * / if (dbresults(dbconn))! =成功) { fprintf(stderr, "Could not execute sql: % s\n", sql); 13を返す。 } /* 接続を閉じる * / dbclose(dbconn); printf("success\n"); 0を返します。}
- Escを押して挿入モードを終了し、:wqと入力してファイルを保存して閉じます。
- 次のコマンドを実行して、Cアプリケーションを実行します。
gcc main01.c -lsybdb -o main01 ./main01
コマンド出力: