これを実現するにはQUOTENAMEの組み込み関数を使用できます。
SQLで実行する前にC#でスクリプトを構築しているように見えますが、これを行うにはデータベースに移動するC#関数が必要になるでしょう結果値をDictionary<string, string>
に保存して、既に引用されている文字列のラウンドトリップを排除します。例えば
:
private Dictionary<string, string> _quotedNames = new Dictionary<string, string>();
private string GetSqlQuotedName(string name)
{
if (!_quotedNames.ContainsKey(name))
{
_quotedNames[name] = GetSqlQuotedNameFromSqlServer(name);
}
return _quotedNames[name];
}
private string GetSqlQuotedNameFromSqlServer(string name)
{
/// Code here to use your Data access method of choice to basically execute
/// SELECT QUOTENAME(name) and return it
}
は、実際には、ちょうどSystem.Data.SqlClient名前空間のクラスを使用して、これを表示するには、ここで話をするために使用する接続文字列を与えられたこの動作を、実行するクラスですSQL Serverへ:
public class SqlNameEscaper
{
private Dictionary<string, string> _quotedNames = new Dictionary<string, string>();
private string _connectionString = string.Empty;
public SqlNameEscaper(string connectionString)
{
_connectionString = connectionString;
}
public string GetSqlQuotedName(string name)
{
if (!_quotedNames.ContainsKey(name))
{
_quotedNames[name] = GetSqlQuotedNameFromSqlServer(name);
}
return _quotedNames[name];
}
private string GetSqlQuotedNameFromSqlServer(string name)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var command = new SqlCommand("SELECT QUOTENAME(@name)", connection))
{
command.Parameters.AddWithValue("@name", name);
var result = command.ExecuteScalar();
return result.ToString();
}
}
}
}
これは、その後、これを行うことによって呼び出すことができます。
var sne = new SqlNameEscaper(@"CONNECTION_STRING_HERE");
var bracket = sne.GetSqlQuotedName("[");
それとも、あなたの例のコンテキストで:
var sqlNameEscaper = new SqlNameEscaper(@"CONNECTION_STRING_HERE");
var text = "ALTER DATABASE " + sqlNameEscaper.GetSqlQuotedName(databaseName) + " ADD ...";
この非常に主題での読み取りを持つ価値がdba.stackexchange.com上の問題もあります:Should we still be using QUOTENAME to protect from injection attacks?
出典
2017-08-22 09:46:28
Rob
あなたが特定のチェックの変数を検証することができとにかく[]のように与えてください。 " – BugFinder
@BugFinder、醜い、間違った、ひどい、そして[ここに多くの形容詞を挿入]、それは完全に*合法です* SQL Serverで' ['というテーブルを持っている=( – Rob
本当ですが、あなたのアプリのために:D – BugFinder