Открыть DataReader, должен быть закрыт: работает локально, сбой развернут.WEB API - PullRequest
0 голосов
/ 12 апреля 2019

Следующий код прекрасно работает при локальной отладке. Всякий раз, когда я помещаю его на свой сервер разработки, он больше не работает. Я нашел фрагмент кода, который вызывает проблему, и мне удалось исправить, добавив строку с комментарием ниже, но я не уверен, почему мне пришлось добавить строку. В Web.Config у меня есть MultipleActiveResultSets=true;, что должно привести к тому, что этого не произойдет. Поэтому я не уверен, почему мне нужно добавить эту строку.

public bool PersistStuff(string Account, List<Acknowledgement> acks)
{
    string sql = "my.sp.AccountProcedure";

    bool retVal = true;

    using (SqlConnection conn = new SqlConnection(_accountConnection))
    {
        conn.Open();

        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@Account", System.Data.SqlDbType.VarChar, 50)).Value = Account;

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    int id = int.Parse(reader[0].ToString());

                    //*************************
                    // This is the line I added

                    reader.Close();

                    //*************************

                    sql = "my.sp.AccountAcknowledgementProcedure";

                    using (SqlCommand cmd2 = new SqlCommand(sql, conn))
                    {
                        cmd2.CommandType = System.Data.CommandType.StoredProcedure;

                        foreach (Acknowledgement item in acks)
                        {
                            cmd2.Parameters.Clear();

                            cmd2.Parameters.Add(new SqlParameter("@severity", System.Data.SqlDbType.VarChar, 25)).Value = item.Severity.ToString();

                            if (!string.IsNullOrEmpty(item.ErrorData))
                                cmd2.Parameters.Add(new SqlParameter("@errorData", System.Data.SqlDbType.VarChar, 500)).Value = item.ErrorData;
                            else
                                cmd2.Parameters.Add(new SqlParameter("@errorData", System.Data.SqlDbType.VarChar, 500)).Value = DBNull.Value;

                            cmd2.ExecuteNonQuery();
                        }
                    }
                }
                else
                {
                    retVal = false;
                }
            }
        }
    }

    return retVal;
}

1 Ответ

1 голос
/ 12 апреля 2019

Когда я писал вопрос, я забыл, что у меня есть xdt:Transform s в моих Web.Debug.Config и Web.Release.Config. Посмотрев мои настройки Debug и Release, ни один из них не использовал MultipleActiveResultSets=true; в строке подключения. Я изменил строки подключения в каждом конфиге, чтобы он был, и снова развернул, и все работало нормально.

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