调用存储过程时无法访问DataReader

时间:2015-05-18 19:39:06

标签: c# stored-procedures enterprise-library

我正在构建一个应用程序,并尝试使用Enterprise 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;
        }
      }
    }
  }

2 个答案:

答案 0 :(得分:0)

混淆的主要问题是您正在使用的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 ...
}

答案 1 :(得分:0)

我的存储过程也存在问题。

我的代码:

    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构造时,代码再次开始按预期工作。