2

ログイン、データベース、およびパスワードを含む文字列があります。

string str = "user Id=abc, database=DDD, Password=mypasswd"  

データベース値「DDD」を別の値に置き換えられるようにしたいと考えています。

string.Replace を使用してみましたが、既存のデータベースがどうなるかわかりません。

簡単な解決策を知っている人はいますか?

4

7 に答える 7

11

以下は、接続文字列インジェクション攻撃を防ぐために 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();

データベースまたはデータベース ドライバーのタイプに基づいて、別のクラスを使用する必要があります。

于 2013-04-24T17:55:24.047 に答える
5

代替手段の 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いるため、ソリューションにかなりドロップできます。

于 2013-04-24T17:54:14.337 に答える
4

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);

その後、構成ファイルからこれらの値 (または接続文字列全体) を読み込むことができます。

于 2013-04-24T17:48:39.303 に答える
2

正規表現もオプションです。

string str = "user Id=abc, database=DDD, Password=mypasswd",
    newDatabase = "newDb";

Console.WriteLine( Regex.Replace( str, @"(?<=database=)(.*?)(?=,)", m => newDatabase ) );
于 2013-04-24T17:54:03.467 に答える
1

コンマ区切りで文字列を分割し、結果の配列の 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);

そして、まあ、少しエラーチェックを行う方が安全です。

于 2013-04-24T17:48:08.617 に答える