2013-07-24 6 views
1

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

Вот мой класс:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data.SqlClient; 
//a class that returns a connection to the database 
namespace epaCUBE_Utility_Tool 
{ 
    public class epaCUBE_DB 
    { 

     public static SqlConnection GetConnection() 
     { 
      string str = "user id=MyUserName;" + 
       "password=MyPassword;server=myServer;" + 
       "database=myDatabase; " + 
       "connection timeout=30"; 

      SqlConnection con = new SqlConnection(str); 
      con.Open(); 
      return con; 
     }    
    } 
} 

и вот как я пытаюсь использовать:

private void button1_Click(object sender, EventArgs e) 
{  
    var connection = epaCUBE_DB.GetConnection(); 
    connection.Open();  
    SqlDataReader rdr = null; 
    string CommandText = "SELECT Field1, Field2 FROM TableName";  
    SqlCommand cmd = new SqlCommand(CommandText, connection);  
    rdr = cmd.ExecuteReader(); 
    while (rdr.Read()) 
    { 
     this.comboBox1.Items.Add(rdr["Field1"].ToString() + 
    ": " + rdr["Field2"].ToString()); 
    } 
    connection.Close(); 
} 

, когда я нажимаю кнопку, я получаю сообщение об ошибке

InvalidOperationException: соединение не было закрыто. Текущее состояние соединения открыто.

Что я делаю неправильно? Спасибо, Лесли

ответ

2

GetConnection звонки Open для вас, но вы вызываете его снова вручную после того, как вы назвали GetConnection. Назовите его внутри GetConnection или снаружи, но не в обоих местах.

+0

Да, я только что заметил, что !!! Благодаря! – Leslie

0

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

cmd.Connection.Open(); 

добавить следующий код проверки/очистки:

if (cmd.Connection.State == ConnectionState.Open) 
{ 
    cmd.Connection.Close(); 
} 
1

проблема в GetConnection() вы уже открыть соединение. Все эти проблемы были связаны с вашим статическим методом. Это нехороший способ сделать это, лучше создать новый экземпляр SqlConnection, когда вам нужно, и утилизируйте его после использования. Базовый пул соединений будет способен управлять физическими соединениями.

Разделите свой пользовательский интерфейс с доступом к данным, здесь вы читаете данные из базы данных и одновременно добавляете элементы в элементы управления. Вам нужно перефакторировать код.

Вы можете иметь метод, как показано ниже, чтобы получить данные

public List<string> GetFields() 
{ 
    List<string> fields = new List<string>(); 
    string CommandText = "SELECT Field1, Field2 FROM TableName"; 
    using (var connection = new SqlConnection(epaCUBE_DB.GetConnectionString())) 
    { 
     connection.Open(); 
     using (var cmd = new SqlCommand(CommandText, connection)) 
     using (var reader = cmd.ExecuteReader()) 
     { 

      while (reader.Read()) 
      { 
       fields.Add(reader["Field1"].ToString() + ": " + reader["Field2"].ToString()); 
      } 
     } 
    } 
    return fields; 
} 
0

I Программа довольно защищаясь; Я ожидаю возникновения ошибок и стараюсь обработать это изящно.

Как таковой ..

// Define this once in a class and re-use for every connection.. 
string myConnString = "user id=MyUserName;" + 
     "password=MyPassword;server=myServer;" + 
     "database=myDatabase; " + 
     "connection timeout=30"; 

    using (SqlConnection mySqlConnection = new SqlConnection(myConnString)) 
    { 
     using (SqlCommand mySQLCommand = new SqlCommand("SELECT Field1, Field2 FROM TableName", mySqlConnection) { CommandType = CommandType.Text}) 
     { 
      try 
      { 
       mySqlConnection.Open(); 
       using (SqlDataReader rdr = mySQLCommand.ExecuteReader()) 
       { 
        this.comboBox1.Items.Add(rdr["Field1"].ToString() + ": " + rdr["Field2"].ToString()); 
       } 
      } 
      catch (Excecption e) 
      { 
       // Deal with it as you wish 
      } 
      mySqlConnection.Close(); 
     } 
    } 
+0

спасибо, что я включил это в мое решение. Я переместил open из своего класса внутрь Try/catch. – Leslie

Смежные вопросы