【问题标题】:Passing database name as variable to SQL from C#. Is it possible?将数据库名称作为变量从 C# 传递给 SQL。可能吗?
【发布时间】:2010-01-27 21:29:47
【问题描述】:

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

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

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

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

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

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

我说的是 C# 3.5 / MSSQL 2005/2008。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 不知道为什么我没有想到这一点。我已经为 2 个数据库定义了 2 个连接字符串,当我可以使用 FROM [Klienci] 时,我没有必要编写 FROM [Database2].[dbo].[Klienci],因为连接字符串会为我做出选择。
    【解决方案2】:

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

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

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

    最好的方法是将它们保存为连接字符串,在您的配置文件中并使用 你需要

    像这样的东西

    将连接字符串添加到 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>
    

    访问连接字符串

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

    更多信息

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      在这种情况下,多个连接字符串是你的朋友!

      【讨论】:

        【解决方案4】:

        不,T-SQL 参数不能引用实体(例如数据库或表),如果没有其他原因,它会让优化器大吃一惊。

        如果只是数据库名称不同,动态构建连接字符串的建议是一个不错的建议。您可以使用 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
        

        【讨论】:

          【解决方案5】:

          改用DBProviderFactory 之类的方法

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 其实你做不到他在做的事。 SQL 语句中的实体标识符的任何部分都不允许是变量。您可以动态构建语句,但不能参数化。
            • 你可以,但你必须在存储过程中执行 exec,这通常违背了存储过程的目的。
            • @Cade Roux - 我知道,但如果你使用动态 sql 例如你可以我设想将变量传递到一个存储过程中,然后动态构建语句,但我没有这样做,因为我认为这不是正确的方法
            猜你喜欢
            • 1970-01-01
            • 2017-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多