Вопрос:

Строка подключения C # SQL Server с несколькими базами данных на одном сервере

c# sql-server

646 просмотра

4 ответа

1 Репутация автора

Моя строка подключения к SQL Server настроена так:

String strConnection = @"Data Source=servername;Initial Catalog=dbname; User ID =user; Password =pass;";

Затем у меня есть выпадающий список, который показывает все таблицы в этой базе данных. Строка подключения прекрасно работает с одной базой данных (начальный каталог). Но что, если я хочу вытащить таблицы из 2 баз данных на одном сервере. Пользователь в SQL Server имеет доступ к обеим базам данных. Какую строку подключения я тогда использую?

Простой способ был бы Initial Catalog=dbname,db2name. Но это не работает, конечно.

Автор: user2980341 Источник Размещён: 08.12.2018 06:18

Ответы (4)


-1 плюса

13 Репутация автора

Изменить начало

1) Если вы хотите показать все таблицы во всех базах данных, пожалуйста, заполните поле со списком одинаково. См .: Как мне перечислить все таблицы во всех базах данных в SQL Server в одном наборе результатов?

2) Или вы можете предоставить другое поле со списком для отображения списка баз данных, перед списком со списком таблиц, как только пользователь выберет имя БД, передайте его в запрос. Это полезный выбор, поскольку существует возможность иметь таблицу с одинаковым именем в двух базах данных. (Например: t_users в db_1 и db_2)

3) Если вы ограничены двумя базами данных, используйте пункт where в приведенном выше пункте (1)

Изменить конец

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

SELECT a.ID, b.ID
FROM Database1.dbo.table1 a
INNER JOIN Database2.dbo.table2 b on a.ID = b.ID

В вашем случае вы можете иметь свой запрос хранимой процедуры, аналогичный приведенным ниже запросам.

select * 
from sys.tables --to fetch list of tables from the DB which you app connected to 

select * 
from IAMS_Discr_Complaints.sys.tables --to fetch tables from another DB on the same server
Автор: Surendra Размещён: 08.12.2018 07:03

0 плюса

592839 Репутация автора

Если этот пользователь действительно имеет права доступа к другой базе данных - вы можете просто использовать ChangeDatabaseметод на вашем SqlConnection- как это:

string strConnection = @"Data Source=servername;Initial Catalog=dbname; User ID =user; Password =pass;";

using (SqlConnection conn = new SqlConnection(strConnection))
{
     // do what you want to do with "dbname"
     ......

     // switch to "db2name" - on the same server, with the same credentials 
     conn.ChangeDatabase("db2name");

     // do what you want to do with "db2name"
     ......
}
Автор: marc_s Размещён: 08.12.2018 08:27

0 плюса

1 Репутация автора

Я закончил тем, что использовал два комбинированных списка в моей форме. Один для баз данных и один для таблиц. Когда я выбираю базу данных в первом комбинированном списке, второй автоматически показывает табели в этой базе данных. Мне намного проще работать с двумя комбинированными списками, используя разные соединения. Вот некоторая часть моего кода с решением:

 public partial class Form1 : Form                  
    {
    SqlDataAdapter sda;
    SqlCommandBuilder scb;
    DataTable dt;

    SqlDataAdapter sda2;
    SqlCommandBuilder scb2;
    DataTable dt2;

    public Form1()
    {
        InitializeComponent();
    }
//ON FORM LOAD
 private void Form1_Load(object sender, EventArgs e)
        {
            String stringConnection = @"Data Source=SERVER_NAME;    Initial Catalog =DB_NAME; User ID =USER; Password =PASS;";
            SqlConnection con2 = new SqlConnection(stringConnection);

            try
            {
            con2.Open();
            SqlCommand sqlCmd2 = new SqlCommand();
            sqlCmd2.Connection = con2;
            sqlCmd2.CommandType = CommandType.Text;
            sqlCmd2.CommandText = "SELECT name FROM sys.databases EXCEPT SELECT name FROM sys.databases WHERE name='master' OR name='model' OR name='msdb' OR name='tempdb'";
            SqlDataAdapter sqlDataAdap2 = new SqlDataAdapter(sqlCmd2);
            DataTable dtRecord2 = new DataTable();
            sqlDataAdap2.Fill(dtRecord2);
            dtRecord2.DefaultView.Sort = "name ASC";
            comboBox2.DataSource = dtRecord2;
            comboBox2.DisplayMember = "NAME";
            comboBox2.DisplayMember = "NAME";
            con2.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
//BUTTON FOR SHOWING TABELS IN DATAGRIDVIEW
private void ShowTbl_Click(object sender, EventArgs e)
    {
        string selected = this.ComboBox1.GetItemText(this.ComboBox1.SelectedItem);
        string DBselected = this.comboBox2.GetItemText(this.comboBox2.SelectedItem);
        SqlConnection con = new SqlConnection(@"Data Source=SERVER_NAME;Initial Catalog =" + DBselected + "; User ID=USER;Password=PASS;");
        sda = new SqlDataAdapter(@"SELECT *  FROM dbo.[" + selected + "]", con);
        dt = new DataTable();
        sda.Fill(dt);
        dataGridView1.DataSource = dt;
        string ComboBoxSelected = ComboBox1.GetItemText(ComboBox1.SelectedItem);
        con.Close();
    }
//WHEN I SELECT DATABASE IN COMBOBOX2, COMBOBOX1 DISPLAYS TABLES IN THAT DATABASE
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        string selectedbase = this.comboBox2.GetItemText(this.comboBox2.SelectedItem);
        string aa = comboBox2.SelectedText;
        String strConnection = @"Data Source=SERVER_NAME;Initial Catalog =" + selectedbase+ "; User ID =USER; Password =PASS;";
        SqlConnection con = new SqlConnection(strConnection);
        try
        {
            con.Open();
            SqlCommand sqlCmd = new SqlCommand();
            sqlCmd.Connection = con;
            sqlCmd.CommandType = CommandType.Text;
            sqlCmd.CommandText = "Select table_name from information_schema.tables";
            SqlDataAdapter sqlDataAdap = new SqlDataAdapter(sqlCmd);
            DataTable dtRecord = new DataTable();
            sqlDataAdap.Fill(dtRecord);
            dtRecord.DefaultView.Sort = "table_name ASC";
            ComboBox1.DataSource = dtRecord;
            ComboBox1.DisplayMember = "TABLE_NAME";
            ComboBox1.DisplayMember = "TABLE_NAME";

            con.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
Автор: user2980341 Размещён: 09.12.2018 08:18

0 плюса

1 Репутация автора

Но у меня возникает другая проблема, когда я вызываю соединение с сетью данных:

... Dim da As New SqlDataAdapter ("Выберите dbo.admProductos.CCODIGOPRODUCTO, dbo.admProductos.CNOMBREPRODUCTO, dbo.admAlmacenes.CCODIGOALMACEN, dbo.admAlmacenes.CNOMBREALMACENCOMCOM-DECO DECO .admNumerosSerie.CESTADO <3, затем «1» еще Приведение (dbo.admNumerosSerie.CESTADO в качестве varchar (30)) заканчивается как CESTADO FROM dbo.admProductos ПОЛНОЕ НАСТРОЕНИЕ В ПРИЛОЖЕНИИ dbo.admNumerosSerie ON dbo.admProductTO.FID.TOIDDRODRODRODRODRODRODRODCROD ВНЕШНЕЕ СОЕДИНЕНИЕ dbo.admAlmacenes ON dbo.admNumerosSerie.CIDALMACEN = dbo.admAlmacenes.CIDALMACEN WHERE (dbo.admProductos.CTIPOPRODUCTO = 1) И (dbo.admNumerosSerie.CESTADO <3)

                                 UNION 
                                 SELECT   dbo.admProductos.CCODIGOPRODUCTO, dbo.admProductos.CNOMBREPRODUCTO, dbo.admAlmacenes.CCODIGOALMACEN, dbo.admAlmacenes.CNOMBREALMACEN, dbo.admProductos.CCONTROLEXISTENCIA
                                 , dbo.admCapasProducto.CPEDIMENTO, Cast(dbo.admCapasProducto.CEXISTENCIA as varchar(30)) CEXISTENCIA

                                 FROM         dbo.admProductos FULL OUTER JOIN dbo.admCapasProducto 
                                 ON dbo.admProductos.CIDPRODUCTO = dbo.admCapasProducto.CIDPRODUCTO 
                                 FULL OUTER JOIN dbo.admAlmacenes ON dbo.admCapasProducto.CIDALMACEN = dbo.admAlmacenes.CIDALMACEN
                                 WHERE     (dbo.admProductos.CTIPOPRODUCTO = 1) AND (dbo.admCapasProducto.CEXISTENCIA <> 0)", cn)

Как я могу вызвать второй запрос из второй базы данных и показать его в том же самом виде данных первой базы данных?

Автор: Eduardo Alvarez Размещён: 12.06.2019 09:47
Вопросы из категории :
32x32