TSQL + C#:动态更改正在使用的数据库

时间:2011-09-15 15:16:10

标签: c# sql tsql sql-injection

我偶然发现了一个问题,我想不出一个很好的,安全的方式来完成它。我有一个围绕“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;

有没有人知道为此解决方案选择数据库的正确方法?

P.S。 this._currentDB是SQL转义(尽我所能)

4 个答案:

答案 0 :(得分:3)

您可以使用 SqlConnection.Database property 更改连接中的数据库。

编辑:您必须使用SqlConnection.ChangeDatabase method

答案 1 :(得分:1)

您的连接字符串包含您连接到的数据库。我只想更改连接字符串中的数据库,您将连接到正确的数据库。

答案 2 :(得分:1)

是的,更改数据库的正确方法是更改​​连接字符串。

您可以从App.config获取连接字符串,并以编程方式替换数据库名称。

string connString = ConfigurationManager.ConnectionStrings["YourKey"].ConnectionString;

现在,在创建新的DBConnection实例

之前,替换新名称的DB名称

答案 3 :(得分:0)

它究竟需要多么动态?

除非您拥有未知数量的未知名称的数据库,否则为什么不为每个数据库创建一个ConnectionString,然后根据Enum,switch case,If-Else或类似的选择正确的。[/ p>