我偶然发现了一个问题,我想不出一个很好的,安全的方式来完成它。我有一个围绕“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转义(尽我所能)
答案 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>