Windows 窗体 SqlCommand C# 错误

Windows Form SqlCommand C# Error

我有一个在家编写的 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'

Class DataAccess:

  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;
     }
  }

Class TransactionCollection:

  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它正在执行存储过程!您需要设置 SqlCommandCommandType - 请参阅此处:

 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;
    }
 }