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();
}
}