আমার একটি সংযোগের স্ট্রিং রয়েছে এবং আমি উদাহরণস্বরূপ "ডেটা সোর্স" খুঁজে বের করতে সক্ষম হতে চাই। এখানে কি কোন পার্সার আছে, বা আমাকে স্ট্রিংটি অনুসন্ধান করতে হবে?
আমার একটি সংযোগের স্ট্রিং রয়েছে এবং আমি উদাহরণস্বরূপ "ডেটা সোর্স" খুঁজে বের করতে সক্ষম হতে চাই। এখানে কি কোন পার্সার আছে, বা আমাকে স্ট্রিংটি অনুসন্ধান করতে হবে?
উত্তর:
হ্যাঁ, System.Data.Common.DbConnectionStringBuilderক্লাস আছে।
DbConnicationStringBuilder শ্রেণিটি বেস শ্রেণীর সাহায্য দেয় যা থেকে দৃ strongly়ভাবে টাইপ করা সংযোগ স্ট্রিং বিল্ডার (SQLloncectionStringBuilder, OleDbConnectionStringBuilder, এবং আরও) প্রাপ্ত হয়। সংযোগ স্ট্রিং নির্মাতারা বিকাশকারীদের প্রোগ্রামগতভাবে সংশ্লেষগতভাবে সঠিক সংযোগের স্ট্রিং তৈরি করতে দেয় এবং বিদ্যমান সংযোগের স্ট্রিংকে বিশ্লেষণ ও পুনর্নির্মাণ করতে দেয়।
আগ্রহের সাবক্লাসগুলি হ'ল:
System.Data.EntityClient.EntityConnectionStringBuilder
System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.OracleClient.OracleConnectionStringBuilder
System.Data.SqlClient.SqlConnectionStringBuilder
উদাহরণস্বরূপ, একটি এসকিউএল-সার্ভার সংযোগ স্ট্রিং থেকে "ডেটা উত্সটি দেখার জন্য", আপনি এটি করতে পারেন:
var builder = new SqlConnectionStringBuilder(connectionString);
var dataSource = builder.DataSource;
বিক্রেতা মতো বিভিন্ন প্রদানকারীর থেকে নির্দিষ্ট সংযোগ স্ট্রিং বিল্ডার আছে SqlConnectionStringBuilder, MySqlConnectionStringBuilder, SQLiteConnectionStringBuilderইত্যাদি (দুর্ভাগ্যবশত সেখানে মাইক্রোসফট এই সময় থেকে কোন পাবলিক ইন্টারফেস)। অন্যথায় আপনার কাছে DbProviderFactory.CreateConnicationStringBuilder রয়েছে যা আপনাকে এটিকে সরবরাহকারী- অজ্ঞাব্য উপায়ে লেখার একটি বিকল্প উপায় দেবে। আপনাকে কনফিগার ফাইলে সরবরাহকারী নির্দিষ্ট করতে হবে এবং dll এর সঠিক সংস্করণ উপলব্ধ থাকতে হবে। যেমন।,
var c = "server=localhost;User Id=root;database=ppp";
var f = DbProviderFactories.GetFactory("MySql.Data.MySqlClient"); //your provider
var b = f.CreateConnectionStringBuilder();
b.ConnectionString = c;
var s = b["data source"];
var d = b["database"];
আমি একবার নিজের জন্য ম্যানুয়াল পার্সিং লিখেছিলাম যা আমাকে কোনও সমস্যায় ফেলেনি। অন্যান্য পরামিতিগুলির তথ্য দেওয়ার জন্য এটি প্রসারিত করা তুচ্ছ হবে (এই মুহুর্তে এটি কেবলমাত্র ডিবি নাম, ডেটা উত্স, ব্যবহারকারীর নাম এবং পাসওয়ার্ডের মতো সাধারণ জিনিসের জন্য)। এটি বা এর মতো:
static readonly string[] serverAliases = { "server", "host", "data source", "datasource", "address",
"addr", "network address" };
static readonly string[] databaseAliases = { "database", "initial catalog" };
static readonly string[] usernameAliases = { "user id", "uid", "username", "user name", "user" };
static readonly string[] passwordAliases = { "password", "pwd" };
public static string GetPassword(string connectionString)
{
return GetValue(connectionString, passwordAliases);
}
public static string GetUsername(string connectionString)
{
return GetValue(connectionString, usernameAliases);
}
public static string GetDatabaseName(string connectionString)
{
return GetValue(connectionString, databaseAliases);
}
public static string GetServerName(string connectionString)
{
return GetValue(connectionString, serverAliases);
}
static string GetValue(string connectionString, params string[] keyAliases)
{
var keyValuePairs = connectionString.Split(';')
.Where(kvp => kvp.Contains('='))
.Select(kvp => kvp.Split(new char[] { '=' }, 2))
.ToDictionary(kvp => kvp[0].Trim(),
kvp => kvp[1].Trim(),
StringComparer.InvariantCultureIgnoreCase);
foreach (var alias in keyAliases)
{
string value;
if (keyValuePairs.TryGetValue(alias, out value))
return value;
}
return string.Empty;
}
এর জন্য আপনার কনফিগার ফাইলে বিশেষ কিছু দরকার নেই, বা কোনও dll মোটেই। Containsমধ্যে Whereদফা গুরুত্বপূর্ণ শুধুমাত্র আপনি বাইপাস মত দুর্বল ফরম্যাট connectionstrings প্রয়োজন server = localhost;pp;যেখানে ppকিছুই যোগ করা হয়েছে। স্বাভাবিক বিল্ডার মত আচরণ করার জন্য (যা এই ক্ষেত্রে বিস্ফোরিত করা হবে) পরিবর্তন Whereকরতে
.Where(kvp => !string.IsNullOrWhitespace(kvp))
StringComparer.InvariantCultureIgnoreCase। ToDictionaryওভারলোড দেখুন
';'বা একটি '='রয়েছে। আমি অনুরূপ বাস্তবায়ন লিখেছিলাম এবং শিখেছি যে এটি শক্তভাবে কাজ করে না। হ্যাঁ, সংযোগের স্ট্রিং পার্সিং আসলে আমার চেয়ে অনেক বেশি শক্ত!
এখানে কোডের কয়েকটি লাইন রয়েছে যা কোনও সংযোগের স্ট্রিংকে অভিধানে বিভক্ত করবে:
Dictionary<string, string> connStringParts = connString.Split(';')
.Select(t => t.Split(new char[] { '=' }, 2))
.ToDictionary(t => t[0].Trim(), t => t[1].Trim(), StringComparer.InvariantCultureIgnoreCase);
এবং তারপরে আপনি যে কোনও অংশ অ্যাক্সেস করতে পারবেন:
string dataSource = connStringParts["Data Source"];
StringSplitOptions.RemoveEmptyEntriesপ্রথম পর্বের অন্তর্ভুক্ত কারণ এটি IndexOutOfRangeপিছনে থাকলে ব্যতিক্রম ঘটবে;
SqlConnectionসঙ্গে SqlConnectionStringBuilder।
SqlConnicationStringBuilder ব্যবহার করুন দুর্ভাগ্যক্রমে সংযোগের স্ট্রিংগুলি পৃথক হওয়ার কারণে আপনাকে একটি ডিবি নির্দিষ্ট সংযোগ স্ট্রিংবিল্ডার ব্যবহার করতে হবে।
আপনি ডিবিপ্রভাইডারফ্যাক্টরি ব্যবহার করতে চান re ক্রিটকনেকশন স্ট্রিংবিল্ডার () যা আপনাকে আপনার সংযোজকের জন্য নির্দিষ্ট একটি সংযোগ স্ট্রিং বিল্ডার / পার্সার সরবরাহ করে, তবে আপনাকে কোনও সংযোজক নির্দিষ্ট ক্লাস ব্যবহার করার প্রয়োজন নেই।
হ্যাঁ, আপনি এটি কানেকশনস্ট্রিংবিল্ডার ক্লাস ব্যবহার করে করতে পারেন। মানক ডেটা সরবরাহকারীদের জন্য উপলভ্য ডিবি সংযোগ স্ট্রিংবিল্ডার বাস্তবায়নগুলির তালিকা এখানে রয়েছে:
System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.OracleClient.OracleConnectionStringBuilder
System.Data.SqlClient.SqlConnectionStringBuilder
পার্স সংযোগের স্ট্রিংয়ের নমুনার উদাহরণ এখানে রয়েছে এবং এর উপাদানগুলি প্রদর্শন করুন।
string conString = @"Data Source=.\sqlexpress;" +
"Database=Northwind;Integrated Security=SSPI;" +
"Min Pool Size=5;Max Pool Size=15;Connection Reset=True;" +
"Connection Lifetime=600;";
// Parse the SQL Server connection string and display it's properties
SqlConnectionStringBuilder objSB1 = new SqlConnectionStringBuilder(conString);
Response.Write("<b>Parsed SQL Connection String Parameters:</b>");
Response.Write(" <br/> Database Source = " + objSB1.DataSource);
Response.Write(" <br/> Database = " + objSB1.InitialCatalog);
Response.Write(" <br/> Use Integrated Security = " + objSB1.IntegratedSecurity);
Response.Write(" <br/> Min Pool Size = " + objSB1.MinPoolSize);
Response.Write(" <br/> Max Pool Size = " + objSB1.MaxPoolSize);
Response.Write(" <br/> Lifetime = " + objSB1.LoadBalanceTimeout);
আপনি DbConnectionStringBuilder ব্যবহার করতে পারেন এবং আপনার কোনও নির্দিষ্ট সরবরাহকারীর প্রয়োজন নেই:
নিম্নলিখিত কোড:
var cnstr = "Data Source=data source value;Server=ServerValue";
var builder = new DbConnectionStringBuilder();
builder.ConnectionString = cnstr;
Console.WriteLine("Data Source: {0}", builder["Data Source"]);
Console.WriteLine("Server: {0}", builder["Server"]);
কনসোল আউটপুট:
Data Source: data source value
Server: ServerValue
সম্পাদনা করুন:
যেহেতু DbConnicationStringBuilder আইডিয়োরিও প্রয়োগ করে আপনি সংযোগের স্ট্রিং প্যারামিটারগুলি গণনা করতে পারেন:
foreach (KeyValuePair<string, object> kv in builder)
{
Console.WriteLine("{0}: {1}", kv.Key, kv.Value);
}
আমি এখানে সমস্ত উত্তর সত্যিই পছন্দ করি না। সুতরাং এখানে আমি খুঁজে পেয়েছি কি।
আপনি DbConnectionStringBuilderসরাসরি ব্যবহার করতে পারেন :
var builder = new System.Data.Common.DbConnectionStringBuilder();
builder.ConnectionString = settings.ConnectionString;
var server = builder["server"];
সুতরাং আমি উপস্থিত সমস্ত উত্তর কমবেশি ভুল ছিল। আমি নিম্নলিখিত তুচ্ছ সমাধান দিয়ে শেষ করেছি:
class ConnectionStringParser: DbConnectionStringBuilder {
ConnectionStringParser(string c) { Connection = c; }
public override bool ShouldSerialize(string keyword) => true;
}
পার্সারটি ডিবি সংযোগ স্ট্রিংবিল্ডারে রয়েছে এবং এটি পাওয়া খুব সহজ। আমাদের কেবলমাত্র নির্লজ্জ কাজটি হ'ল হোল্ডসরিজালাইজ সেট করা সর্বদা সত্যের ফিরে আসার জন্য যখন ট্রিপ স্বেচ্ছাসেবী সংযোগের স্ট্রিংগুলি বৃত্তাকার চেষ্টা করার সময় উপাদানগুলি হারাতে বাধা দেয়।
DbConnectionStringBuilderজেনেরিক প্রসেসিং বৈশিষ্ট্য রয়েছে যাif (builder.TryGetValue("Password", out var pwd)) { string decrypted = SomehowDecrypt(pwd); builder["Password"] = decrypted; }