ошибка «уже существует открытый носитель данных, связанный с этой командой, который должен быть закрыт в первую очередь»

Я написал этот метод для минимизации long чисел:

public string minifyLong(long value)
    {
        if (value >= 100000000000)
            return (value / 1000000000).ToString("#,0") + " B";
        if (value >= 10000000000)
            return (value / 1000000000D).ToString("0.#") + " B";
        if (value >= 100000000)
            return (value / 1000000).ToString("#,0") + " M";
        if (value >= 10000000)
            return (value / 1000000D).ToString("0.#") + " M";
        if (value >= 100000)
            return (value / 1000).ToString("#,0") + " K";
        if (value >= 10000)
            return (value / 1000D).ToString("0.#") + " K";
        return value.ToString("#,0"); 
    }
24
задан Richard Everett 4 March 2014 в 13:24
поделиться

4 ответа

INSERT INTO tablename (field1, field2)
    SELECT 3, field1 FROM sourcetable

Один оператор SQL вместо одного на вставку. Не уверен, что это сработает для вашей реальной проблемы, но для приведенного вами примера это гораздо лучший запрос, чем выполнять их по одному.

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

3
ответ дан 28 November 2019 в 22:10
поделиться

Какую версию SQL Server вы используете? Проблема может быть в следующем:

(из http://msdn.microsoft.com/en-us/library/9kcbe65k.aspx )

При использовании версий SQL Server до SQL Server 2005, когда используется SqlDataReader, связанный SqlConnection занят обслуживанием SqlDataReader. Находясь в этом состоянии, с SqlConnection нельзя выполнять никакие другие операции, кроме его закрытия. Это так до тех пор, пока не будет вызван метод Close SqlDataReader.

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

Что-то вроде:

objCommand = new SqlCommand("SELECT field1, field2 FROM sourcetable", objConn);

objDataReader = objCommand.ExecuteReader();

List<object> values = new List<object>();
while (objDataReader.Read())
{
    values.Add(objDataReader[0]);
}

objDataReader.Close();

foreach (object value in values)
{
    objInsertCommand = new SqlCommand("INSERT INTO tablename (field1, field2) VALUES (3, '" + value + "')", objConn);
    objInsertCommand.ExecuteNonQuery();
}
1
ответ дан 28 November 2019 в 22:10
поделиться

Чтобы его можно было легко утилизировать, я использую следующий шаблон кодирования:

`using (SqlConnection connection = new SqlConnection("your connection string"))
        {
            connection.Open();
            using (SqlCommand cmd = connection.CreateCommand())
            {
                cmd.CommandText = "Select * from SomeTable";
                using (SqlDataReader reader = cmd.ExecuteReader())
                {

                    if(reader.HasRows)
                    { 
                       while(reader.Read()){
                       // assuming that we've a 1-column(Id) table 
                       int id = int.Parse(reader[0].ToString()); 

                       }
                    }
                }
            } 
            connection.Close()
        }`
0
ответ дан 28 November 2019 в 22:10
поделиться

Лучшее решение: есть проблема только с вашим значением «CommandText». Пусть это будет SP или обычный Sql Query.

  • Проверка 1. Значение параметра, которое вы передаете в запросе Sql, не меняется и повторяется снова и снова в вашем ExecuteReader.

  • Проверка 2: строка запроса Sql сформирована неправильно.

  • Проверка 3: Пожалуйста, создайте самый простой код следующим образом.

    string ID = "C8CA7EE2";
    string myQuery = "select * from ContactBase where contactid=" + "'" + ID + "'";
    string connectionString = ConfigurationManager.ConnectionStrings["CRM_SQL_CONN_UAT"].ToString(); 
    SqlConnection con = new SqlConnection(connectionString);
    con.Open();
    SqlCommand cmd = new SqlCommand(myQuery, con);
    DataTable dt = new DataTable();
    dt.Load(cmd.ExecuteReader());
    con.Close();
    
0
ответ дан 28 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: