Topik ini menjelaskan cara menggunakan aplikasi C#, Java, Python, atau C untuk terhubung ke instance ApsaraDB RDS for PostgreSQL yang memiliki Babelfish diaktifkan melalui port Tabular Data Stream (TDS).
Prasyarat
Instance ApsaraDB RDS for PostgreSQL dengan Babelfish diaktifkan telah dibuat. Untuk informasi lebih lanjut, lihat Buat instance ApsaraDB RDS for PostgreSQL dengan Babelfish diaktifkan.
Akun Babelfish telah dibuat. Untuk informasi lebih lanjut, lihat Kelola akun Babelfish.
Daftar putih alamat IP dikonfigurasi untuk mengizinkan server tempat klien Anda berada mengakses instance RDS. Untuk informasi lebih lanjut, lihat Konfigurasikan daftar putih alamat IP.
Titik akhir dan port TDS dari instance RDS diperoleh. Untuk informasi lebih lanjut, lihat Lihat titik akhir dan port TDS.
Persiapan
Terhubung ke instance RDS. Untuk informasi lebih lanjut, lihat Gunakan klien untuk membuat koneksi.
Buat database uji.
create database sqlserverdb;CatatanJika Anda menggunakan mode migrasi Single-DB, Anda hanya dapat membuat satu database. Jika Anda telah membuat database, Anda tidak dapat membuat database lainnya. Untuk informasi lebih lanjut tentang mode migrasi, lihat Lihat status Babelfish.
Buat tabel uji.
USE sqlserverdb GO CREATE TABLE dbo.tb_test( id int not null IDENTITY(1,1) PRIMARY KEY, name varchar(50)) GO
Menggunakan aplikasi C# untuk terhubung ke instance RDS
Dalam contoh ini, aplikasi C# dikonfigurasi di sistem Windows Server. Untuk informasi lebih lanjut tentang cara mengkonfigurasi aplikasi C# di sistem operasi lain, lihat tutorial dalam dokumentasi resmi .NET.
Persiapan lingkungan
.NET 6 SDK (64-bit) telah diinstal. Untuk informasi lebih lanjut, lihat Unduh .NET.
Prosedur
Di desktop Windows Server, tekan Win+Q untuk membuka kotak pencarian, masukkan cmd, lalu tekan Enter untuk membuka Command Prompt. Kemudian, jalankan perintah berikut untuk membuat proyek:
dotnet new console -o <Nama proyek> -f net6.0
Pergi ke direktori tempat proyek berada dan edit file Program.cs.
Anda bisa mendapatkan direktori dari keluaran perintah di Langkah 1. Dalam contoh ini, direktori C:\Users\Administrator\MyApp\ digunakan.

Salin kode sampel berikut dan tempelkan kode tersebut ke dalam file Program.cs.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; namespace sample { class Program { static void Main(string[] args) { // Mengatur kredensial MSSQL SqlConnection con; // Konfigurasikan titik akhir, port TDS, nama pengguna dan kata sandi akun Babelfish, serta nama database yang digunakan untuk terhubung ke instance RDS. string conString = "Server=" + @"pgm-****.pg.rds.aliyuncs.com,1433" + ";" + "User id=" + "babelfish_user" + ";" + "Password=" + "babelfish_pwd" + ";" + "Database=" + "sqlserverdb" + ";" + "MultipleActiveResultSets=true;"; con = new SqlConnection(conString); SqlCommand cmd = new SqlCommand(); // Membuat koneksi MSSQL try { con.Open(); Console.WriteLine("Koneksi berhasil\n") ; } catch { Console.WriteLine("Tidak dapat terhubung ke database!\nSilakan periksa kredensial!"); Environment.Exit(1); } string sqlQuery = ""; // Contoh memilih nilai select_all(con); // Contoh transaksi // Masukkan nilai ke dalam tabel sampel cmd = con.CreateCommand(); SqlTransaction transaction = con.BeginTransaction("SampleTransaction"); try { sqlQuery = "insert into dbo.tb_test(name) values(@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 berhasil!\n"); } catch { transaction.Rollback(); Console.WriteLine("\nInsert gagal!\n"); } select_all(con); // Menghapus nilai yang dimasukkan sqlQuery = "delete from dbo.tb_test"; cmd = con.CreateCommand(); cmd.CommandText = sqlQuery; int row_count = cmd.ExecuteNonQuery(); // Pilih metadata // Pilih jumlah baris dari delete Console.WriteLine("\nBaris yang dihapus: " + row_count + "\n"); // Pilih nama kolom dari tabel sqlQuery = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'dbo.tb_test'"; cmd = con.CreateCommand(); cmd.CommandText = sqlQuery; SqlDataReader reader = cmd.ExecuteReader(); string value = ""; while (reader.Read()) { value += reader.GetValue(0) + " "; } Console.WriteLine(value); reader.Close(); // Menutup koneksi con.Close(); Console.WriteLine("\nKoneksi ditutup!"); } private static void select_all(SqlConnection con) { string 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()) { string value = ""; for (int i = 0; i != reader.FieldCount; i++) { value += reader.GetValue(i) + " "; } Console.WriteLine(value); } reader.Close(); } } }Pergi ke direktori tempat proyek berada dan tambahkan dependensi berikut ke file MyApp.csproj:
<ItemGroup> <PackageReference Include="System.Data.SqlClient" Version="4.8.6" /> </ItemGroup>Buka Command Prompt dan beralihlah ke direktori tempat proyek berada. Kemudian, jalankan perintah berikut untuk menjalankan aplikasi C#:
cd MyAPP dotnet run Program.csKeluaran perintah:

Menggunakan aplikasi Java untuk terhubung ke instance RDS
Dalam contoh ini, proyek Java Anda disiapkan menggunakan Maven.
Persiapan lingkungan
Java 1.8 atau versi lebih baru telah diinstal.
Prosedur
Tambahkan dependensi berikut ke file pom.xml proyek Maven Anda:
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>9.4.0.jre8</version> </dependency>Terhubung ke instance RDS melalui Java Database Connectivity (JDBC).
public class BabelfishDemo { public static Connection getRdsPgConnection(){ // Titik akhir yang digunakan untuk terhubung ke instance RDS. String rdsPgConnStr = "pgm-****.pg.rds.aliyuncs.com"; // Port TDS. String rdsPgPort = "1433"; // Nama database. String databaseName = "sqlserverdb"; // Nama pengguna akun Babelfish. String userName = "babelfish_user"; // Kata sandi akun Babelfish. String password = "babelfish_pwd"; String connectionUrl = String.format("jdbc:sqlserver://%s:%s;databaseName=%s;user=%s;password=%s;connectTimeout=600;socketTimeout=600", rdsPgConnStr, rdsPgPort, databaseName, userName, password); Connection connection = null; try{ connection = DriverManager.getConnection(connectionUrl); } catch (Exception exception) { exception.printStackTrace(); } return connection; } public static void insertRecord(String name, Connection dbConnObj){ try{ PreparedStatement stmt = dbConnObj.prepareStatement("delete from dbo.tb_test;insert into dbo.tb_test(name) values(?)"); stmt.setString(1, name); stmt.execute(); } catch (Exception exception){ exception.printStackTrace(); } } public static void queryDataRecords(Connection dbConnObj){ try (Statement stmt = dbConnObj.createStatement()) { String SQL = "select * from dbo.tb_test order by id;"; ResultSet rs = stmt.executeQuery(SQL); // Iterasi melalui data dalam set hasil dan tampilkan. while (rs.next()) { System.out.println(rs.getString("id") + " " + rs.getString("name")); } } // Tangani kesalahan apa pun yang mungkin terjadi. catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println("Demo Babelfish dimulai....."); // mendapatkan koneksi Connection dbConnObj = getRdsPgConnection(); // menulis rekaman ke db insertRecord("B", dbConnObj); // kueri data queryDataRecords(dbConnObj); System.out.println("Demo Babelfish selesai....."); } }Keluaran perintah:

Menggunakan aplikasi Python untuk terhubung ke instance RDS
Dalam contoh ini, aplikasi Python dikonfigurasi di CentOS 7.9.
Persiapan lingkungan
Dependensi yang diperlukan telah diinstal.
sudo yum install 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 install msodbcsql17.x86_64 -y
sudo yum install unixODBC-devel
sudo pip3 install pyodbcProsedur
Jalankan perintah vim untuk membuat file. Sebagai contoh, Anda dapat menjalankan perintah berikut untuk membuat file bernama main01.py.
vim main01.pyMasukkan i untuk masuk ke mode penyisipan. Salin kode sampel berikut dan tempelkan kode tersebut ke dalam file main01.py.
import sys import os import pyodbc # Konfigurasikan titik akhir, port TDS, nama pengguna dan kata sandi akun Babelfish, serta nama database yang digunakan untuk terhubung ke instance RDS. server = 'pgm-*****.pg.rds.aliyuncs.com,1433' database = 'sqlserverdb' username = 'babelfish_user' password = 'babelfish_pwd' # Mencoba membuat koneksi connection, cursor = None, None try: connection = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = connection.cursor() print("Koneksi berhasil untuk contoh pilihan!\n") except pyodbc.ProgrammingError: print("Tidak dapat terhubung ke database!\nSilakan periksa kredensial!") exit(1) sql = "insert into dbo.tb_test(name) values('A'),('B'),('C'),('D')" cursor.execute(sql) # Pilih nilai cursor.execute("select id,name from dbo.tb_test order by id") for row in cursor.fetchall(): print(row) sql = "delete from dbo.tb_test" cursor.execute(sql) cursor.close() connection.close() print("\nsukses!\n")Tekan Esc untuk keluar dari mode penyisipan dan masukkan :wq untuk menyimpan dan menutup file.
Jalankan perintah berikut untuk menjalankan aplikasi Python:
python3 main01.pyKeluaran perintah:

Menggunakan aplikasi C untuk terhubung ke instance RDS
Dalam contoh ini, aplikasi C dikonfigurasi di CentOS 7.9.
Persiapan lingkungan
Dependensi yang diperlukan telah diinstal.
sudo yum install freetds freetds-devel unixODBC-devel -yProsedur
Jalankan perintah vim untuk membuat file. Sebagai contoh, Anda dapat menjalankan perintah berikut untuk membuat file bernama main01.c:
vim main01.cMasukkan i untuk masuk ke mode penyisipan. Salin kode sampel berikut dan tempelkan kode tersebut ke dalam file 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" // Nama database. #define UID "babelfish_user" // Nama pengguna akun Babelfish. #define PWD "babelfish_pwd" // Kata sandi akun Babelfish. #define DBSERVER "pgm-*****.pg.rds.aliyuncs.com" // Titik akhir yang digunakan untuk terhubung ke instance RDS. #define TDSPORT 1433 /* handler dari pesan dari server */ static int msg_handler(DBPROCESS* dbproc, DBINT msgno, int msgstate, int severity, char *msgtext, char *srvname, char *procname, int line) { /* kesalahan reguler ditangani oleh penanganan kesalahan */ if (severity < 11) fprintf(stderr, "Pesan server (tingkat keparahan %d): %s\n", severity, msgtext); return 0; } /* penanganan kesalahan */ static int err_handler(DBPROCESS* dbproc, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr) { fprintf(stderr, "Kesalahan server %d: %s\n", dberr, dberrstr); if (oserr != 0) fprintf(stderr, "Disebabkan oleh kesalahan sistem %d: %s\n", oserr, oserrstr); return INT_CANCEL; } int main(void) { LOGINREC *login; DBPROCESS *dbconn; char hostname[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, "Tidak dapat menginisialisasi db.\n"); return 1; } /* Alokasikan struktur parameter login */ if ((login = dblogin()) == FAIL) { fprintf(stderr, "Tidak dapat menginisialisasi struktur dblogin().\n"); return 2; } /* Inisialisasi parameter login dalam struktur */ DBSETLUSER(login, UID); DBSETLPWD(login, PWD); if (gethostname(hostname, max_len) == 0) { DBSETLHOST(login, hostname); fprintf(stderr, "Mengatur nama host login: %s\n", hostname); } /* port hanya dapat diatur melalui variabel lingkungan */ rc = snprintf(portstr, 20, "TDSPORT=%d", TDSPORT); if (rc < 0 || rc >= 20) { fprintf(stderr, "kesalahan menyusun string untuk variabel lingkungan TDSPORT\n"); return 0; } if (putenv(portstr) != 0) { fprintf(stderr, "kesalahan mengatur variabel lingkungan TDSPORT\n"); return 0; } /* instal penanganan kesalahan */ dberrhandle(err_handler); dbmsghandle(msg_handler); /* Sekarang terhubung ke Server DB */ if ((dbconn = dbopen(login, DBSERVER)) == NULL) { fprintf(stderr, "Tidak dapat terhubung ke Server DB: %s\n", DBSERVER); return 3; } /* Gunakan database yang ingin Anda operasikan */ if (dbuse(dbconn, DBNAME) == FAIL) { fprintf(stderr, "Tidak dapat menggunakan database: %s\n", DBNAME); return 4; } /* Persiapkan sql */ snprintf(sql, 65535, "insert into dbo.tb_test(name) values('A'),('B'),('C'),('D')"); if (dbcmd(dbconn, sql) == FAIL) { fprintf(stderr, "Tidak dapat menyiapkan sql: %s\n", sql); return 5; } /* Eksekusi sql */ if (dbsqlexec(dbconn) == FAIL) { fprintf(stderr, "Tidak dapat mengeksekusi sql: %s\n", sql); return 6; } /* Evaluasi hasil eksekusi sql */ if (dbresults(dbconn) != SUCCEED) { fprintf(stderr, "Tidak dapat mengeksekusi sql: %s\n", sql); return 7; } /* Persiapkan sql */ snprintf(sql, 65535, "select id,name from dbo.tb_test order by id"); if (dbcmd(dbconn, sql) == FAIL) { fprintf(stderr, "Tidak dapat menyiapkan sql: %s\n", sql); return 8; } /* Eksekusi sql */ if (dbsqlexec(dbconn) == FAIL) { fprintf(stderr, "Tidak dapat mengeksekusi sql: %s\n", sql); return 9; } /* Ambil hasil eksekusi sql */ int retcode; char id[65535]; char name[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); while (dbnextrow(dbconn) != NO_MORE_ROWS) { printf("id: %s, name: %s\n", id, name); } } else { fprintf(stderr, "Tidak dapat mengambil hasil untuk sql: %s\n", sql); return 10; } /* Persiapkan sql */ snprintf(sql, 65535, "delete from dbo.tb_test"); if (dbcmd(dbconn, sql) == FAIL) { fprintf(stderr, "Tidak dapat menyiapkan sql: %s\n", sql); return 11; } /* Eksekusi sql */ if (dbsqlexec(dbconn) == FAIL) { fprintf(stderr, "Tidak dapat mengeksekusi sql: %s\n", sql); return 12; } /* Evaluasi hasil eksekusi sql */ if (dbresults(dbconn) != SUCCEED) { fprintf(stderr, "Tidak dapat mengeksekusi sql: %s\n", sql); return 13; } /* Tutup koneksi */ dbclose(dbconn); printf("sukses\n"); return 0; }Tekan Esc untuk keluar dari mode penyisipan dan masukkan :wq untuk menyimpan dan menutup file.
Jalankan perintah berikut untuk menjalankan aplikasi C:
gcc main01.c -lsybdb -o main01 ./main01Keluaran perintah:
