调用存储过程时无法访问数据阅读器
本文关键字:数据 访问 存储过程 调用 | 更新日期: 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构造时,代码又开始像预期的那样工作了。