Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Получение имен системных таблиц


Автор: Georgich 12.3.2011, 20:13
Приветствую.

Полностью название топика (не уместилось): Получение имен системных таблиц, имен их колонок и значений (ASP и MS SQL).

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

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

Автор: jonie 12.3.2011, 22:06
ну получаете коннекшен стринг, далее получаете список таблиц и, если надо, типы колонок в ней.
Код

select object_id,* from sys.tables where type='U'  --object_id это OBJECTID таблицы


--тут фильтруем по OBJECTID таблицы
select sc.* from sys.columns sc
join sys.types t on t.user_type_id = sc.user_type_id
join sys.tables st on st.object_id = sc.object_id

Автор: Georgich 13.3.2011, 00:16
jonie, собственно, мне надо этот самый коннекшн стринг вбить самому.
А вот как его правильно вбить, чтобы приконнектиться к системным БД (master, model, msdb)?

Спасибо.

Автор: jonie 13.3.2011, 11:48
Georgich, http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx
уже не в моде?

Автор: Georgich 13.3.2011, 13:15
jonie, спасибо, но я обошелся таким представлением:
Код

string connectString = "Server=Data Source=localhost\\SQLEXPRESS;Initial Catalog=master;Integrated Security=SSPI;";


Еще вопросец:
Есть страница с TextBox, в которую вводим конекшнстринг. Нажимаем кнопку, на следующей странице (ShowDB.aspx), в случае удачного коннекта, в листбокс добавятся имена таблиц. Сосбственно код извлечения и добавления где нужно писать? На странице с логином (Login.aspx) или уже в ShowDB.aspx?

Спасибо. 

Автор: jonie 13.3.2011, 13:21
Georgich, ну вообще вы законнектились от имени юзера, запустившего IIS, если только не сделали имперсонализацию....

Автор: Georgich 13.3.2011, 13:40
jonie, и что это значит? Я не смогу считать данные из системных таблиц или какие-то другие ограничения есть?

Автор: Freyzer 14.3.2011, 08:31
Georgich

Я так понимаю, ты хочешь готового решения. Дам, но за деньги.

Автор: Georgich 14.3.2011, 09:07
Freyzer, если бы хотел, то заявил бы напрямую.

Автор: Georgich 15.3.2011, 12:49
Приветствую. Сначала код:
Код

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
                return;

            if (Page.PreviousPage != null)
            {
                ArrayList allData_ = GetTableList();
                ListBox1.DataSource = allData_;
                ListBox1.DataBind();
            }
        }

        protected ArrayList GetTableList()
        {
            ArrayList allData = new ArrayList();
            SqlDataReader myReader = null;
            SqlCommand getTableNamesCommand = new SqlCommand("SELECT name FROM dbo.sysobjects WHERE type = 'U' ORDER BY name", PreviousPage.connDB.GetDBConnection(PreviousPage.ConnectionString));
            myReader = getTableNamesCommand.ExecuteReader();

            if (myReader.HasRows)
            {
                foreach (DbDataRecord rezult in myReader)
                {
                    allData.Add(rezult.GetString(0));
                }
            }
            
            return allData;
        }

        protected Dictionary<string, string> GetColunmList()
        {
            Dictionary<string, string> allData = new Dictionary<string, string>();
            SqlDataReader myReader = null;
            string query = string.Format("SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{0}' ORDER BY COLUMN_NAME", ListBox1.SelectedItem.ToString());
            SqlCommand getColunmNameCommand = new SqlCommand(query, PreviousPage.connDB.GetDBConnection(PreviousPage.ConnectionString));
            myReader = getColunmNameCommand.ExecuteReader();

            if (myReader.HasRows)
            {
                foreach (DbDataRecord rezult in myReader)
                {
                    allData.Add(rezult.GetString(0),rezult.GetString(1));
                }
            }

            return allData;
        }

        protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Dictionary<string, string> allData_ = GetColunmList();
            GridView1.DataSource = allData_;
            GridView1.DataBind();
        }

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

SqlCommand getColunmNameCommand = new SqlCommand(query, PreviousPage.connDB.GetDBConnection(PreviousPage.ConnectionString));

Не задана ссылка на объект. Странно, ведь соединение с БД я создал и установил. Может быть дело в PreviousPage?

Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)