ログイン、データベース、およびパスワードを含む文字列があります。
string str = "user Id=abc, database=DDD, Password=mypasswd"
データベース値「DDD」を別の値に置き換えられるようにしたいと考えています。
string.Replace を使用してみましたが、既存のデータベースがどうなるかわかりません。
簡単な解決策を知っている人はいますか?
ログイン、データベース、およびパスワードを含む文字列があります。
string str = "user Id=abc, database=DDD, Password=mypasswd"
データベース値「DDD」を別の値に置き換えられるようにしたいと考えています。
string.Replace を使用してみましたが、既存のデータベースがどうなるかわかりません。
簡単な解決策を知っている人はいますか?
以下は、接続文字列インジェクション攻撃を防ぐために MSDN が推奨する唯一の方法です。
http://msdn.microsoft.com/en-us/library/ms254947.aspx
// cs stores previous connection string which came from config
System.Data.SqlClient.SqlConnectionStringBuilder builder =
new System.Data.SqlClient.SqlConnectionStringBuilder(cs);
builder.InitialCatalog = "NEWDB";
// you get your database name replaced properly...
cs = builder.ToString();
データベースまたはデータベース ドライバーのタイプに基づいて、別のクラスを使用する必要があります。
代替手段の 1 つは、正規表現を使用することです。これにより、次のように置き換えられます。
using System.Text.RegularExpressions;
string cStr = "user Id=abc, database=DDD, Password=mypasswd";
Console.WriteLine(cStr);
Regex r = new Regex("(?<=database=)(.+?)(?=,)");
cStr = r.Replace(cStr, "NewDatabaseName");
Console.WriteLine(cStr);
注:これはコンパイル、実行、および証明されてscriptcs
いるため、ソリューションにかなりドロップできます。
String.Formatを使用するのはどうですか?
string username = "abc";
string database = "myDB";
string password = "my_pw";
string str = String.Format("user Id={0}, database={1}, Password={2}",
username, database, password);
その後、構成ファイルからこれらの値 (または接続文字列全体) を読み込むことができます。
正規表現もオプションです。
string str = "user Id=abc, database=DDD, Password=mypasswd",
newDatabase = "newDb";
Console.WriteLine( Regex.Replace( str, @"(?<=database=)(.*?)(?=,)", m => newDatabase ) );
コンマ区切りで文字列を分割し、結果の配列の 2 番目のインデックスを取得し、等号区切りで分割し、2 番目の要素を置き換えてから、すべてを再結合します。
string str = "user Id=abc, database=DDD, Password=mypasswd";
string[] parts = str.Split(',');
string[] dbparts = parts[1].Split('=');
dbparts[1] = "new_database_name";
parts[1] = string.Join("=", dbparts);
string final = string.Join(", ", parts);
そして、まあ、少しエラーチェックを行う方が安全です。