调用存储过程时无法访问数据阅读器

本文关键字:数据 访问 存储过程 调用 | 更新日期: 2023-09-27 17:49:41

我正在构建一个应用程序,并试图利用企业Lib 6为我的数据访问。

当我使用SQL命令但不能让它与存储过程一起工作时,它工作得很好。

我已经跟踪了代码,似乎数据阅读器没有被填充。

我确定我只是错过了一些愚蠢的东西,但任何帮助都会很感激。

using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using System;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Web;
using System.Data.SqlClient;

namespace Trainer.Classes.Database
{
  public class Staff
  {
    public int ReturnCode { get; set; }
    public int ValidateUser(string userName, string password)
    {
      string storedProcName = "uspUtilityVersionNumberGet";
      string sqlStatement = "SELECT VersionNumber FROM UTILITY_VERSION";
      // Create an instanct of the database
      DatabaseProviderFactory factory = new DatabaseProviderFactory();
      SqlDatabase DB = factory.CreateDefault() as SqlDatabase;
      //using (DbCommand cmd = DB.GetSqlStringCommand(sqlStatement))
      //{
      //  DB.AddOutParameter(cmd, "VersionNumber", SqlDbType.VarChar, 50);
      //  using (IDataReader dr = DB.ExecuteReader(cmd))
      //  {
      //    if (dr.Read())
      //      return 0;
      //    else
      //      return -9;
      //  }
      //}
      using (DbCommand cmd = DB.GetStoredProcCommand(storedProcName))
      {
        DB.AddOutParameter(cmd, "VersionNumber", SqlDbType.VarChar, 50);
        using (IDataReader dr = DB.ExecuteReader(cmd))
        {
          if (dr.Read())
            return 0;
          else
            return -9;
        }
      }
    }
  }

调用存储过程时无法访问数据阅读器

主要的混淆点是您正在使用的SQL语句和您试图使用的过程做不同的事情。

你使用的SQL语句是:

SELECT VersionNumber FROM UTILITY_VERSION;

这将返回一个没有行、一行或多行的结果集。

存储过程的SQL代码为:

TRY
    SET @VersionNumber = (SELECT VersionNumber FROM UTILITY_VERSION WHERE UtilityVersionID = (SELECT MAX(UtilityVersionID) FROM UTILITY_VERSION))
END TRY
BEGIN CATCH
    EXECUTE uspUtilityErrorHandler 0
END CATCH

这将而不是生成结果集,它将简单地将输出变量设置为某个值。因此,您必须使用ExecuteNonQuery来执行它。

试着像这样读取结果:

using (DbCommand cmd = DB.GetStoredProcCommand(storedProcName))
{
    DB.AddOutParameter(cmd, "VersionNumber", SqlDbType.VarChar, 50);
    DB.ExecuteNonQuery(cmd);
    DBParameter par = cmd.Parameters["VersionNumber"];
    // par.Value should now hold the desired number ...
}

我在存储过程中也遇到了一个问题。

my code:

    private static IDataReader GetDataReader(string procName)
    {
        DbCommand cmd = Db.GetStoredProcCommand(procName);
        cmd.CommandTimeout = 0;
        var dr = Db.ExecuteReader(cmd);
        return dr;
    }

这在过去工作得很好,但是当我现在尝试它时,它从未返回任何数据。直到我发现我的过程是选择记录在一个TRY块。显然,DataReader不喜欢这样。

当我删除TRY-CATCH构造时,代码又开始像预期的那样工作了。