C# Windows窗体SQLC命令#错误

C# Windows窗体SQLC命令#错误,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,我有一个在家编写的Windows窗体程序(我主要使用ASP.Net,所以已经有一段时间了),执行存储过程命令时遇到问题 我从SqlConnection对象创建SqlCommand对象,然后从SqlCommand创建SqlParameter。我指定名称、数据类型等。但是,每当我调用SqlCommand ExecuteReader()时,它都会告诉我它需要未提供的参数。我清楚地添加了它们,并且可以在调试中单步执行时看到它们被填充。有什么想法吗 存储过程: EXEC dbo.GetTransactio

我有一个在家编写的Windows窗体程序(我主要使用ASP.Net,所以已经有一段时间了),执行存储过程命令时遇到问题

我从
SqlConnection
对象创建
SqlCommand
对象,然后从
SqlCommand
创建
SqlParameter
。我指定名称、数据类型等。但是,每当我调用
SqlCommand ExecuteReader()
时,它都会告诉我它需要未提供的参数。我清楚地添加了它们,并且可以在调试中单步执行时看到它们被填充。有什么想法吗

存储过程:

EXEC dbo.GetTransactions @StartDate = '2015-04-10 18:07:43',  
                         @EndDate = '2015-04-10 18:07:43'
数据访问

  public static DataTable Execute(SqlCommand iCommand) {
     DataTable objTable = new DataTable();
     try {
        iCommand.Connection.Open();
        SqlDataReader objReader = iCommand.ExecuteReader();
        objTable.Load(objReader);
        objReader.Close();
     }
     catch {
        throw;
     }
     finally {
        iCommand.Connection.Close();
     }
     return objTable;
  }

  public static SqlCommand CreateCommand(string iProcedureName) {
     try {
        SqlConnection objConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnectionString"].ToString());
        SqlCommand objCommand = new SqlCommand(iProcedureName, objConnection);
        return objCommand;
     }
     catch {
        throw;
     }
  }
事务集合

  private static DataTable Load(DateTime iStartDate, DateTime iEndDate) {
     string strProcedureName = "GetTransactions";
     SqlCommand objCommand = DataAccess.CreateCommand(strProcedureName);
     SqlParameter param = objCommand.CreateParameter();
     param.ParameterName = "@StartDate";
     param.DbType = DbType.DateTime;
     param.Value = iStartDate;
     objCommand.Parameters.Add(param);

     param = objCommand.CreateParameter();
     param.ParameterName = "@EndDate";
     param.DbType = DbType.DateTime;
     param.Value = iEndDate;
     objCommand.Parameters.Add(param);

     return DataAccess.Execute(objCommand);
  }

您需要告诉您的
SqlCommand
它正在执行一个存储过程!您需要设置
SqlCommand
CommandType
-请参见此处:

 public static SqlCommand CreateCommand(string iProcedureName) {
    try {
       SqlConnection objConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnectionString"].ToString());
       SqlCommand objCommand = new SqlCommand(iProcedureName,  objConnection);
       // add this line here!!
       objCommand.CommandType = CommandType.StoredProcedure;

       return objCommand;
    }
    catch {
        throw;
    }
 }

更改第二个参数创建,创建一个新参数,而不是重新指定现有参数。e、 g.
SqlParameter param1=objCommand.CreateParameter();param.ParameterName=“@EndDate”
如果您只是想捕获异常并在不记录日志的情况下重新刷新,那么最好使用
using
语句。此外,您还可以简化一些
SqlDataReader objReader=iCommand.ExecuteReader();objTable.Load(objReader)可以变成
objTable.Load(iCommand.ExecuteReader())谢谢marc_!我完全忘记了那一步。添加该行后,现在可以正常工作。