OdbcConnection.GetSchema ( "ТАБЛИЦА");не работает - PullRequest
1 голос
/ 02 января 2012

Я предполагаю, что не все SQL созданы одинаково.Я погружаюсь в мир DSN и драйверов ODBC в c # и немного в этом разбираюсь.Я пытаюсь получить все таблицы в базе данных, определенной DSN, о которой я знаю только с помощью драйвера Transoft ODBC.Я могу подключиться к нему и получить обратно таблицы, используя код:

 public void ConnectToData(String dsn)
    {
        System.Data.Odbc.OdbcConnection conn =
            new System.Data.Odbc.OdbcConnection();

        //conn.ConnectionString = "FIL=MS Access;DSN=" + dsn;
        conn.ConnectionString = "DSN=" + dsn; //dsn equals "Company_Shared"
        try
        {
            conn.Open();
            MessageBox.Show("Connected!");
            lstBoxLogs.Items.Add("Connected");                                
            DataTable tableschema = conn.GetSchema("TABLES");
            DataSet set = tableschema.DataSet;  
            // first column name
            for (int i = 0; i < tableschema.Columns.Count; i++)
            {
                lstBoxLogs.Items.Add(tableschema.Columns[i].ColumnName);
            }

            lstBoxLogs.Refresh();
            MessageBox.Show(tableschema.Columns.Count + " tables found");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Failed to connect to data source: " + ex.GetBaseException().Message);
        }
        finally
        {
            conn.Close();
        }
    }

Он отлично соединяется и сообщает о таблицах, но не о тех таблицах, которые, как я знаю, я ищу в базе данных, возвращает следующее:

TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS

Я не уверен, как получить реальные имена таблиц из этой информации, поэтому я могу просто вывести все данные в каждомстол (это все, что я хочу сделать).Это связано с тем, что мне нужно прочитать, какой тип SQL использует база данных transoft, и делает ли это вызов conn.GetSchema("TABLES"); бесполезным?

1 Ответ

4 голосов
/ 02 января 2012

Будет ли это работать?

using(DataTable tableschema = conn.GetSchema("TABLES"))
{
    // first column name
    foreach(DataRow row in tableschema.Rows)
    {
        lstBoxLogs.Items.Add(row["TABLE_NAME"].ToString());
    }
}

РЕДАКТИРОВАТЬ: Исправлен код, чтобы не использовать DataSet.

РЕДАКТИРОВАТЬ: Обновлен код для будущих читателей, чтобы реализовать лучшие практики утилизации DataTable.

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