我正在构建一个应用程序,并尝试使用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;
}
}
}
}
答案 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构造时,代码再次开始按预期工作。