Ошибка при чтении данных из SQL Server Express - PullRequest
0 голосов
/ 28 августа 2018

У меня очень простое утверждение выбора, но я не могу на всю жизнь понять, что не так. Я OBV замаскировал свою реальную базу данных и имя сервера для сообщения.

public List<Customer> CustomersGetAll()
{
        var customers = new List<Customer>();
        Customer customer;

        using (var command = new SqlCommand())
        {
            command.Connection = _connection;
            command.CommandText =
                " SELECT Id, Reference, Name, SupplierGln, GLN, UseCustomerProductCodes, IncludeBranchInvoices, RequireBuyerOrderNoAndDate, RequireQuantityOfTradedUnits, " + 
                "RequireQuantityOfTradedUnits, DefaultBranchCode FROM Customer ORDER BY Reference ";

            using (SqlDataReader reader =  command.ExecuteReader())
            {
                while (reader.Read())
                {
                    customer = new Customer();
                    customer.ID = (int)reader["Id"];
                    customer.Reference = (string)reader["reference"];
                    customer.Name = (string)reader["Name"];
                    customer.SupplierGLN = (string) reader["SupplierGLN"];
                    customer.GLN = (string)reader["GLN"];
                    customer.IncludeBranchInvoices = (bool)reader["IncludeBranchInvoices"];
                    customer.UseBuyerProductCodes = (bool)reader["UseCustomerProductCodes"];
                    customer.RequireBuyerOrderNoAndDate = (bool)reader["RequireBuyerOrderNoAndDate"];
                    customer.RequireReturnToSupplierNoForCredit = (bool)reader["RequireQuantityOfTradedUnits"];
                    customer.RequireQuantityOfTradedUnits = (bool)reader["RequireQuantityOfTradedUnits"];
                    customer.DefaultBranchCode = reader["DefaultBranchCode"] as string;

                    foreach (var productCode in CustomerProductCodesGetByCustomerID(customer.ID))
                    {
                        customer.ProductCodes.Add(productCode.Key, productCode.Value);
                    }

                    foreach (var branchCode in GetCustomerBranchCodes(customer.ID))
                    {
                        customer.BranchCodes.Add(branchCode.Key, branchCode.Value);
                    }

                    customers.Add(customer);
                }
            }
        }

        return customers.ToList();
 }

Я использую SQL Server 2017 Express, и в качестве строки подключения используется следующее:

public DatabaseEngine(string databasePath)
{
        try
        {
            _connectionString = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=True;MultipleActiveResultSets=True;", @"MACHINENAME\SQLEXPRESS2017", "DBNAME");

            _connection = new SqlConnection(_connectionString);

            _connection.Open();
        }
        catch
        {
            if (_connection != null)
            {
                _connection.Close();
                _connection = null;
            }

            throw;
        }
 }

Эта процедура вызывает ошибку, показанную ниже:

 /// </summary>
 private void LoadCustomers()
 {
    cboCustomers.Items.Clear();
   _customers = _database.CustomersGetAll();

   if (_customers != null)
   {
       foreach (Customer customer in _customers)
       {
          cboCustomers.Items.Add(customer);
        }
   }
 }

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

MultipleActiveResultSets=True;

Какое рекомендуемое исправление для приведенной ниже ошибки, но это не происходит для меня?.

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

enter image description here

Редактировать 1 Таким образом, я запустил свой вышеупомянутый запрос, и я все еще получаю ту же ошибку, что и выше, я перезагружаю коробку sql на случай, если что-то удерживается, поскольку его нет.

  public List<Customer> CustomersGetAll()
    {
        var customers = new List<Customer>();
        Customer customer;

        using (var connection = new SqlConnection(_connectionString))
        {


                string sql =
                    " SELECT Id, Reference, Name, SupplierGln, GLN, UseCustomerProductCodes, IncludeBranchInvoices, RequireBuyerOrderNoAndDate, RequireQuantityOfTradedUnits, " +
                    "RequireQuantityOfTradedUnits, DefaultBranchCode FROM Customer ORDER BY Reference ";

            using (var command = new SqlCommand(sql,connection))
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        customer = new Customer();
                        customer.ID = (int)reader["Id"];
                        customer.Reference = (string)reader["reference"];
                        customer.Name = (string)reader["Name"];
                        customer.SupplierGLN = (string)reader["SupplierGLN"];
                        customer.GLN = (string)reader["GLN"];
                        customer.IncludeBranchInvoices = (bool)reader["IncludeBranchInvoices"];
                        customer.UseBuyerProductCodes = (bool)reader["UseCustomerProductCodes"];
                        customer.RequireBuyerOrderNoAndDate = (bool)reader["RequireBuyerOrderNoAndDate"];
                        customer.RequireReturnToSupplierNoForCredit = (bool)reader["RequireQuantityOfTradedUnits"];
                        customer.RequireQuantityOfTradedUnits = (bool)reader["RequireQuantityOfTradedUnits"];
                        customer.DefaultBranchCode = reader["DefaultBranchCode"] as string;

                        foreach (var productCode in CustomerProductCodesGetByCustomerID(customer.ID))
                        {
                            customer.ProductCodes.Add(productCode.Key, productCode.Value);
                        }

                        foreach (var branchCode in GetCustomerBranchCodes(customer.ID))
                        {
                            customer.BranchCodes.Add(branchCode.Key, branchCode.Value);
                        }

                        customers.Add(customer);
                    }
                }
            }
        }
        return customers.ToList();
    }

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Нечто подобное может работать для вас:

public List<Customer> CustomersGetAll()
{
    var customers = new List<Customer>();
    Customer customer;
    using (var connection = new SqlConnection(_connectionString))
    using (var command = new SqlCommand(connection))
    {
        // do work...

Также вы можете избежать жесткого кодирования ваших поставщиков данных, используя пространство имен System.Data.Common и DbProviderFactory.

0 голосов
/ 28 августа 2018
command.Connection = _connection;

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

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

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

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