none
Получение имен системных таблиц, имен их колонок и значений (ASP и MS SQL) RRS feed

  • Вопрос

  • Здравствуйте снова.

    Здесь для меня вообще темный лес. Что дано и что надо. На форме три textbox'а: username, password, url. Username и password не относятся к БД (к ее connectionstring). Это аутентификация пользователя. Url, как мне объяснили, должно быть connectionstring (без логина и пароля) к БД. Т.е. мне надо вбить логин, пароль и эту самую строку для коннекта. Если все удачно, то вывести имена системных таблиц в ListBox, например. Далее, тыкая по любому имени таблицы в этом ListBox'е в DataGrid (или в каком-нибудь контроле, способном выводить два столбца) выводятся имена колонок этой таблицы и тип данных. Что-то вроде, как в этом мануале: http://msdn.microsoft.com/ru-ru/library/ms179932.aspx

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

    12 марта 2011 г. 16:59

Ответы

  • Почитайте здесь: Программное получение структуры БД
    Blog: svyatoslavpankratov.blogspot.com
    • Предложено в качестве ответа PashaPash 13 марта 2011 г. 11:53
    • Помечено в качестве ответа Geokish 15 марта 2011 г. 15:28
    13 марта 2011 г. 11:00
  • Почитайте для начала Руководство для начинающих по использованию SQL Server из C#

    Потом Подключение к Access

    Скорее всего Вы имеете ввиду не use, а using. Про это можно почитать тут. Если что не понятно, пишите =)


    Blog: svyatoslavpankratov.blogspot.com
    • Помечено в качестве ответа Geokish 14 марта 2011 г. 10:36
    • Снята пометка об ответе Geokish 15 марта 2011 г. 12:07
    • Помечено в качестве ответа Geokish 15 марта 2011 г. 15:28
    13 марта 2011 г. 22:30
  • Ой =) Это я Вам скинул запрос по получению всех столбцов у нужной вам таблицы. Извиняюсь, поторопился =) Получение всех таблиц у подключенной базы данных будет выглядеть следующим образом:

    query = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' and TABLE_NAME != 'sysdiagrams'"
    

    [My blog]
    • Помечено в качестве ответа Geokish 14 марта 2011 г. 10:36
    • Снята пометка об ответе Geokish 15 марта 2011 г. 12:07
    • Помечено в качестве ответа Geokish 15 марта 2011 г. 15:28
    14 марта 2011 г. 10:03
  • Спасибо за совет, но до его прочтения сделал так:

          string connectionString = ConnectionStringTextBox.Text;
          SingletonDB connDB = SingletonDB.Instance;
          SqlDataReader myReader = null;
          SqlCommand getTableNamesCommand = new SqlCommand("SELECT name FROM dbo.sysobjects WHERE type = 'U' ORDER BY name", connDB.GetDBConnection(connectionString));
          myReader = getTableNamesCommand.ExecuteReader();
    
          while (myReader.Read())
          {
            ListBox1.Items.Add(myReader.GetString(0));
          }
    
    Продолжаю дальше разбираться. Затягивает, черт возьми...

    • Помечено в качестве ответа Geokish 14 марта 2011 г. 10:36
    • Снята пометка об ответе Geokish 15 марта 2011 г. 12:07
    • Помечено в качестве ответа Geokish 15 марта 2011 г. 15:28
    14 марта 2011 г. 10:35

Все ответы

  • Почитайте здесь: Программное получение структуры БД
    Blog: svyatoslavpankratov.blogspot.com
    • Предложено в качестве ответа PashaPash 13 марта 2011 г. 11:53
    • Помечено в качестве ответа Geokish 15 марта 2011 г. 15:28
    13 марта 2011 г. 11:00
  • Спасибо за ссылку.

    Т.к. я новичок в этом деле, то есть у меня еще некоторые вопросы. Вот есть у меня страница с textBox, в который я вбиваю connectionstring. Имею следующий код:

        protected void Button1_Click(object sender, EventArgs e)
        {
          string connectionString = ConnectionStringTextBox.Text;
          SqlConnection connection = new SqlConnection();
    
          try
          {
            connection = new SqlConnection(connectionString);
            connection.Open();
    
          }
          catch
          { }
          finally
          {
            connection.Dispose();
          }
        }
    
    А вот use и прочее где мне необходимо использовать? Еще раз извиняюсь, ибо только учусь этой науке. Спасибо.

    13 марта 2011 г. 16:43
  • Почитайте для начала Руководство для начинающих по использованию SQL Server из C#

    Потом Подключение к Access

    Скорее всего Вы имеете ввиду не use, а using. Про это можно почитать тут. Если что не понятно, пишите =)


    Blog: svyatoslavpankratov.blogspot.com
    • Помечено в качестве ответа Geokish 14 марта 2011 г. 10:36
    • Снята пометка об ответе Geokish 15 марта 2011 г. 12:07
    • Помечено в качестве ответа Geokish 15 марта 2011 г. 15:28
    13 марта 2011 г. 22:30
  • О, спасибо. Для новичка очень ценный материал.

    Поставил себе еще MS SQL Server Managment Studio Express, чтобы визуально видеть, что происходит при формировании запроса. Нашел вот такой запрос для получения имен всех системных таблиц:

    IF OBJECT_ID('sys.schemas') IS NULL
      SELECT B.name + '.' + A.name
       FROM sysobjects A, sysusers B
       WHERE A.type IN ('U', 'S')
        AND B.uid = OBJECTPROPERTY ( A.id , 'ownerid' )
       ORDER BY B.name + '.' + A.name
    ELSE
      SELECT B.name + '.' + A.name
       FROM sysobjects A, sys.schemas B
       WHERE A.type IN ('U', 'S')
        AND B.schema_id = A.uid
       ORDER BY B.name + '.' + A.name
    

    Пытался потыкать самостоятельно, чтобы извлечь данные из той БД, к которой я приконнектился строкой:

    Data Source=localhost\SQLEXPRESS;Initial Catalog=master;Integrated Security=SSPI;
    

    Из этой строки вы видите, что я соединяюсь с системной БД master. Вопрос в следующем: как составить запрос по извлечению имен таблиц из той БД, к которой присоединился?

    Разумеется, в коннекшн стринге может быть и имя другой системной БД, например model (ибо эту самую коннекшн стринг я ввожу сам в TextBox). Спасибо.

    14 марта 2011 г. 7:21
  • Получить все поля у нужной таблицы из подключенной базы данных можно с помощью следующего запроса:

     query += string.Format("select TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, DATA_TYPE, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH, 
    			CHARACTER_SET_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '{0}'; ",row["TABLE_NAME"]);

    [My blog]
    14 марта 2011 г. 9:32
  • Как-то сложновато. У меня получился вот такой запрос:

    SqlDataReader myReader = null;
    SqlCommand getTableNamesCommand = new SqlCommand("SELECT name FROM dbo.sysobjects WHERE type = 'U'<br/>
    ORDER BY name", connDB.GetDBConnection(connectionString));
    myReader = getTableNamesCommand.ExecuteReader();
    

    А как добавить полученные имена таблиц в ListBox?

     

    while (myReader.Read())
    {
      ListBox1.Items.Add(...);
    }
    
    Спасибо за помощь.
    14 марта 2011 г. 9:59
  • Ой =) Это я Вам скинул запрос по получению всех столбцов у нужной вам таблицы. Извиняюсь, поторопился =) Получение всех таблиц у подключенной базы данных будет выглядеть следующим образом:

    query = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' and TABLE_NAME != 'sysdiagrams'"
    

    [My blog]
    • Помечено в качестве ответа Geokish 14 марта 2011 г. 10:36
    • Снята пометка об ответе Geokish 15 марта 2011 г. 12:07
    • Помечено в качестве ответа Geokish 15 марта 2011 г. 15:28
    14 марта 2011 г. 10:03
  • Воспользуйтесь SqlDataAdapter для чтения данных из базы. С помощью этого класса Вы можете заполнить DataTabe нужными Вам данными при запросе, после чего обойдя DataTable в цикле вывести все имена в ListBox.
    [My blog]
    14 марта 2011 г. 10:08
  • Спасибо за совет, но до его прочтения сделал так:

          string connectionString = ConnectionStringTextBox.Text;
          SingletonDB connDB = SingletonDB.Instance;
          SqlDataReader myReader = null;
          SqlCommand getTableNamesCommand = new SqlCommand("SELECT name FROM dbo.sysobjects WHERE type = 'U' ORDER BY name", connDB.GetDBConnection(connectionString));
          myReader = getTableNamesCommand.ExecuteReader();
    
          while (myReader.Read())
          {
            ListBox1.Items.Add(myReader.GetString(0));
          }
    
    Продолжаю дальше разбираться. Затягивает, черт возьми...

    • Помечено в качестве ответа Geokish 14 марта 2011 г. 10:36
    • Снята пометка об ответе Geokish 15 марта 2011 г. 12:07
    • Помечено в качестве ответа Geokish 15 марта 2011 г. 15:28
    14 марта 2011 г. 10:35
  • Спасибо вам большое за советы и за помощь.

    Вот, появились еще вопросы. Как я говорил выше, у меня есть страница Login.aspx, в которой мы вводим свой логин, пароль и конекшн стринг до БД. На ней я проверяю все ли введено (логин, пароль, строка), правда конекшн стринг на правильность еще не сделал, затем создаю экземпляр класса для подключения к БД и перенаправляю на страницу ShowDB.aspx. На этой странице уже происходит подключение к БД и обработка запроса (код ShowDB):

        protected void Page_Load(object sender, EventArgs e)
        {
          if (IsPostBack)
            return;
    
          if (Page.PreviousPage != null)
          {
            SqlDataReader myReader = null;
            SqlCommand getTableNamesCommand = new SqlCommand("SELECT name FROM dbo.sysobjects WHERE type = 'U'<br/>
     ORDER BY name", PreviousPage.connDB.GetDBConnection(PreviousPage.ConnectionString));
            myReader = getTableNamesCommand.ExecuteReader();
    
            ListBox1.Items.Clear();
    
            while (myReader.Read())
            {
              ListBox1.Items.Add(myReader.GetString(0));
            }
          }
        }
    
        protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
          SqlDataReader myReader = null;
          string query = string.Format("SELECT COLUMN_NAME,
    DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE 
    TABLE_NAME = '{0}'", ListBox1.SelectedItem.ToString());
          SqlCommand getColunmNameCommand = new SqlCommand(query, PreviousPage.connDB.GetDBConnection(PreviousPage.ConnectionString));
          myReader = getColunmNameCommand.ExecuteReader();
        }
    

    Но тут я столкнулся с такой проблемой, что при выборе элемента в ListBox, вываливается исключение, которое происходит из-за того, что "не задана ссылка на объект". Вот хочу спросить, как логичнее было бы реализовать запросы к БД и ее подключение? По сути, подключение надо установить на странице Login.aspx, а запросы уже выполнять на странице ShowDB.aspx (без указания подключения в SqlCommand). Но у меня так не получается. Если я странице с логином делаю connDB.GetDBConnection(ConnectionString) , то на странице ShowDB получаю исключение, что свойство Connection не инициализировано.

    Надеюсь на вашу помощь. Спасибо.

    15 марта 2011 г. 7:02
  • Этот вопрос следовало задать отдельным топиком, т.к. с получением имен таблиц, колонок и тп вы разобрались и эта проблема решена. Я могу создать новый топик из вашего сообщения или вы сами можете создать новый топик, а свое сообщение удалить. Также не забудьте отметить ответы. Спасибо.


    Для связи [mail]
    15 марта 2011 г. 14:50
    Модератор
  • Да, создайте, пожалуйста, топик.

    Ответы пометил.

    15 марта 2011 г. 15:28
  • К сожалению разделить топик не удается (внутренняя ошибка форума). Придется вам создать новый вопрос.


    Для связи [mail]
    15 марта 2011 г. 15:58
    Модератор
  • Будет ли разделение топика на два? Или вторая проблема уже решена?
    [My blog] [My E-mail]
    17 марта 2011 г. 15:57