Я наткнулся на проблему и не могу придумать хороший, БЕЗОПАСНЫЙ способ ее решения.У меня есть класс-оболочка для класса "Sql.Helper" (Microsoft.ApplicationBlocks.Data), и я везде использую параметры.
Я пытаюсь изменить текущую базу данных, используемую для C #
USE @DBName
Этот код не может быть параметризован, и поэтому везде, где я читаю, предлагается запускать его как динамический SQL (дрожь), как, например,
DECLARE @SQL_SCRIPT NVARCHAR(100);
SET @SQL_SCRIPT = REPLACE('USE {DBName};', '{DBName}', @DBName);
exec sp_executesql @SQL_SCRIPT;
Однако за пределами этого sp_executesql БД остается неизменной.Затем я подумал добавить это в начало всех вызовов SQL, однако это не поможет.
При запуске профилировщик сообщает мне, что код наконец-то запускается как:
exec sp_executesql N'DECLARE @SQL_SCRIPT NVARCHAR(100); SET @SQL_SCRIPT = REPLACE(''USE {DBName};'', ''{DBName}'', @DBName); exec sp_executesql @SQL_SCRIPT;',N'@DBName nvarchar(100)',@DBName=N'MyDatabaseName'
он содержится в еще одном exec sp_executesql по умолчанию: (
В настоящее время, и я знаю, что это не лучший метод, но я делаю следующее в начале каждого вызова.
commandText = "USE " + this._currentDB + ";" + commandText;
Кто-нибудь знает правильный способ выбора БД для этого решения?
ps this._currentDB - экранированный SQL (насколько я могу)