ここでいくつかのヒントとリマインダーのおかげで、この厄介な混乱からコードを変更しました。
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)
{
. . .
新しいコードでは、SqlCommand
. それは正常に動作します。だから:私は完全に削除できると仮定して正しいですか?それを保持することには利点がありますか、それとも完全に冗長であり、プロセスの「忙しい作業」を作成しますか?ExecuteReader
SqlDataAdapter
SqlCommand
cmd.ExecuteReader()
アップデート
したがって、SqlParameter の配列を (MethodMan の回答の ExecuteDataSet メソッドに) 渡すには、最初に次のようなことをしなければならないと思います。
SqlParameter sqlp = new SqlParameter();
sqlp.ParameterName = "Unit";
sqlp.Value = _unit;
cmd.Parameters.Add(sqlp);
...等。(そして、それらを配列に追加します-または、おそらくSqlParameterの一般的なリストを追加します)。
更新 2
私は初めてこれに遭遇しました: MethodMan の例を使用し (私はそうしています)、パラメーターなしのクエリを使用する場合は、次のようにパラメーター追加ループをバイパスする必要があります。
if (null != parameters)
{
foreach (var item in parameters)
{
cmd.Parameters.Add(item);
}
}