getoledbschematable требует открытого и доступного соединения. Текущее состояние соединения закрыто - PullRequest
0 голосов
/ 02 ноября 2018

Мой код ниже дает мне следующую ошибку, как я напечатал в заголовке

Что я здесь не так делаю?

OpenFileDialog openFileDialog1 = new OpenFileDialog();

if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    string huru = openFileDialog1.FileName;
    this.textBox1.Text = huru;
    string pathConn;
    OleDbConnection conn;
    DataTable spreadSheetData;
    string sheetName = "";
    OleDbCommand onlineConnection;
    OleDbDataAdapter myDataAdapter;
    DataTable dt = new DataTable();

    if (huru.Substring(huru.Length - 3) == "lsx")
    {

        pathConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + huru
            + ";Extended Properties = \"Excel 12.0 Xml;HDR=YES\"; ";
    }
    else
    {
        pathConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + huru
            + ";Extended Properties=\"Excel 8.0;HDR=yes;\";";
    }
    conn = new OleDbConnection(pathConn);
    spreadSheetData = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
    foreach (DataRow dr in spreadSheetData.Rows)
    {
        sheetName = dr["TABLE_NAME"].ToString();
        sheetName = sheetName.Replace("'", "");
        if (sheetName.EndsWith("$"))
        {
            onlineConnection = new OleDbCommand("SELECT * FROM [" + sheetName + "]", conn);
            myDataAdapter = new OleDbDataAdapter(onlineConnection);
            dt = new DataTable();
            dt.TableName = sheetName;
            myDataAdapter.Fill(dt);
            ds.Tables.Add(dt);
        }
    }
}

spreadSheetData начинает обнуляться

мои коды относятся к Excel для DataGridView 1-й ответ от JohnG

и это видео https://www.youtube.com/watch?v=CfNMPDJVjPI

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы должны открыть соединение перед использованием:

conn = new OleDbConnection(pathConn);
conn.Open();

Вы также должны использовать оператор «Using» для правильного удаления соединения, когда оно больше не используется.

OpenFileDialog openFileDialog1 = new OpenFileDialog();
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string huru = openFileDialog1.FileName;
                this.textBox1.Text = huru;
                string pathConn;
                //OleDbConnection conn;
                DataTable spreadSheetData;
                string sheetName = "";
                OleDbCommand onlineConnection;
                OleDbDataAdapter myDataAdapter;
                DataTable dt = new DataTable();

                if (huru.Substring(huru.Length - 3) == "lsx")
                {

                    pathConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + huru
                        + ";Extended Properties = \"Excel 12.0 Xml;HDR=YES\"; ";
                }
                else
                {
                    pathConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + huru
                        + ";Extended Properties=\"Excel 8.0;HDR=yes;\";";
                }

                using(OleDbConnection conn = ew OleDbConnection(pathConn))
                {
                    //conn = new OleDbConnection(pathConn);
                    conn.Open();
                    spreadSheetData = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    foreach (DataRow dr in spreadSheetData.Rows)
                    {
                        sheetName = dr["TABLE_NAME"].ToString();
                        sheetName = sheetName.Replace("'", "");
                        if (sheetName.EndsWith("$"))
                        {
                            onlineConnection = new OleDbCommand("SELECT * FROM [" + sheetName + "]", conn);
                            myDataAdapter = new OleDbDataAdapter(onlineConnection);
                            dt = new DataTable();
                            dt.TableName = sheetName;
                            myDataAdapter.Fill(dt);
                            ds.Tables.Add(dt);
                        }
                    }
                }
            }
0 голосов
/ 02 ноября 2018

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

 OpenFileDialog openFileDialog1 = new OpenFileDialog();
        if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            //Prepare things

            using(OleDbConnection conn = new OleDbConnection(pathConn))
            {
                conn.Open(); //Added this line
                spreadSheetData = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                foreach (DataRow dr in spreadSheetData.Rows)
                {
                      //Do staff
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...