Saya memiliki string koneksi dan saya ingin dapat mengintip misalnya "Sumber Data". Apakah ada pengurai, atau apakah saya harus mencari string?
181
Ya, ada System.Data.Common.DbConnectionStringBuilder
kelasnya.
Kelas DbConnectionStringBuilder menyediakan kelas dasar dari mana pembangun string koneksi sangat diketik (SqlConnectionStringBuilder, OleDbConnectionStringBuilder, dan sebagainya) berasal. Pembuat string koneksi memungkinkan pengembang membuat string koneksi yang benar secara sintaksis, dan mem-parsing dan membangun kembali string koneksi yang ada.
Subclass yang menarik adalah:
System.Data.EntityClient.EntityConnectionStringBuilder
System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.OracleClient.OracleConnectionStringBuilder
System.Data.SqlClient.SqlConnectionStringBuilder
Misalnya, untuk "mengintip Sumber Data" dari string koneksi SQL-server, Anda dapat melakukan:
var builder = new SqlConnectionStringBuilder(connectionString);
var dataSource = builder.DataSource;
DbConnectionStringBuilder
memiliki fitur pemrosesan generik yang dapat digunakan tanpa menggunakan subclass:if (builder.TryGetValue("Password", out var pwd)) { string decrypted = SomehowDecrypt(pwd); builder["Password"] = decrypted; }
Ada penjual koneksi string spesifik pembangun dari berbagai penyedia seperti
SqlConnectionStringBuilder
,MySqlConnectionStringBuilder
,SQLiteConnectionStringBuilder
dll (sayangnya tidak ada antarmuka publik dari MS saat ini). Kalau tidak, Anda memiliki DbProviderFactory.CreateConnectionStringBuilder yang akan memberi Anda cara alternatif untuk menuliskannya dengan cara provider-agnostic. Anda perlu menentukan penyedia dalam file konfigurasi dan memiliki versi dll yang tepat tersedia. Untuk mis.,Saya pernah menulis parsing manual untuk diri saya sendiri yang tidak memberi saya masalah. Akan sepele untuk memperluas ini untuk memberikan info tentang parameter lain (saat ini hanya untuk hal-hal sederhana seperti nama db, sumber data, nama pengguna dan kata sandi). Seperti ini atau lebih:
Untuk ini, Anda tidak perlu sesuatu yang khusus dalam file konfigurasi, atau dll sama sekali.
Contains
dalamWhere
klausa penting hanya jika Anda perlu mem-bypass koneksi yang diformat dengan buruk seperti diserver = localhost;pp;
mana tidakpp
menambah apa pun. Untuk berperilaku seperti pembangun normal (yang akan meledak dalam kasus ini) ubahWhere
kesumber
StringComparer.InvariantCultureIgnoreCase
. LihatToDictionary
kelebihan';'
atau'='
password mereka. Saya telah menulis implementasi serupa dan belajar bahwa itu tidak bekerja dengan cara yang sulit. Astaga, koneksi string parsing sebenarnya jauh lebih sulit daripada yang saya kira!Berikut adalah beberapa baris kode yang akan menguraikan string koneksi apa pun ke dalam kamus:
Dan kemudian Anda dapat mengakses bagian mana saja:
sumber
StringSplitOptions.RemoveEmptyEntries
ke split pertama karena akan menyebabkanIndexOutOfRange
pengecualian jika ada trailing;
SqlConnection
denganSqlConnectionStringBuilder
.Gunakan SqlConnectionStringBuilder Sayangnya Anda harus menggunakan DB ConnectionStringBuilder khusus karena string koneksi berbeda.
sumber
Anda ingin menggunakan DbProviderFactory.CreateConnectionStringBuilder () yang memberikan Anda pembuat koneksi string / parser khusus untuk konektor Anda, tetapi tidak mengharuskan Anda untuk menggunakan kelas konektor tertentu.
sumber
Ya, Anda bisa melakukan ini menggunakan kelas ConnectionStringBuilder. Berikut adalah daftar implementasi DbConnectionStringBuilder yang tersedia untuk penyedia data standar:
berikut adalah contoh contoh string koneksi parse dan menampilkan elemen-elemennya.
sumber
Anda dapat menggunakan DbConnectionStringBuilder, dan Anda tidak memerlukan penyedia spesifik:
Kode berikut:
Output ke konsol:
EDIT:
Karena DbConnectionStringBuilder mengimplementasikan IDictionary Anda dapat menyebutkan parameter string koneksi:
sumber
Saya tidak terlalu menyukai semua jawaban di sini. Jadi inilah yang saya temukan.
Dengan .NET Core
Anda dapat menggunakan
DbConnectionStringBuilder
secara langsung:sumber
Jadi saya menemukan semua jawaban yang ada kurang lebih salah. Saya berakhir dengan solusi sepele berikut:
Parser ada di DbConnectionStringBuilder dan cukup mudah untuk didapatkan. Satu-satunya hal konyol yang harus kita lakukan adalah mengatur ShouldSerialize untuk selalu mengembalikan true untuk mencegah kehilangan komponen ketika mencoba untuk membulatkan string koneksi arbitrer.
sumber