Состояние SqlConnection всегда закрывается при выполнении

#c# #sql #ms-access

#c# #sql #ms-access

Вопрос:

Я пытаюсь установить простое подключение к базе данных MS Access с помощью объектов SqlConnection and SqlCommand .

Как вы можете видеть, вот как я устанавливаю соединение:

 private SqlConnection GetConnection()
{
    String connStr = ConfigurationManager.ConnectionStrings[0].ConnectionString;
    SqlConnection conn = new SqlConnection(connStr);
    return conn;
}
  

И прежде чем вы спросите, да, я пытался переместить этот фрагмент кода в метод, который его вызывает. Ничего не изменилось. Он по-прежнему неправильно считывает строку подключения.

Строка подключения выглядит следующим образом и находится в App.config файле:

 <add name="ConnString" connectionString="Server=*.*.*.*;Database=familie;User Id=mfs;Password=********;"/>
  

Но когда я получаю эту ошибку:

Изображение ошибки

И посмотрите на объект строки подключения в то время, строка выглядит следующим образом:

 "data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
  

Я потратил около 2 часов, пытаясь заставить это работать, заходя на множество разных сайтов, чтобы выяснить, что я сделал не так, но я либо получаю информацию, которая слишком старая, противоречивая, либо связана с подключением к локальной базе данных, когда на самом деле это внешний доступ через прокси, которыйбыло предоставлено мне моим клиентом (TrustGate, если кто-нибудь спросит)

Вызываемый метод GetConnection() выглядит следующим образом:

 public Dictionary<int,String> GetPostNrList()
{
    SqlConnection conn = GetConnection();
    SqlCommand cmd = new SqlCommand("Execute dbo.HENT_POST_NR_LISTE", conn);
    var reader = cmd.ExecuteReader();
    Dictionary<int, String> liste = new Dictionary<int, string>();
    while (reader.NextResult())
    {
        int post_nr = (int) reader.GetSqlInt32(0);
        String by = reader.GetString(1);
        liste.Add(post_nr, by);
    }
    CloseConnection(conn);
    return liste;
}
  

Что именно я делаю не так?

Комментарии:

1. Где оно находится в файле app.config?

Ответ №1:

Сообщение об исключении точно сообщает вам, в чем проблема — ваше соединение не открыто. Вам просто нужно открыть соединение перед выполнением команды:

 conn.Open();
  

Кстати, хорошим шаблоном является использование using блока при работе с SQL-соединениями, чтобы обеспечить его правильное удаление:

 using (var conn = GetConnection())
{
    using (var comm = xxxxxxx)
    {
        conn.Open();
        using (var rdr = comm.ExecuteReader())
        {
            // xxxxx
        }
    }
}
  

Вам не нужно ничего специально закрывать — using шаблон делает все это за вас.

Комментарии:

1. Я думал, что это похоже на Java, где он сам его открыл… это своего рода отсталость, если вы спросите меня. Но я приму ваш ответ, когда смогу.

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

3. @Vipar, хорошим finally блоком вокруг вызовов SQL является finally{ if(conn. Состояние == Состояние соединения. Открыть) conn. Close();} но! извините, не видел блок кода, он есть у него в using(), поэтому он будет удален, если вы не удалите его, тогда этот блок finally хорош в конце.