C# 为空时创建新SqlConnection的最佳方法

C# 为空时创建新SqlConnection的最佳方法,c#,sql,transactions,C#,Sql,Transactions,我有两种连接数据库的方法,我尽量避免使用双重代码 我的方法之一是可以运行alon(打开自身SqlConnection并关闭它) 另一种方法使用现有的SqlConnection并同时使用SqlTransaction(我不想打开另一个连接,也不想关闭它) 我的第一个方法: public static List<CSerieses> GetCSerieses(DeliveryReportObject DeliveryReportObject) { L

我有两种连接数据库的方法,我尽量避免使用双重代码 我的方法之一是可以运行alon(打开自身SqlConnection并关闭它)

另一种方法使用现有的SqlConnection并同时使用SqlTransaction(我不想打开另一个连接,也不想关闭它)

我的第一个方法:

public static List<CSerieses> GetCSerieses(DeliveryReportObject DeliveryReportObject)
        {
            List<CSerieses> CSerieses = new List<CSerieses>();
            try
            {
                using (SqlConnection openCon = new SqlConnection(connectionString))
                {
                    string query = "SELECT [CSeriesNum],[CCount],[Mark] from [Serieses] " +
                            "where [TestPrimary]=@deliveryNumber";
                    SqlCommand command = new SqlCommand(query, openCon);
                    command.Parameters.AddWithValue("@deliveryNumber", DeliveryReportObject.DeliveryNumber);
                    openCon.Open();
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            CSerieses.Add(new CSerieses(reader.GetString(0), reader.GetInt32(1), reader.GetBoolean(2)));
                        }
                    }
                    openCon.Close();
                }
            }
            catch (Exception ex)
            {
                LocalPulserDBManagerInstance.WriteLog(ex.StackTrace, ex.Message);
            }
            return CSerieses;
        }
公共静态列表GetCseries(DeliveryReportObject DeliveryReportObject)
{
List CSerieses=新列表();
尝试
{
使用(SqlConnection openCon=newsqlconnection(connectionString))
{
string query=“从[Serieses]中选择[CSeriesum]、[Account]、[Mark]”+
“其中[TestPrimary]=@deliveryNumber”;
SqlCommand=newsqlcommand(查询,openCon);
command.Parameters.AddWithValue(“@deliveryNumber”,DeliveryReportObject.deliveryNumber);
openCon.Open();
使用(SqlDataReader=command.ExecuteReader())
{
while(reader.Read())
{
添加(新的cseries(reader.GetString(0)、reader.GetInt32(1)、reader.GetBoolean(2));
}
}
openCon.Close();
}
}
捕获(例外情况除外)
{
localpulserdbmanagerlinstance.WriteLog(ex.StackTrace,ex.Message);
}
回归体验;
}
在事务上使用的方法:

 public static List<CSerieses> GetCSerieses(DeliveryReportObject DeliveryReportObject,
            SqlConnection co,SqlTransaction tran)
        {
            List<CSerieses> CSerieses = new List<CSerieses>();
            try
            {
                using (co)
                {
                    string query = "SELECT [CSeriesNum],[CCount],[Mark] from [Serieses] " +
                            "where [TestPrimary]=@deliveryNumber";
                    SqlCommand command = new SqlCommand(query, co, tran);
                    command.Parameters.AddWithValue("@deliveryNumber", DeliveryReportObject.DeliveryNumber);
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            CSerieses.Add(new CSerieses(reader.GetString(0), reader.GetInt32(1), reader.GetBoolean(2)));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LocalPulserDBManagerInstance.WriteLog(ex.StackTrace, ex.Message);
            }
            return CSerieses;
        }
公共静态列表GetCseries(DeliveryReportObject DeliveryReportObject,
SqlConnection公司,SqlTransaction公司)
{
List CSerieses=新列表();
尝试
{
使用(co)
{
string query=“从[Serieses]中选择[CSeriesum]、[Account]、[Mark]”+
“其中[TestPrimary]=@deliveryNumber”;
SqlCommand=newsqlcommand(查询、co、tran);
command.Parameters.AddWithValue(“@deliveryNumber”,DeliveryReportObject.deliveryNumber);
使用(SqlDataReader=command.ExecuteReader())
{
while(reader.Read())
{
添加(新的cseries(reader.GetString(0)、reader.GetInt32(1)、reader.GetBoolean(2));
}
}
}
}
捕获(例外情况除外)
{
localpulserdbmanagerlinstance.WriteLog(ex.StackTrace,ex.Message);
}
回归体验;
}
我尝试将它们结合起来:

public static List<CSerieses> GetCSerieses(DeliveryReportObject DeliveryReportObject,
            SqlConnection co = null,SqlTransaction tran = null)
        {
            List<CSerieses> CSerieses = new List<CSerieses>();
            try
            {
                using (co ?? new SqlConnection(connectionString))
                {
                    if (co.IsOpened() == false)
                    {
                        co.Open();
                    }
                    string query = "SELECT [CSeriesNum],[CCount],[Mark] from [Serieses] " +
                            "where [TestPrimary]=@deliveryNumber";
                    SqlCommand command = new SqlCommand(query, co, tran);

                    if(tran != null)
                    {
                        command.Transaction = tran;
                    }

                    command.Parameters.AddWithValue("@deliveryNumber", DeliveryReportObject.DeliveryNumber);
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            CSerieses.Add(new CSerieses(reader.GetString(0), reader.GetInt32(1), reader.GetBoolean(2)));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LocalPulserDBManagerInstance.WriteLog(ex.StackTrace, ex.Message);
            }
            return CSerieses;
        }
公共静态列表GetCseries(DeliveryReportObject DeliveryReportObject,
SqlConnection co=null,SqlTransaction tran=null)
{
List CSerieses=新列表();
尝试
{
使用(co??新的SqlConnection(connectionString))
{
if(co.IsOpened()==false)
{
公开发行公司();
}
string query=“从[Serieses]中选择[CSeriesum]、[Account]、[Mark]”+
“其中[TestPrimary]=@deliveryNumber”;
SqlCommand=newsqlcommand(查询、co、tran);
if(tran!=null)
{
command.Transaction=tran;
}
command.Parameters.AddWithValue(“@deliveryNumber”,DeliveryReportObject.deliveryNumber);
使用(SqlDataReader=command.ExecuteReader())
{
while(reader.Read())
{
添加(新的cseries(reader.GetString(0)、reader.GetInt32(1)、reader.GetBoolean(2));
}
}
}
}
捕获(例外情况除外)
{
localpulserdbmanagerlinstance.WriteLog(ex.StackTrace,ex.Message);
}
回归体验;
}
这对我不起作用。我不知道如何在using中检查它是否为null,如果是,如何创建一个新的SqlConnection实例,该实例应该在using语句结束时关闭
不管怎样,我都是用正确的方法做的?

这是一个主要问题:

使用(co??新的SqlConnection(connectionString))
如果传入了
co
,则您不拥有它-调用者拥有它-因此:您不应该处理它。我在这里的建议是:

bool-ownConnection=false;
尝试
{
if(co为空)
{
ownConnection=true;
co=新的SqlConnection(…);
公开发行公司();
}
//你的代码在这里
}
最后
{
如果(连接)
{
co?.Dispose();
}
}
或者将其包装在一个助手中—可能是一个自定义的一次性文件,它接受一个连接和连接字符串:

公共只读结构ConnectionWrapper:IDisposable { 私人只读文件所有; 公共SqlConnection连接{get;} 公共ConnectionWrapper(SqlConnection连接、字符串connectionString) { if(连接为空) { 拥有=真实; 连接=新的SqlConnection(connectionString); Connection.Open(); } 其他的 { 拥有=虚假; 连接=连接; } } 公共空间处置() { 如果(拥有) { 连接?.Dispose(); } } } 然后您可以使用:

使用var wrapped=newconnectionwrapper(co,connectionString);
//您的代码,使用wrapped.Connection
这似乎就是那种
public static List<CSerieses> GetCSerieses(DeliveryReportObject DeliveryReportObject)
{
     using(SqlConnection con = new SqlConnection(......))
     {
        try
        {
            con.Open();


            using(SqlTransaction tran = con.BeginTransaction())
            {
                return GetCSerieses(DeliveryReportObject, con, tran);
            }

             // Or, if you don't need a transaction you could call the
             // overload passing null
             // return GetCSerieses(DeliveryReportObject, con, null);
         }
         catch(Exception ex)
         {
              LocalPulserDBManagerInstance.WriteLog(ex.StackTrace, ex.Message);
              return null; // ?? or  return new List<CSerieses>();
         }
     }
 }

 public static List<CSerieses> GetCSerieses(DeliveryReportObject DeliveryReportObject, SqlConnection co, SqlTransaction tran)
 {
        List<CSerieses> CSerieses = new List<CSerieses>();
        try
        {

             // We don't own the connection and the transaction object.
             // Whoever passed them to us is responsible of their disposal.

             string query = "......";
             SqlCommand command = new SqlCommand(query, co, tran);
             command.Transaction = tran;
             ....
        }
        catch (Exception ex)
        {
            LocalPulserDBManagerInstance.WriteLog(ex.StackTrace, ex.Message);
        }
        return CSerieses;
    }