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