Инициализация свойства ConnectionString - PullRequest
0 голосов
/ 10 октября 2019

Хотя на этот вопрос уже есть ответы, но мой случай другой, вот как.

Он работает в первый раз, но не работает для последующих запросов.

Я создаю соединение в основном классе и передаю его в класс БД в качестве зависимости в егоконструктор, и он должен использоваться повторно для каждого вызова.

public class DB
{
    private SqlConnection conn;

    public DB(SqlConnection conn)
    {
        this.conn = conn;
    }

    public List<Records> GetRecords()
    {
        using (conn){
            conn.Open();
            using (SqlCommand cmd = new SqlCommand("SELECT * FROM Records", conn))
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                List<Records> rows = new List<Records>();
                while (reader.Read())
                {
                    rows.Add(new Records(reader.GetString(1)));
                }
                return rows;
            }
        }
    }
}

Класс вызывающего абонента

string connection = $@"
    Data Source=;
    Initial Catalog=;
    Persist Security Info=True;
    User ID={env["DATABASE_USER"]};
    Password={env["DATABASE_PASSWORD"]};";

Db db = new DB(new SqlConnection(connection));
db.GetRecords();

Ошибка: Microsoft.AspNetCore.Diagnostics. DeveloperExceptionPageMiddleware [1] Произошло необработанное исключение при выполнении запроса. System.InvalidOperationException: свойство ConnectionString не было инициализировано.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вы не должны использовать SQLConnection как поле, а как локальную переменную внутри метода. Измените ваш класс так, чтобы он принимал строку подключения внутри своего параметра вместо экземпляра SqlConnection и инициализировал его в любом методе, который его использует:

public class DB
{
    private string connectionString;

    public DB(string connectionString)
    {
        this.connectionString = connectionString;
    }

    public List<Records> GetRecords()
    {
        using (var conn = new SqlConnection(connectionString)){
            conn.Open();
            using (SqlCommand cmd = new SqlCommand("SELECT * FROM Records", conn))
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                List<Records> rows = new List<Records>();
                while (reader.Read())
                {
                    rows.Add(new Records(reader.GetString(1)));
                }
                return rows;
            }
        }
    }
}

Для получения более подробной информации, прочтите это.

1 голос
/ 10 октября 2019

Я не уверен на 100%, но я предполагаю, что проблема в

using(conn)

, когда использование закрыто, SqlConnection будет удален.
поэтому, когда вы снова вызовете db.GetRecords (); ,
conn.Open () не инициализирован. -> исключение

...