C # - OleDbConnection.Open () вызывает сбой - PullRequest
1 голос
/ 27 июня 2011

Совершенно новый для C #, в любом случае, у меня есть этот метод Initialise, который я написал, он в основном создает соединение с базой данных MS2007 Access, заполняет DataSet четырьмя таблицами DataTable, которые являются результатом некоторых запросов.

    public frmDBCompareForm()
    {
        ///
        /// Required for Windows Form Design support
        ///
        InitializeComponent();
        frmDBCompareForm_Initialize();

        //
        // TODO: Add any constructor code
        //
        if (_InstancePtr == null) _InstancePtr = this;
    }

И начало метода инициализации, включая заполнение одного из таблиц данных:

private void frmDBCompareForm_Initialize()
    {
        // Fill DataSet with 3 DataTables, these tables will be 
        // made up of the from sQuery.
        try
        {
            // Create a new DataSet
            DataSet dsSite1 = new DataSet();
            // Set up the connection strings to HCAlias.accdb
            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\HCAlias.accdb;Persist Security Info=False;";
            con.Open();
            //
            // Table 1 - dtSite1Name [cmbSite1]
            //
            dtSite1Name = new DataTable();
            string sQuery = "SELECT SourceName From Sites";
            OleDbCommand cmdSite1Name = new OleDbCommand(sQuery, con);
            OleDbDataAdapter myDASite1Name = new OleDbDataAdapter(cmdSite1Name);
            myDASite1Name.Fill(dsSite1, "dtSite1Name");
            cmbSite1.DataSource = dtSite1Name;
            cmbSite2.DataSource = dtSite1Name;

Может ли кто-нибудь указать мне правильное направление, чтобы я поступил так, как я?Любые советы или рекомендации, чтобы решить эту проблему с подключением?Я гуглил как босс, но, похоже, не могу точно найти проблему, с которой я столкнулся.

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

Вам также необходимо закрыть соединение.Добавьте также в свой блок finally с:

        using (var con = new OleDbConnection())
        {
            con.Open();
            using (var cmd = new OleDbCommand("sqlquery", conn))
            {

                try
                {
                             //do Stuff here
                }
                catch (OleDbException)
                {

                    throw;
                }

            }
         }

regards

2 голосов
/ 27 июня 2011

Эта ошибка вызвана оставлением соединения открытым. Это не обязательно произойдет сразу, но всегда после того же количества запросов.

Я предлагаю обернуть ваши классы IDisposable db с помощью операторов:

using (OleDbConnection con = new OleDbConnection())
{

}

Это автоматически вызовет реализацию метода Dispose () и закроет ваши соединения.

Из MSDN : "Оператор using гарантирует, что Dispose вызывается, даже если возникает исключение при вызове методов для объекта. Вы можете достичь того же результата, поместив объект в блок try и затем вызов Dispose в блоке finally; фактически, именно так оператор using переводится компилятором. " ... так что вам не нужно пытаться поймать, наконец,

...