C# 执行SqlCommand是否完全没有意义/冗余,并且会减慢速度?
多亏了一些提示和提醒,我改变了我的代码:C# 执行SqlCommand是否完全没有意义/冗余,并且会减慢速度?,c#,sql-server,sqlcommand,sqldataadapter,executereader,C#,Sql Server,Sqlcommand,Sqldataadapter,Executereader,多亏了一些提示和提醒,我改变了我的代码: try { DataSet dsUsage = new DataSet(); SqlConnection conn = new SqlConnection("SERVER=PROSQL05;DATABASE=platypusdata;UID=duckbill;PWD=poisonToe42;Connection Timeout=0"); SqlDataAdapter da = new SqlDataAdapter();
try
{
DataSet dsUsage = new DataSet();
SqlConnection conn = new SqlConnection("SERVER=PROSQL05;DATABASE=platypusdata;UID=duckbill;PWD=poisonToe42;Connection Timeout=0");
SqlDataAdapter da = new SqlDataAdapter();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = String.Format("Exec sp_ViewProductUsage_MappingRS '{0}', '{1}', '{2}'", mammal, dateBegin, dateEnd);
da.SelectCommand = cmd;
conn.Open();
da.Fill(dsUsage);
conn.Close();
DataTable dtUsage = dsUsage.Tables[0];
if (dtUsage.Rows.Count > 0)
{
foreach (DataRow productUsageByMonthDataRow in dtUsage.Rows)
{
. . .
……为此:
try
{
SqlDataAdapter da = new SqlDataAdapter();
DataSet dsUsage = new DataSet();
using (SqlConnection conn = new SqlConnection(UsageRptConstsAndUtils.PlatypusConnStr))
{
using (SqlCommand cmd = new SqlCommand("sp_ViewProductUsage_MappingRS", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Unit", SqlDbType.VarChar).Value = _unit;
cmd.Parameters.Add("@BegDate", SqlDbType.DateTime).Value = dtBegin;
cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = dtEnd;
da.SelectCommand = cmd;
conn.Open();
//cmd.ExecuteReader(); <- Is this even necessary?
da.Fill(dsUsage);
}
}
DataTable dtUsage = dsUsage.Tables[0];
if (dtUsage.Rows.Count > 0)
{
// Populate the cells
foreach (DataRow productUsageByMonthDataRow in dtUsage.Rows)
{
. . .
……等等。(然后将它们添加到一个数组中——或者最好是一个SqlParameter的通用列表)
更新2
我第一次遇到这个问题:如果使用MethodMan的示例(我就是这么做的),并且使用无参数查询,则需要绕过参数添加循环,如下所示:
if (null != parameters)
{
foreach (var item in parameters)
{
cmd.Parameters.Add(item);
}
}
我个人会创建一个SqlDBHelper类,并使用如下方法传递对存储过程的调用
public static class SqlDBHelper
{
public static DataSet ExecuteDataSet(string sql, CommandType cmdType, params SqlParameter[] parameters)
{
using (DataSet ds = new DataSet())
using (SqlConnection connStr = new SqlConnection(ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString))
using (SqlCommand cmd = new SqlCommand(sql, connStr))
{
cmd.CommandType = cmdType;
foreach (var item in parameters)
{
cmd.Parameters.Add(item);
}
try
{
cmd.Connection.Open();
new SqlDataAdapter(cmd).Fill(ds);
}
catch (SqlException ex)
{
//log to a file or write to Console for example
Console.WriteLine(ex.Message);
}
return ds;
}
}
}
如果要返回DataTable,请更改方法签名中的返回类型,并在下面的return语句中调用以下内容
下面是一个如何调用该方法的示例
您使用的是
DataSet.Fill()
方法,因此您可以回答自己的问题。。你不认为。。?此外,除非您希望在While loop
中循环结果,否则您所做的也很好。我将亲自更改cmd.Add
方法以利用cmd.Parameters.AddWithValue`并让服务器解析/处理数据类型。如果您将要删除dataset/datatable/dataadapter,则有必要这样做并直接使用datareader。根据您发布的少量代码,您似乎根本不需要数据集,最好使用datareader。@B.ClayShannon正如我前面所述,没有必要使用cmd.ExecuteReader()
SqlParameter数组是否包含要分配参数的值,也是?参数是在Sql Server端使用@
参数名称声明的。值是从方法调用外部按顺序传递的。使用起来非常简单,因此基本上您可以调用var someDataTable=ExecuteDataSet(“sp_name”,cmdType.StoredProc,Parameters[]因此
这是因为吗?@canon不是,这不是一个不同问题的答案,而是关于如何在没有冗余的情况下更好地完成他正在尝试做的事情的答案。@MethodMan:大部分都是有意义的,但我不确定的是,传递参数数组时,参数数组中到底包含了什么。您的代码显示了每个参数是添加到sqlCommand的Parameters集合中,但我想知道的是调用方如何构造参数数组。它显然必须同时包含参数名称(如“Unit”)和参数值(如“YogiBear”).我在最初的评论中回答了这个问题,我给@B.ClayShannon举了一个如何执行呼叫的例子
public static class SqlDBHelper
{
public static DataSet ExecuteDataSet(string sql, CommandType cmdType, params SqlParameter[] parameters)
{
using (DataSet ds = new DataSet())
using (SqlConnection connStr = new SqlConnection(ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString))
using (SqlCommand cmd = new SqlCommand(sql, connStr))
{
cmd.CommandType = cmdType;
foreach (var item in parameters)
{
cmd.Parameters.Add(item);
}
try
{
cmd.Connection.Open();
new SqlDataAdapter(cmd).Fill(ds);
}
catch (SqlException ex)
{
//log to a file or write to Console for example
Console.WriteLine(ex.Message);
}
return ds;
}
}
}
public static DataTable ExecuteDataSet(string sql, CommandType cmdType, params SqlParameter[] parameters)
return ds.Tables[0];
someDataTable = SqlDBHelper.ExecuteDataSet("sp_ViewProductUsage_MappingRS", CommandType.StoredProcedure,
new SqlParameter() { ParameterName = "@Unit", SqlDbType = SqlDbType.VarChar, Value = _unit },
new SqlParameter() { ParameterName = "@BegDate", SqlDbType = SqlDbType.DateTime, Value = dtBegin },
new SqlParameter() { ParameterName = "@EndDate", SqlDbType = SqlDbType.DateTime, Value = dtEnd }
);