Передача имени базы данных в качестве переменной в SQL из C #. Является ли это возможным? - PullRequest
4 голосов
/ 28 января 2010

У меня есть 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 ]

7 голосов
/ 28 января 2010

Почему бы вам просто не настроить базу данных при установлении соединения? Тогда код даже не изменится.

2 голосов
/ 28 января 2010

Похоже, что вам нужно установить имя базы данных и строку подключения, динамически, в зависимости от типа запроса. Даже если у вас есть, скажем, 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>

Доступ к строке подключения

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

    { else // Can go on}

Подробнее о

Надеюсь, это поможет

1 голос
/ 28 января 2010

Нет, параметры T-SQL не могут ссылаться на сущность (такую ​​как база данных или таблица), если только по какой-либо другой причине, кроме как это поразило бы оптимизатора.

Если только имя БД отличается, то предложение динамического построения строки подключения - хороший вариант. Вы можете использовать класс SqlConnectionStringBuilder , чтобы сделать его менее подверженным ошибкам.

Вы также можете просто динамически создавать строку C #, но будьте осторожны, открывая себя для атак инъекцией Sql.

В противном случае просто сделайте оператор IF в своем коде T-SQL:

IF (@dbName = 'Database1') BEGIN
   SELECT SomeValue FROM [Database1].[dbo].[Klienci]
END ELSE BEGIN
   SELECT SomeValue FROM [Database2].[dbo].[Klienci]
END
1 голос
/ 28 января 2010

несколько строк Connections - ваш друг в этом случае!

0 голосов
/ 28 января 2010

Попробуйте что-то вроде DBProviderFactory вместо

0 голосов
/ 28 января 2010

Вы можете , но я бы просто изменил соединение, чтобы указать базу данных, которую вы хотите запросить.

Пояснение:
Чтобы уточнить, вы можете сделать это с помощью динамического SQL. например передача имени базы данных в sproc, который затем может создать полный оператор и выполнить его. Конечно, недопустимо использовать переменную напрямую («SELECT * FROM [@DatabaseName] .dbo.TableName» недопустимо). Однако такой подход не рекомендуется, поэтому лучше всего изменить соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...