Бину,
В вашем коде множество проблем. Во-первых, вы не должны вставлять строку подключения в код - вы должны извлечь ее из файла конфигурации, чтобы вы могли изменить ее при развертывании. Во-вторых, не входите в свою базу данных с учетной записью sa !! Только не делайте этого - поверьте мне в этом.
В-третьих, я настоятельно рекомендую вам использовать интерфейс IDisposable и блок Using, чтобы гарантировать, что ваше соединение всегда закрыто. На самом деле, вы зависите от кода потребления для вызова closeConnection.
Попробуйте этот пример кода:
public class MyConnClass : IDisposable
{
public static string ConnectionString { get; set; }
protected SqlConnection conn;
public MyConnClass()
{
conn = new SqlConnection(ConnectionString);
conn.Open();
}
public void Dispose()
{
conn.Close();
}
}
В вашем коде инициализации (например, Global.asax.cs в веб-приложении) установите строку статического соединения следующим образом:
MyConnClass.ConnectionString = ConnectionString;
В ваших потребляющих классах вы будете использовать что-то вроде:
using (MyConnClass myConn = new MyConnClass())
{
// Database code
}
Обновление : Еще одна вещь, которую я бы посоветовал вам рассмотреть, - это изменить приведенный выше код, чтобы он стал основой для уровня доступа к данным (DAL), а не только для соединения. То есть, поместите туда объект команды SQL и создайте код, чтобы упростить вашу общую стратегию доступа к данным. То есть просто помещать Connection в отдельный класс немного бесполезно, поскольку, как указывает Джоэл, объекты SqlConnection сами по себе одноразовые. Преимущество полноценного DAL заключается в том, что он может радикально упростить доступ к данным. Например, мой DAL позволяет мне писать такие вещи, как:
using (MyQueryClass myQuery = new MyQueryClass())
{
myQuery.Command("Update...").ParamVal("@P1", 1).ParamVal("@P2", 2).Execute();
return myQuery.Command("Select ...").ParamVal("@Param", SomeVal).ReturnList<SomeType>();
}
Вы не получите класс, который я сделал, но, надеюсь, вы увидите несколько вещей: строка подключения никогда не является проблемой в моем коде (она инкапсулирована), я могу запустить несколько команд без всякой настройки и обычно требуется снос, а общий синтаксис более свободный.