Baca dalam bahasa Inggris

Bagikan melalui


Parameter untuk Odbc.DataSource

Fungsi Odbc.DataSource mengambil dua parameter—untuk connectionString driver Anda, dan options catatan yang memungkinkan Anda mengambil alih berbagai perilaku driver. Melalui rekaman opsi, Anda dapat mengambil alih kemampuan dan informasi lain yang dilaporkan oleh driver, mengontrol perilaku navigator, dan memengaruhi kueri SQL yang dihasilkan oleh mesin M.

Bidang rekaman opsi yang didukung termasuk dalam dua kategori—bidang yang bersifat publik dan selalu tersedia, dan yang hanya tersedia dalam konteks ekstensibilitas.

Tabel berikut ini menjelaskan bidang publik dalam rekaman opsi.

Bidang Deskripsi
CommandTimeout Nilai durasi yang mengontrol berapa lama kueri sisi server diizinkan untuk dijalankan sebelum dibatalkan.

Default: 10 menit
ConnectionTimeout Nilai durasi yang mengontrol berapa lama menunggu sebelum meninggalkan upaya untuk membuat koneksi ke server.

Default: 15 detik
CreateNavigationProperties Nilai logis yang mengatur apakah akan menghasilkan properti navigasi pada tabel yang dikembalikan. Properti navigasi didasarkan pada hubungan kunci asing yang dilaporkan oleh driver. Properti ini muncul sebagai kolom "virtual" yang dapat diperluas di editor kueri, membuat gabungan yang sesuai.

Jika menghitung dependensi kunci asing adalah operasi mahal untuk driver Anda, Anda mungkin ingin mengatur nilai ini ke false.

Default: true
HierarchicalNavigation Nilai logis yang mengatur apakah akan menampilkan tabel yang dikelompokkan menurut nama skemanya. Saat diatur ke false, tabel ditampilkan dalam daftar datar di bawah setiap database.

Default: false
SqlCompatibleWindowsAuth Nilai logis yang menentukan apakah akan menghasilkan string koneksi yang kompatibel dengan SQL Server saat menggunakan Autentikasi Windows—Trusted_Connection=Yes.

Jika driver Anda mendukung Autentikasi Windows, tetapi memerlukan pengaturan tambahan atau alternatif di string koneksi Anda, Anda harus mengatur nilai ini ke false dan menggunakan CredentialConnectionString bidang rekaman opsi yang dijelaskan dalam tabel berikutnya.

Default: true

Tabel berikut ini menjelaskan bidang rekaman opsi yang hanya tersedia melalui ekstensibilitas. Bidang yang bukan nilai literal sederhana dijelaskan di bagian selanjutnya.

Bidang Deskripsi
AstVisitor Rekaman yang berisi satu atau beberapa penimpaan untuk mengontrol pembuatan kueri SQL. Penggunaan paling umum dari bidang ini adalah menyediakan logika untuk menghasilkan klausul LIMIT/OFFSET untuk driver yang tidak mendukung TOP.

Bidang mencakup Constant dan LimitClause.

Informasi selengkapnya: Mengambil alih AstVisitor
CancelQueryExplicitly Nilai logis yang menginstruksikan mesin M untuk secara eksplisit membatalkan panggilan yang sedang berjalan melalui driver ODBC sebelum mengakhiri koneksi ke server ODBC.

Bidang ini berguna dalam situasi di mana eksekusi kueri dikelola secara independen dari koneksi jaringan ke server, misalnya dalam beberapa penyebaran Spark. Dalam kebanyakan kasus, nilai ini tidak perlu diatur karena kueri di server dibatalkan ketika koneksi jaringan ke server dihentikan.

Default: false
ClientConnectionPooling Nilai logis yang memungkinkan pengumpulan koneksi sisi klien untuk driver ODBC. Sebagian besar driver ingin mengatur nilai ini ke true.

Default: false
CredentialConnectionString Nilai teks atau rekaman yang digunakan untuk menentukan properti string koneksi terkait kredensial.
HideNativeQuery Nilai logis yang mengontrol apakah konektor memperlihatkan pernyataan SQL yang dihasilkan dalam pengalaman pengguna Power Query atau tidak. Ini hanya boleh diatur ke true jika sumber data back end secara asli mendukung SQL-92.

Default: false
ImplicitTypeConversions Nilai tabel yang berisi konversi jenis implisit yang didukung oleh driver atau server backend Anda. Nilai dalam tabel ini bersifat tambahan untuk konversi yang dilaporkan oleh driver itu sendiri.

Bidang ini biasanya digunakan dengan SQLGetTypeInfo bidang saat menimpa informasi jenis data yang dilaporkan oleh driver.
OnError Fungsi penanganan kesalahan yang menerima errorRecord parameter jenis record.

Penggunaan umum fungsi ini termasuk menangani kegagalan koneksi SSL, menyediakan tautan unduhan jika driver Anda tidak ditemukan di sistem, dan melaporkan kesalahan autentikasi.
SoftNumbers Memungkinkan mesin M memilih jenis data yang kompatibel saat konversi antara dua jenis numerik tertentu tidak dinyatakan sebagai didukung dalam kemampuan SQL_CONVERT_*.

Default: false
SqlCapabilities Catatan yang menyediakan berbagai penimpaan kemampuan driver, dan cara untuk menentukan kemampuan yang tidak diekspresikan melalui ODBC 3.8.

Informasi selengkapnya: Mengesampingkan SqlCapabilities
SQLColumns Fungsi yang memungkinkan Anda mengubah metadata kolom yang SQLColumns dikembalikan oleh fungsi .

Informasi selengkapnya: Mengambil alih SQLColumns
SQLGetFunctions Rekaman yang memungkinkan Anda mengambil alih nilai yang dikembalikan oleh panggilan ke SQLGetFunctions.

Penggunaan umum bidang ini adalah untuk menonaktifkan penggunaan pengikatan parameter, atau untuk menentukan bahwa kueri yang dihasilkan harus menggunakan CAST daripada CONVERT.

Informasi selengkapnya: Mengesampingkan SQLGetFunctions
SQLGetInfo Rekaman yang memungkinkan Anda mengambil alih nilai yang dikembalikan oleh panggilan ke SQLGetInfo.

Informasi selengkapnya: Mengesampingkan SQLGetInfo
SQLGetTypeInfo Tabel atau fungsi yang mengembalikan tabel yang mengambil alih informasi jenis yang dikembalikan oleh SQLGetTypeInfo.

Ketika nilai diatur ke tabel, nilai sepenuhnya menggantikan informasi jenis yang dilaporkan oleh driver. SQLGetTypeInfo tidak akan dipanggil.

Ketika nilai diatur ke fungsi, fungsi Anda akan menerima hasil panggilan asli ke SQLGetTypeInfo, yang memungkinkan Anda mengubah tabel.

Bidang ini biasanya digunakan ketika ada ketidakcocokan antara jenis data yang dilaporkan oleh SQLGetTypeInfo dan SQLColumns.

Informasi selengkapnya: Mengambil alih SQLGetTypeInfo
SQLTables Fungsi yang memungkinkan Anda mengubah metadata tabel yang dikembalikan oleh panggilan ke SQLTables.
TolerateConcatOverflow Memungkinkan perangkaian nilai teks terjadi bahkan jika hasilnya mungkin dipotong agar pas dalam rentang jenis yang tersedia.

Misalnya, saat menggabungkan bidang VARCHAR(4000) dengan bidang VARCHAR(4000) pada sistem yang mendukung ukuran VARCHAR maksimal 4000 dan tanpa jenis CLOB, perangkaian dilipat meskipun hasilnya mungkin terpotong.

Default: false
UseEmbeddedDriver (penggunaan internal): Nilai logis yang mengontrol apakah driver ODBC harus dimuat dari direktori lokal (menggunakan fungsionalitas baru yang ditentukan dalam spesifikasi ODBC 4.0). Nilai ini umumnya hanya diatur oleh konektor yang dibuat oleh Microsoft yang dikirim dengan Power Query.

Ketika diatur ke false, manajer driver ODBC sistem digunakan untuk menemukan dan memuat driver.

Sebagian besar konektor tidak perlu mengatur bidang ini.

Default: false

Mengesampingkan AstVisitor

Bidang AstVisitor diatur melalui catatan opsi Odbc.DataSource . Ini digunakan untuk memodifikasi pernyataan SQL yang dihasilkan untuk skenario kueri tertentu.

Catatan

Driver yang mendukung klausul LIMIT dan OFFSET (bukan TOP) ingin memberikan LimitClause penimpaan untuk AstVisitor.

Terus-menerus

Memberikan penimpaan untuk nilai ini telah ditolak dan dapat dihapus dari implementasi di masa mendatang.

LimitClause

Bidang ini adalah fungsi yang menerima dua Int64.Type argumen (skip, take), dan mengembalikan rekaman dengan dua bidang teks (Text, Location).

LimitClause = (skip as nullable number, take as number) as record => ...

Parameter skip adalah jumlah baris yang akan dilewati (yaitu, argumen ke OFFSET). Jika offset tidak ditentukan, nilai lewati akan null. Jika driver Anda mendukung LIMIT, tetapi tidak mendukung OFFSET, LimitClause fungsi harus mengembalikan kesalahan yang tidak diimpikan (...) saat melewati lebih besar dari 0.

Parameter take adalah jumlah baris yang akan diambil (yaitu, argumen ke LIMIT).

Bidang Text hasil berisi teks SQL untuk ditambahkan ke kueri yang dihasilkan.

Bidang Location menentukan tempat menyisipkan klausa. Tabel berikut ini menjelaskan nilai yang didukung.

Nilai Deskripsi Contoh
AfterQuerySpecification Klausa LIMIT diletakkan di akhir SQL yang dihasilkan.

Ini adalah sintaks LIMIT yang paling umum didukung.
SELECT a, b, c

Tabel FROM

> DI MANA 10

BATAS 5
BeforeQuerySpecification Klausa LIMIT dimasukkan sebelum pernyataan SQL yang dihasilkan. BATAS 5 BARIS

SELECT a, b, c

Tabel FROM

> DI MANA 10
AfterSelect LIMIT mengejar pernyataan SELECT, dan setelah pengubah apa pun (seperti DISTINCT). PILIH BATAS BERBEDA 5 a, b, c

Tabel FROM

> DI MANA 10
AfterSelectBeforeModifiers LIMIT mengejar pernyataan SELECT, tetapi sebelum pengubah apa pun (seperti DISTINCT). PILIH BATAS 5 BERBEDA a, b, c

Tabel FROM

> DI MANA 10

Cuplikan kode berikut menyediakan implementasi LimitClause untuk driver yang mengharapkan klausul LIMIT, dengan OFFSET opsional, dalam format berikut: [OFFSET <offset> ROWS] LIMIT <row_count>

LimitClause = (skip, take) =>
    let
        offset = if (skip > 0) then Text.Format("OFFSET #{0} ROWS", {skip}) else "",
        limit = if (take <> null) then Text.Format("LIMIT #{0}", {take}) else ""
    in
        [
            Text = Text.Format("#{0} #{1}", {offset, limit}),
            Location = "AfterQuerySpecification"
        ]

Cuplikan kode berikut menyediakan LimitClause implementasi untuk driver yang mendukung LIMIT, tetapi tidak OFFSET. Format: LIMIT <row_count>.

LimitClause = (skip, take) =>
    if (skip > 0) then error "Skip/Offset not supported"
    else
    [
        Text = Text.Format("LIMIT #{0}", {take}),
        Location = "AfterQuerySpecification"
    ]

Mengambil alih SqlCapabilities

Bidang Detail
FractionalSecondsScale Nilai angka mulai dari 1 hingga 7 yang menunjukkan jumlah tempat desimal yang didukung untuk nilai milidetik. Nilai ini harus diatur oleh konektor yang ingin mengaktifkan pelipatan kueri selama nilai tanggalwaktu.

Default: null
PrepareStatements Nilai logis yang menunjukkan bahwa pernyataan harus disiapkan menggunakan SQLPrepare.

Default: false
SupportsTop Nilai logis yang menunjukkan driver mendukung klausul TOP untuk membatasi jumlah baris yang dikembalikan.

Default: false
StringLiteralEscapeCharacters Daftar nilai teks yang menentukan karakter yang akan digunakan saat melarikan diri dari literal string dan ekspresi LIKE.

Contoh: {""}

Default: null
SupportsDerivedTable Nilai logis yang menunjukkan driver mendukung tabel turunan (sub-pilih).

Nilai ini diasumsikan benar untuk driver yang mengatur tingkat kesamaan mereka ke SQL_SC_SQL92_FULL (dilaporkan oleh driver atau ditimpa dengan pengaturan Sql92Conformance. Untuk semua tingkat kesuaian lainnya, nilai ini default ke false.

Jika driver Anda tidak melaporkan tingkat kepatuhan SQL_SC_SQL92_FULL, tetapi melakukan tabel turunan dukungan, atur nilai ini ke true.

Mendukung tabel turunan diperlukan untuk banyak skenario DirectQuery.
SupportsNumericLiterals Nilai logis yang menunjukkan apakah SQL yang dihasilkan harus menyertakan nilai literal numerik. Ketika diatur ke false, nilai numerik selalu ditentukan menggunakan pengikatan parameter.

Default: false
SupportsStringLiterals Nilai logis yang menunjukkan apakah SQL yang dihasilkan harus menyertakan nilai literal string. Saat diatur ke false, nilai string selalu ditentukan menggunakan pengikatan parameter.

Default: false
SupportsOdbcDateLiterals Nilai logis yang menunjukkan apakah SQL yang dihasilkan harus menyertakan nilai literal tanggal. Saat diatur ke false, nilai tanggal selalu ditentukan menggunakan pengikatan parameter.

Default: false
SupportsOdbcTimeLiterals Nilai logis yang menunjukkan apakah SQL yang dihasilkan harus menyertakan nilai literal waktu. Saat diatur ke false, nilai waktu selalu ditentukan menggunakan pengikatan parameter.

Default: false
SupportsOdbcTimestampLiterals Nilai logis yang menunjukkan apakah SQL yang dihasilkan harus menyertakan nilai literal tanda waktu. Saat diatur ke false, nilai tanda waktu selalu ditentukan menggunakan pengikatan parameter.

Default: false

Mengambil alih SQLColumns

SQLColumns adalah handler fungsi yang menerima hasil panggilan ODBC ke SQLColumns. Parameter sumber berisi tabel dengan informasi jenis data. Penimpaan ini biasanya digunakan untuk memperbaiki ketidakcocokan jenis data antara panggilan ke SQLGetTypeInfo dan SQLColumns.

Untuk detail format parameter tabel sumber, buka Fungsi SQLColumns.

Mengambil alih SQLGetFunctions

Bidang ini digunakan untuk mengambil alih SQLFunctions nilai yang dikembalikan oleh driver ODBC. Ini berisi rekaman yang nama bidangnya sama dengan FunctionId konstanta yang ditentukan untuk fungsi ODBC SQLGetFunctions . Konstanta numerik untuk masing-masing bidang ini dapat ditemukan dalam spesifikasi ODBC.

Bidang Detail
SQL_CONVERT_FUNCTIONS Menunjukkan fungsi mana yang didukung saat melakukan konversi jenis. Secara default, Mesin M mencoba menggunakan fungsi CONVERT. Driver yang lebih memilih penggunaan CAST dapat mengambil alih nilai ini untuk melaporkan bahwa hanya SQL_FN_CVT_CAST (nilai numerik 0x2) yang didukung.
SQL_API_SQLBINDCOL Nilai logis (true/false) yang menunjukkan apakah mesin mashup harus menggunakan API SQLBindCol saat mengambil data. Ketika diatur ke false, SQLGetData digunakan sebagai gantinya.

Default: false

Cuplikan kode berikut memberikan contoh yang secara eksplisit memberi tahu mesin M untuk menggunakan CAST daripada CONVERT.

SQLGetFunctions = [
    SQL_CONVERT_FUNCTIONS = 0x2 /* SQL_FN_CVT_CAST */
]

Mengambil alih SQLGetInfo

Bidang ini digunakan untuk mengambil alih SQLGetInfo nilai yang dikembalikan oleh driver ODBC. Ini berisi rekaman yang bidangnya adalah nama yang sama dengan InfoType konstanta yang ditentukan untuk fungsi ODBC SQLGetInfo . Konstanta numerik untuk masing-masing bidang ini dapat ditemukan dalam spesifikasi ODBC. Daftar InfoTypes lengkap yang diperiksa dapat ditemukan dalam file pelacakan mesin mashup.

Tabel berikut ini berisi properti yang umumnya SQLGetInfo ditimpa:

Bidang Detail
SQL_SQL_CONFORMANCE Nilai bilangan bulat yang menunjukkan tingkat SQL-92 yang didukung oleh driver:

(1) SQL_SC_SQL92_ENTRY: Tingkat entri yang sesuai dengan SQL-92.
(2) SQL_SC_FIPS127_2_TRANSITIONAL: TINGKAT transisi FIPS 127-2 sesuai.
(4) SQL_SC_ SQL92_INTERMEDIATE" Tingkat menengah yang sesuai dengan SQL-92.
(8) SQL_SC_SQL92_FULL: Mematuhi SQL-92 tingkat penuh.

Dalam skenario Power Query, konektor digunakan dalam mode Baca Saja. Sebagian besar driver akan ingin melaporkan tingkat kepatuhan SQL_SC_SQL92_FULL, dan mengambil alih perilaku pembuatan SQL tertentu menggunakan SQLGetInfo properti dan SQLGetFunctions .
SQL_SQL92_PREDICATES Bitmask yang menghitung predikat yang didukung dalam pernyataan SELECT, seperti yang didefinisikan dalam SQL-92.

Buka konstanta SQL_SP_* dalam spesifikasi ODBC.
SQL_AGGREGATE_FUNCTIONS Bitmask yang menghitung dukungan untuk fungsi agregasi.

SQL_AF_ALL
SQL_AF_AVG
SQL_AF_COUNT
SQL_AF_DISTINCT
SQL_AF_MAX
SQL_AF_MIN
SQL_AF_SUM

Buka konstanta SQL_AF_* dalam spesifikasi ODBC.
SQL_GROUP_BY Nilai bilangan bulat yang menentukan hubungan antara kolom dalam klausa GROUP BY dan kolom non-agregat dalam daftar pilih:

SQL_GB_COLLATE: Klausa COLLATE dapat ditentukan di akhir setiap kolom pengelompokan.

SQL_GB_NOT_SUPPORTED: Klausa GROUP BY tidak didukung.

SQL_GB_GROUP_BY_EQUALS_SELECT: Klausa GROUP BY harus berisi semua kolom non-agregat dalam daftar pilih. Ini tidak dapat berisi kolom lain. Misalnya, SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT.

SQL_GB_GROUP_BY_CONTAINS_SELECT: Klausa GROUP BY harus berisi semua kolom non-agregat dalam daftar pilih. Ini dapat berisi kolom yang tidak ada dalam daftar pilih. Misalnya, SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT, AGE.

SQL_GB_NO_RELATION: Kolom dalam klausa GROUP BY dan daftar pilih tidak terkait. Arti kolom yang tidak dikelompokkan dan tidak diagregasi dalam daftar pemilihan adalah sumber data-dependen. Misalnya, PILIH DEPT, GAJI DARI GRUP KARYAWAN BERDASARKAN DEPT, USIA.

Buka konstanta SQL_GB_* dalam spesifikasi ODBC.

Fungsi pembantu berikut dapat digunakan untuk membuat nilai bitmask dari daftar nilai bilangan bulat:

Flags = (flags as list) =>
    let
        Loop = List.Generate(
                  ()=> [i = 0, Combined = 0],
                  each [i] < List.Count(flags),
                  each [i = [i]+1, Combined =*Number.BitwiseOr([Combined], flags{i})],
                  each [Combined]),
        Result = List.Last(Loop, 0)
    in
        Result;

Mengesampingkan SQLGetTypeInfo

SQLGetTypeInfo dapat ditentukan dengan dua cara:

  • Nilai tetap table yang berisi informasi jenis yang sama dengan panggilan ODBC ke SQLGetTypeInfo.
  • Fungsi yang menerima argumen tabel, dan mengembalikan tabel. Argumen berisi hasil asli panggilan ODBC ke SQLGetTypeInfo. Implementasi fungsi Anda dapat mengubah atau menambahkan ke tabel ini.

Pendekatan pertama digunakan untuk sepenuhnya mengambil alih nilai yang dikembalikan oleh driver ODBC. Pendekatan kedua digunakan jika Anda ingin menambahkan atau memodifikasi nilai-nilai ini.

Untuk detail format parameter tabel jenis dan nilai pengembalian yang diharapkan, buka referensi fungsi SQLGetTypeInfo.

SQLGetTypeInfo menggunakan tabel statis

Cuplikan kode berikut menyediakan implementasi statis untuk SQLGetTypeInfo.

SQLGetTypeInfo = #table(
    { "TYPE_NAME",      "DATA_TYPE", "COLUMN_SIZE", "LITERAL_PREF", "LITERAL_SUFFIX", "CREATE_PARAS",           "NULLABLE", "CASE_SENSITIVE", "SEARCHABLE", "UNSIGNED_ATTRIBUTE", "FIXED_PREC_SCALE", "AUTO_UNIQUE_VALUE", "LOCAL_TYPE_NAME", "MINIMUM_SCALE", "MAXIMUM_SCALE", "SQL_DATA_TYPE", "SQL_DATETIME_SUB", "NUM_PREC_RADIX", "INTERNAL_PRECISION", "USER_DATA_TYPE" }, {

    { "char",           1,          65535,          "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "char",            null,            null,            -8,              null,               null,             0,                    0                }, 
    { "int8",           -5,         19,             "'",            "'",              null,                     1,          0,                2,            0,                    10,                 0,                   "int8",            0,               0,               -5,              null,               2,                0,                    0                },
    { "bit",            -7,         1,              "'",            "'",              null,                     1,          1,                3,            null,                 0,                  null,                "bit",             null,            null,            -7,              null,               null,             0,                    0                },
    { "bool",           -7,         1,              "'",            "'",              null,                     1,          1,                3,            null,                 0,                  null,                "bit",             null,            null,            -7,              null,               null,             0,                    0                },
    { "date",           9,          10,             "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "date",            null,            null,            9,               1,                  null,             0,                    0                }, 
    { "numeric",        3,          28,             null,           null,             null,                     1,          0,                2,            0,                    0,                   0,                  "numeric",         0,               0,               2,               null,               10,               0,                    0                },
    { "float8",         8,          15,             null,           null,             null,                     1,          0,                2,            0,                    0,                   0,                  "float8",          null,            null,            6,               null,               2,                0,                    0                },
    { "float8",         6,          17,             null,           null,             null,                     1,          0,                2,            0,                    0,                   0,                  "float8",          null,            null,            6,               null,               2,                0,                    0                },
    { "uuid",           -11,        37,             null,           null,             null,                     1,          0,                2,            null,                 0,                  null,                "uuid",            null,            null,            -11,             null,               null,             0,                    0                },
    { "int4",           4,          10,             null,           null,             null,                     1,          0,                2,            0,                    0,                   0,                  "int4",            0,               0,               4,               null,               2,                0,                    0                },
    { "text",           -1,         65535,          "'",            "'",              null,                     1,          1,                3,            null,                 0,                  null,                "text",            null,            null,            -10,             null,               null,             0,                    0                },
    { "lo",             -4,         255,            "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "lo",              null,            null,            -4,              null,               null,             0,                    0                }, 
    { "numeric",        2,          28,             null,           null,             "precision, scale",       1,          0,                2,            0,                    10,                 0,                   "numeric",         0,               6,               2,               null,               10,               0,                    0                },
    { "float4",         7,          9,              null,           null,             null,                     1,          0,                2,            0,                    10,                 0,                   "float4",          null,            null,            7,               null,               2,                0,                    0                }, 
    { "int2",           5,          19,             null,           null,             null,                     1,          0,                2,            0,                    10,                 0,                   "int2",            0,               0,               5,               null,               2,                0,                    0                }, 
    { "int2",           -6,         5,              null,           null,             null,                     1,          0,                2,            0,                    10,                 0,                   "int2",            0,               0,               5,               null,               2,                0,                    0                }, 
    { "timestamp",      11,         26,             "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "timestamp",       0,               38,              9,               3,                  null,             0,                    0                }, 
    { "date",           91,         10,             "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "date",            null,            null,            9,               1,                  null,             0,                    0                }, 
    { "timestamp",      93,         26,             "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "timestamp",       0,               38,              9,               3,                  null,             0,                    0                }, 
    { "bytea",          -3,         255,            "'",            "'",              null,                     1,          0,                2,            null,                 0,                  null,                "bytea",           null,            null,            -3,              null,               null,             0,                    0                }, 
    { "varchar",        12,         65535,          "'",            "'",              "max. length",            1,          0,                2,            null,                 0,                  null,                "varchar",         null,            null,           -9,               null,               null,             0,                    0                }, 
    { "char",           -8,         65535,          "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "char",            null,            null,           -8,               null,               null,             0,                    0                }, 
    { "text",           -10,        65535,          "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "text",            null,            null,           -10,              null,               null,             0,                    0                }, 
    { "varchar",        -9,         65535,          "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "varchar",         null,            null,           -9,               null,               null,             0,                    0                },
    { "bpchar",         -8,         65535,           "'",            "'",              "max. length",            1,          1,                3,            null,                 0,                  null,                "bpchar",          null,            null,            -9,               null,               null,            0,                    0                } }
);

SQLGetTypeInfo menggunakan fungsi

Cuplikan kode berikut menambahkan bpchar jenis ke jenis yang ada yang dikembalikan oleh driver.

SQLGetTypeInfo = (types as table) as table =>
   let
       newTypes = #table(
           {
               "TYPE_NAME",
               "DATA_TYPE",
               "COLUMN_SIZE",
               "LITERAL_PREF",
               "LITERAL_SUFFIX",
               "CREATE_PARAS",
               "NULLABLE",
               "CASE_SENSITIVE",
               "SEARCHABLE",
               "UNSIGNED_ATTRIBUTE",
               "FIXED_PREC_SCALE",
               "AUTO_UNIQUE_VALUE",
               "LOCAL_TYPE_NAME",
               "MINIMUM_SCALE",
               "MAXIMUM_SCALE",
               "SQL_DATA_TYPE",
               "SQL_DATETIME_SUB",
               "NUM_PREC_RADIX",
               "INTERNAL_PRECISION",
               "USER_DATA_TYPE"
            },
            // we add a new entry for each type we want to add
            {
                {
                    "bpchar",
                    -8,
                    65535,
                    "'",
                    "'",
                    "max. length",
                    1,
                    1,
                    3,
                    null,
                    0,
                    null,
                    "bpchar",
                    null,
                    null,
                    -9,
                    null,
                    null,
                    0,
                    0
                }
            }),
        append = Table.Combine({types, newTypes})
    in
        append;

Mengatur string koneksi

String koneksi untuk driver ODBC Anda diatur menggunakan argumen pertama ke fungsi Odbc.DataSource dan Odbc.Query. Nilainya bisa berupa teks, atau rekaman M. Saat menggunakan rekaman, setiap bidang dalam rekaman akan menjadi properti di string koneksi. Semua string koneksi memerlukan Driver bidang (atau DSN bidang jika Anda mengharuskan pengguna untuk melakukan pra-konfigurasi DSN tingkat sistem). Properti terkait kredensial diatur secara terpisah. Properti lain khusus driver.

Cuplikan kode di bawah ini menunjukkan definisi fungsi sumber data baru, pembuatan ConnectionString rekaman, dan pemanggilan fungsi Odbc.DataSource .

[DataSource.Kind="SqlODBC", Publish="SqlODBC.Publish"]
shared SqlODBC.Contents = (server as text) =>
    let
        ConnectionString = [
            Driver = "SQL Server Native Client 11.0",
            Server = server,
            MultiSubnetFailover = "Yes",
            ApplicationIntent = "ReadOnly",
            APP = "PowerBICustomConnector"
        ],
        OdbcDatasource = Odbc.DataSource(ConnectionString)
    in
        OdbcDatasource;

Langkah berikutnya