SQL ОШИБКА: соединение не было закрыто. Текущее состояние соединения открыто - PullRequest
0 голосов
/ 03 февраля 2012

EDIT

После двухдневного изучения я вижу одну проблему. Я все еще открывал исходное соединение. Поэтому я изменил внутренние открытые операторы на conn2.Open. Затем я изменил второй внутренний запрос, чтобы все переменные были номером 3 вместо 2, чтобы они полностью отличались от предыдущего запроса. В этот момент я получил ошибку:

Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт первым.

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

КОНЕЦ РЕДАКТИРОВАНИЯ

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

Итак, сначала «внешний» SQL-запрос извлекает некоторые данные из таблицы элементов, которая содержит информацию о покупателе, а также информацию о категории. Для каждого товара он проверяет информацию своего покупателя.

Во-вторых, первый «внутренний» SQL-запрос извлекает информацию о категории из пользовательской таблицы. Затем выполняется некоторый код, чтобы увидеть, отмечены ли они как покупки из категории «внешнего» запроса. Если это не так, он добавляет категорию в строковую переменную.

Наконец, второй «внутренний» SQL-запрос обновляет таблицу пользователей для текущего пользователя новым списком категорий.

Я спрашивал о том, как выполнять подобные запросы раньше, но мне всегда предлагалось объединить запросы в один. Это работало для других запросов, но я не могу сделать это здесь. Я должен перебрать каждую запись внешнего запроса, чтобы выполнить необходимые функции внутри него. Но моя проблема здесь в том, что я получаю ошибку SQL, которая говорит о том, что соединение не было закрыто, и это указывает на перехват внешнего запроса (для 'conn').

Я пытался настроить свои 2 внутренних запроса так, чтобы они использовали разные переменные соединения (conn2 и conn3), а также разные переменные strSQL, но это не помогло. И я все еще новичок, когда дело доходит до SQL, программируя с использованием MySQL до этой проблемы. Любая помощь будет с благодарностью.

    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionName"].ToString()))
    using (SqlCommand strSQL = conn.CreateCommand())
    {
        strSQL.CommandText = "SELECT field FROM itemsTable";
        try
        {
            conn.Open();
            using (SqlDataReader itemReader = strSQL.ExecuteReader())
            {
                while (itemReader.Read())
                {
                    {Do some stuff here}

                    using (SqlConnection conn2 = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionName"].ToString()))
                    using (SqlCommand strSQL2 = conn2.CreateCommand())
                    {
                        strSQL2.CommandText = "SELECT fields FROM userTable";
                        try
                        {
                            conn2.Open();
                            using (SqlDataReader itemReader2 = strSQL2.ExecuteReader())
                            {
                                while (itemReader2.Read())
                                {
                                    {Do stuff here}
                                }
                                itemReader2.Close();
                            }
                        }
                        catch (Exception e3)
                        {
                            throw new Exception(e3.Message);
                        }
                        finally
                        {
                            conn2.Close();
                        }
                    }

                    {Do some more stuff here}

                    using (SqlConnection conn2 = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionName"].ToString()))
                    using (SqlCommand strSQL2 = conn2.CreateCommand())
                    {
                        strSQL2.CommandText = "UPDATE userTable set field='value'";
                        try
                        {
                            conn2.Open();
                            strSQL2.ExecuteNonQuery();
                        }
                        catch (Exception e2)
                        {
                            throw new Exception(e2.Message);
                        }
                        finally
                        {
                            conn2.Close();
                        }
                    }

                    {Do even more stuff here.}
                }

                itemReader.Close();
            }
        }
        catch (Exception e1)
        {
            throw new Exception(e1.Message);
        }
        finally
        {
            conn.Close();
        }
    }

1 Ответ

1 голос
/ 03 февраля 2012

С conn.Open () происходит какая-то необычная логика. Я вижу, что он использовался несколько раз, но я думаю, что вы хотите использовать conn2.Open () во внутренних операторах using после первого вызова.

...