全部产品
Search
文档中心

ApsaraDB RDS:Menggunakan aplikasi untuk terhubung ke instance ApsaraDB RDS for PostgreSQL dengan Babelfish diaktifkan

更新时间:Jul 02, 2025

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

Persiapan

  1. Terhubung ke instance RDS. Untuk informasi lebih lanjut, lihat Gunakan klien untuk membuat koneksi.

  2. Buat database uji.

    create database sqlserverdb;
    Catatan

    Jika 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.

  3. 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

  1. 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

    Create a project

  2. 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. Edit the Program.cs file

  3. 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();
            }
    
        }
    }
  4. 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>
  5. Buka Command Prompt dan beralihlah ke direktori tempat proyek berada. Kemudian, jalankan perintah berikut untuk menjalankan aplikasi C#:

    cd MyAPP
    dotnet run Program.cs

    Keluaran perintah:Command output

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

  1. 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>
  2. 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:Command output

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 pyodbc

Prosedur

  1. Jalankan perintah vim untuk membuat file. Sebagai contoh, Anda dapat menjalankan perintah berikut untuk membuat file bernama main01.py.

    vim main01.py
  2. Masukkan 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")
  3. Tekan Esc untuk keluar dari mode penyisipan dan masukkan :wq untuk menyimpan dan menutup file.

  4. Jalankan perintah berikut untuk menjalankan aplikasi Python:

    python3 main01.py

    Keluaran perintah:Command output

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 -y

Prosedur

  1. Jalankan perintah vim untuk membuat file. Sebagai contoh, Anda dapat menjalankan perintah berikut untuk membuat file bernama main01.c:

    vim main01.c
  2. Masukkan 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;
    }
  3. Tekan Esc untuk keluar dari mode penyisipan dan masukkan :wq untuk menyimpan dan menutup file.

  4. Jalankan perintah berikut untuk menjalankan aplikasi C:

    gcc main01.c -lsybdb  -o main01
    ./main01

    Keluaran perintah:Command output