【问题标题】:Stored procedure executing but not able to access data in asp.net存储过程执行但无法访问 asp.net 中的数据
【发布时间】:2012-10-29 10:32:30
【问题描述】:

我有一个可以在 SQL Server 中完美执行的存储过程。但是我无法从数据访问层访问它在 asp.net 中返回的行

我的DataAccessLayer代码如下:

 public List<AdvancePaymentRep> getPaymentAdvanceData(int? InternalCompany = 0, string Currency = "", DateTime? InvoiceDateFrom = null, DateTime? InvoiceDateTo = null, DateTime? AdvDateDueFrom = null, DateTime? AdvDateDueTo = null)
    {
      CreateConnectionString();
      List<AdvancePaymentRep> paymentAdvanceCollection = new List<AdvancePaymentRep>();
      SqlDataReader rdrval = null;
      SqlCommand command1 = sqlConnection.CreateCommand();
      command1.CommandType = System.Data.CommandType.StoredProcedure;
      command1.CommandText = "[dbo].[NST_GetDataForAdvancePaymentReport]";

      if (InternalCompany != 0)
      {

        SqlParameter parametersInternalCompany = new SqlParameter();
        parametersInternalCompany.ParameterName = "@AlhInternalCie";
        parametersInternalCompany.SqlDbType = System.Data.SqlDbType.Int;
        parametersInternalCompany.Direction = ParameterDirection.Input;
        parametersInternalCompany.Value = InternalCompany;
        command1.Parameters.Add(parametersInternalCompany);
      }

      SqlParameter parametersCurrency = new SqlParameter();
      parametersCurrency.ParameterName = "@AlhCurrency";
      parametersCurrency.SqlDbType = System.Data.SqlDbType.NVarChar;
      parametersCurrency.Direction = ParameterDirection.Input;
      parametersCurrency.Value = Currency;
      command1.Parameters.Add(parametersCurrency);

      if (InvoiceDateFrom != Convert.ToDateTime("01/01/0001 00:00:00"))
      {

        SqlParameter parametersInvoiceDateFrom = new SqlParameter();
        parametersInvoiceDateFrom.ParameterName = "@AldDtCreatedFrom";
        parametersInvoiceDateFrom.SqlDbType = System.Data.SqlDbType.Date;
        parametersInvoiceDateFrom.Direction = ParameterDirection.Input;
        parametersInvoiceDateFrom.Value = InvoiceDateFrom;
        command1.Parameters.Add(parametersInvoiceDateFrom);
      }

      if (InvoiceDateTo != Convert.ToDateTime("01/01/0001 00:00:00"))
      {
        SqlParameter parametersInvoiceDateTo = new SqlParameter();
        parametersInvoiceDateTo.ParameterName = "@AldDtCreatedTo";
        parametersInvoiceDateTo.SqlDbType = System.Data.SqlDbType.Date;
        parametersInvoiceDateTo.Direction = ParameterDirection.Input;
        parametersInvoiceDateTo.Value = InvoiceDateTo;
        command1.Parameters.Add(parametersInvoiceDateTo);

      }

      if (AdvDateDueFrom != Convert.ToDateTime("01/01/0001 00:00:00"))
      {
        SqlParameter parametersInvoiceDateDueFrom = new SqlParameter();
        parametersInvoiceDateDueFrom.ParameterName = "@InvhDtDueFrom";
        parametersInvoiceDateDueFrom.SqlDbType = System.Data.SqlDbType.Date;
        parametersInvoiceDateDueFrom.Direction = ParameterDirection.Input;
        parametersInvoiceDateDueFrom.Value = AdvDateDueFrom;
        command1.Parameters.Add(parametersInvoiceDateDueFrom);
      }


      if (AdvDateDueTo != Convert.ToDateTime("01/01/0001 00:00:00"))
      {
        SqlParameter parametersInvoiceDateDueTo = new SqlParameter();
        parametersInvoiceDateDueTo.ParameterName = "@InvhDtDueTo";
        parametersInvoiceDateDueTo.SqlDbType = System.Data.SqlDbType.Date;
        parametersInvoiceDateDueTo.Direction = ParameterDirection.Input;
        parametersInvoiceDateDueTo.Value = AdvDateDueTo;
        command1.Parameters.Add(parametersInvoiceDateDueTo);
      }

      try
      {
        if (sqlConnection == null)
        {
          sqlConnection.Open();
        }
        rdrval = command1.ExecuteReader(); // Getting HasRows = false out here 

编辑:已经解决了问题,我提供的方式存在一些问题

【问题讨论】:

  • 你能把你的SP的代码粘贴到这里吗?这将有助于回答问题。

标签: asp.net sql-server stored-procedures data-access-layer


【解决方案1】:

SP 中的最后一个命令应该是SELECT 命令。否则,您会得到其他结果,例如受影响的行数等。 Management Studio 仍然能够显示从您的 SP 中的一个 SELECTs 创建的行,但实际上它们不是您针对该 SP 调用 ADO.NET 命令时返回的第一个“事物”。

【讨论】:

    【解决方案2】:

    在你之后

    rdrval = command1.ExecuteReader();
    

    你需要做类似的事情

    while (rdrval.Read()) 
    {
      //do something
    }
    

    【讨论】:

    • 我同意这是必需的,但在他的代码底部他说 HasRows =false。
    • 非常正确 - @Ofer 很可能是正确的...存储过程有些问题。
    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多