SqlConnection管理器样板文件?

时间:2015-06-23 19:42:09

标签: c#

第一个学生从java转到C#这里。当我们学习Java时,我们得到了这种SQL连接管理器类的东西,它基本上只是一堆代码,以便更容易在不同的类中访问它(它是由我的丹麦老师写的,有一些拼错/内部笑话,而不是肯定):

 public class DbConnection
 {   //Constants used to get access to the database
//SQL Server
private static final String  driver = "nope";
//  private static final String  driver = "nope";
private static final String  databaseName = ";databaseName=nope";
//SQL Server
//  private static String  userName = ";user=sa";
private static String  userName = "; user=nope";
private static String password = ";password=nope";


private DatabaseMetaData dma;
private static Connection con;
// an instance of the class is generetated
private static DbConnection  instance = null;

// the constructor is private to ensure that only one object of this class is created
DbConnection()
{
    String url = driver + databaseName + userName + password;

    try{
        //load af driver
        //SQL Server
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        System.out.println("Load af class ok");

    }
    catch(Exception e){
        System.out.println("Can not find the driver");
        System.out.println(e.getMessage());
    }//end catch
    try{
        //connection to the database
        con = DriverManager.getConnection(url);
        //set autocommit
        con.setAutoCommit(true);
        dma = con.getMetaData(); // get meta data
        System.out.println("Connection to " + dma.getURL());
        System.out.println("Driver " + dma.getDriverName());
        System.out.println("Database product name " + dma.getDatabaseProductName());
    }//end try
    catch(Exception e){

        System.out.println("Problems with the connection to the database");
        System.out.println(e.getMessage());
        System.out.println(url);
    }//end catch
}//end  constructor

//closeDb: closes the connection to the database
public static void closeConnection()
{
    try{
        con.close();
        System.out.println("The connection is closed");
    }
     catch (Exception e){
        System.out.println("Error trying to close the database " +  e.getMessage());
     }
}//end closeDB

//getDBcon: Get-method, returns the connection to the database
public  Connection getDBcon()
{
   return con;
}
//this method is used to get the instance of the connection
public static DbConnection getInstance()
{
    if (instance == null)
    {
      instance = new DbConnection();
    }
    return instance;
}
public static void startTransaction()
{ try{
    con.setAutoCommit(false);
    }
  catch(Exception e){
    System.out.println("fejl start transaction");
    System.out.println(e.getMessage());
  }
}
public static void commitTransaction()
{ try{
    con.setAutoCommit(true);
    }
  catch(Exception e){
    System.out.println("fejl commit transaction");
    System.out.println(e.getMessage());
  }
}
public static void rollbackTransaction()
{ try{
    con.rollback();
    con.setAutoCommit(true);
    }
  catch(Exception e){
    System.out.println("fejl rollback transaction");
    System.out.println(e.getMessage());
  }
}
}//end DbConnection

因此,为了习惯C#第二年,我首先考虑在C#中重新创建它,并且首先:在C#中使用它是否是个好主意?我看到很多人只是使用

 using(SqlConnection....){}

事情,我不确定如何实现autoCommits / Transaction回滚,因为例如C#中的事务是不同的类 到目前为止,我做了这个小班:

class DbConnection
{
    private const string DB_USER_ID = "user id=sa;";
    private const string DB_USER_PASSWORD = "password=nope;";
    private const string DB_SERVER_URL = @"server=localhost\SQLExpress1;";
    private const string DB_NAME = "database=test; ";
    private const string DB_TIME_OUT = "connection timeout=30";
    private const string DB_TRUSTED_CONN = "Trusted_Connection=yes;";

    private static SqlConnection myConnection = null;
    private static DbConnection instance = null;

    // private constructor to ensure that only object of this class is created
    private DbConnection()
    {
        createConnection();
    }
    // Instantiates SqlConnection object
    private void createConnection()
    {
        Console.WriteLine("Attempting to create connectiong...");
        try
        {
            myConnection = new SqlConnection(DB_USER_ID +
                DB_USER_PASSWORD +
                DB_SERVER_URL +
                DB_TRUSTED_CONN +
                DB_NAME +
                DB_TIME_OUT);
        }
        catch (Exception e)
        {
            Console.WriteLine("Problems with the connection to the database");
            Console.WriteLine(e.Message);
        }
    }

    private void openConnection()
    {
        try{
            myConnection.Open();
            Console.WriteLine("Connection succesfful!");
        } catch(Exception e) {
            Console.WriteLine(e.StackTrace);
        }
    }

    public static void closeConnection()
    {
        try
        {
            myConnection.Close();
            Console.WriteLine("Connection closed");
        }
        catch (Exception e)
        {
            Console.WriteLine("Problem closing connection");
            Console.WriteLine(e.Message);
        }
    }

    public SqlConnection getDBcon()
    {
        return myConnection;
    }

    public static DbConnection getInstance()
    {
        if (instance == null)
        {
            instance = new DbConnection();
        }
        return instance;
    }
}

1 个答案:

答案 0 :(得分:1)

男人,DbConnection类是坏事。把它扔掉。在VB中,作者将使用ON ERROR RESUME NEXT。

主要问题是错误被丢弃了。该计划继续处于糟糕状态。

下一个问题是静态(全局共享)连接对象。这不是线程安全的,如果连接中断(网络问题),它会永久中断。

.NET有连接池。这门课程是你不需要的。也许你可以给自己写一个小帮手打开一个连接:

static SqlConnection CreateConnection() {
 ...
}

using (var conn = CreateConnection()) {
}

它可以变得多么简单?