将数据库名称作为变量传递给C#中的SQL。可能吗?

时间:2010-01-27 21:29:48

标签: c# sql sql-server-2005 sql-server-2008 ado.net

我有2个表具有完全相同的列。但它们存储在Database1和Database2中(在同一服务器上)。我能否将数据库名称作为变量传递?例如:

                        SELECT  [SomeValue]
                        FROM    [Database2].[dbo].[Klienci]

                        SELECT  [SomeValue]
                        FROM    [Database1].[dbo].[Klienci]

有没有办法将整个[FROM]作为@variable传递给C#中的以下代码:

            SqlCommand sqlQuery = new SqlCommand(preparedCommand, varConnection);
            sqlQuery.Prepare();
            sqlQuery.Parameters.AddWithValue("@varDatabase", varDatabase);

@varDatabase将保存数据库名称和/或表名,即。 [Database1]。[dbo]。[Klienci]采用一种或另一种格式。

我在谈论C#3.5 / MSSQL 2005/2008。

6 个答案:

答案 0 :(得分:7)

为什么不在进行连接时设置数据库?然后代码甚至没有改变。

答案 1 :(得分:2)

根据请求的类型,您需要动态设置数据库名称和连接字符串。即使你有(例如)60个数据库,你可能会连接到,使用硬编码语句是没有人会推荐的,因为

  • 很难写
  • 很难管理
  • 很难更新
  • 您可以使用单独的代码文件 但这有点像 重新发明轮子。

配置文件与其他许多文件一起服务于此目的,并想一想你的同事,看看这个“ CustomConnectionStringsFile ”并摸不着头脑。

最好的方法是将它们保存为配置文件中的connectionStrings并使用它 你需要

像这样的东西

将连接字符串添加到Web.Config

<connectionStrings>
  <add 
    name="NorthwindConnectionString" 
    connectionString="Data Source=serverName;Initial 
    Catalog=Northwind;Persist Security Info=True;User 
    ID=userName;Password=password"
    providerName="System.Data.SqlClient"
  />
  <add 
    name="BestDBConnectionString" 
    connectionString="Data Source=serverName;Initial 
    Catalog= BestDB;Persist Security Info=True;User 
    ID=userName;Password=password"
    providerName="System.Data.SqlClient"
  />
</connectionStrings>

访问Connectionstring

    string myConnString ="";
    if(ThisIsThat("A"))
    {
        myConnString = 
                               rootWebConfig.ConnectionStrings.ConnectionStrings["NorthwindConnectionString"];
    }
    else if(ThisIsThat("B"))
    {        
        myConnString =
                                rootWebConfig.ConnectionStrings.ConnectionStrings["BestDBConnectionString"]
    }

    { else // Can go on}

有关

的更多信息

希望有所帮助

答案 2 :(得分:1)

在这种情况下,

多个Connections字符串是你的朋友!

答案 3 :(得分:1)

不,T-SQL参数不能引用实体(例如数据库或表),如果没有其他原因,那么它会让优化者无法理解。

如果只是DB名称不同,动态构建连接字符串的建议是一个很好的建议。您可以使用SqlConnectionStringBuilder类来减少错误。

你也可以动态地建立一个C#字符串,但是要小心自己打开Sql注入攻击。

否则,只需在T-SQL代码中执行IF语句:

IF (@dbName = 'Database1') BEGIN
   SELECT SomeValue FROM [Database1].[dbo].[Klienci]
END ELSE BEGIN
   SELECT SomeValue FROM [Database2].[dbo].[Klienci]
END

答案 4 :(得分:0)

可以但我只是将连接更改为指向您要查询的数据库。

<强>澄清:
为了澄清,您可以使用动态sql执行此操作。例如将数据库名称传递给sproc,然后可以构建完整的语句并执行它。当然,直接使用变量是无效的(“SELECT * FROM [@DatabaseName] .dbo.TableName”无效)。但是,这不是推荐的方法,因此最好是改变连接。

答案 5 :(得分:0)

尝试使用类似DBProviderFactory的内容