C# 从未在已发布环境中计算的T-SQL返回INT

C# 从未在已发布环境中计算的T-SQL返回INT,c#,asp.net,C#,Asp.net,遇到一个问题,我编写了一些在我的沙箱中工作的代码,包括指向外部数据库但在我发布的环境中不工作的代码 我要做的是从存储过程中获取一个INT结果。我尝试让程序返回INT,并将其设置为输出参数,但在这两种情况下都没有成功。请注意,这同样适用于我自己的沙箱,但不适用于使用VisualStudio部署功能部署的已发布环境 下面是计算整数返回码的C#: var returnVal = new SqlParameter("@ReturnValue", SqlDbType.Int) { IsNullab

遇到一个问题,我编写了一些在我的沙箱中工作的代码,包括指向外部数据库但在我发布的环境中不工作的代码

我要做的是从存储过程中获取一个INT结果。我尝试让程序返回INT,并将其设置为输出参数,但在这两种情况下都没有成功。请注意,这同样适用于我自己的沙箱,但不适用于使用VisualStudio部署功能部署的已发布环境

下面是计算整数返回码的C#:

var returnVal = new SqlParameter("@ReturnValue", SqlDbType.Int)
{
    IsNullable = true,
    Direction = ParameterDirection.ReturnValue
};



var sqlParams = new List<SqlParameter>
{
    new SqlParameter("@Host", dataEntryModel.Host),
    new SqlParameter("@PurchaseOrderNumberUser", dataEntryModel.PurchaseOrderNumberUser),
    new SqlParameter("@PharmacyId", dataEntryModel.BatchUploadPharmacyId),
    new SqlParameter("@NDCTable", table),
    new SqlParameter("@LastModifiedById", dataEntryModel.LastModifiedById),
    new SqlParameter("@POSourceTypeId", dataEntryModel.PurchaseOrderSourceType),
    new SqlParameter("@PoId", dataEntryModel.PurchaseOrderId),
    returnVal
};

using (var connection = new SqlConnection(Database.ConnectionString))
{
    connection.Open();

    using (var command = new SqlCommand("AdminApp._spBatchUploadNDCToPurchaseOrder"))
    {
        command.Connection = connection;
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddRange(sqlParams.ToArray());
                 // Setting command timeout to 120 second - Added by Tom Miller 10-31-14
                 command.CommandTimeout = 600;
        command.ExecuteScalar();
        returnPurchaseOrderNumber = Convert.ToInt32(command.Parameters["@ReturnValue"].Value);
    }
}           
return returnPurchaseOrderNumber;

var returnVal=new-SqlParameter(“@ReturnValue”,SqlDbType.Int)
{
IsNullable=true,
方向=参数Direction.ReturnValue
};
var sqlParams=新列表
{
新的SqlParameter(“@Host”,dataEntryModel.Host),
新的SqlParameter(“@PurchaseOrderNumberUser”,dataEntryModel.PurchaseOrderNumberUser),
新的SqlParameter(“@PharmacyId”,dataEntryModel.BatchUploadPharmacyId),
新的SqlParameter(“@NDCTable”,表),
新的SqlParameter(“@LastModifiedById”,dataEntryModel.LastModifiedById),
新的SqlParameter(“@POSourceTypeId”,dataEntryModel.PurchaseOrderSourceType),
新的SqlParameter(“@PoId”,dataEntryModel.PurchaseOrderId),
返回值
};
使用(var connection=newsqlconnection(Database.ConnectionString))
{
connection.Open();
使用(var命令=新的SqlCommand(“AdminApp.\u spBatchUploadNDCToPurchaseOrder”))
{
command.Connection=连接;
command.CommandType=CommandType.storedProcess;
AddRange(sqlParams.ToArray());
//将命令超时设置为120秒-由Tom Miller 10-31-14添加
command.CommandTimeout=600;
command.ExecuteScalar();
returnPurchaseOrderNumber=Convert.ToInt32(命令参数[“@ReturnValue”].Value);
}
}           
返回returnPurchaseOrderNumber;
我不知道为什么这在其他环境中不起作用。我已经将我的沙盒指向了部署环境中使用的开发数据库,在运行时,正在计算的返回代码似乎是0,这是不正确的


解决了经过一些测试,我完全偏离了方向。我的数据设置正确,但在拉入DEV时,由于SQL端的体系结构较差,数据布局有所不同。感谢您,并为您花的时间表示歉意。

您试图以错误的方式得出结果。试试这个:

    int result = Convert.ToInt32(command.ExecuteScalar());

命令
没有名为
@ReturnValue
的参数。[编辑:很抱歉,是的,请参阅注释]设置断点并进行检查,但它可能计算为
null
,并试图将
null
转换为整数。我希望它抛出一个异常,但如果它没有抛出,它将计算为默认整数值,即0

如果存储过程正在返回一个值,则使用NicoRiff的方法并将
ExecuteScalar()
的结果赋给一个变量。如果它正在使用一个输出参数,那么就给它一个可以使用的参数。声明如下输出参数:

new SqlParameter("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.Output

这是否可以在using之外访问
returnPurchaseOrderNumber
我会在它之外声明这一点,这样这一行将是有效的
return returnPurchaseOrderNumber
在using之外声明变量最初它也没有声明
“@ReturnValue”
我可以确认它是有效的。returnPurchaseOrderNumber是在上面声明的,因此可以访问。另外,请发表评论。这应该是一个ExecuteOnQuery。没有选择任何行。最初是这样的,但很明显我粘贴的代码是经过修补的。如果我的direction=ReturnValue,则不是这样。如果我在做一个输出参数,这将是有效的。注意,我对这段代码做了一个修改,使用了一个输出参数,得到了相同的结果。。忽略我之前的评论很抱歉,通过将此参数的方向设置为return,我成功捕获了返回值。如果我在我的沙箱中抛出一个断点,这将正常工作,我没有任何问题。我还注意到,我尝试使用@ReturnValue和OUTPUT参数,实际上我使用PoId作为Inputoutput参数,得到了相同的结果。它在我的本地沙箱中工作,但在我的部署环境中不工作。当您说您将参数的方向设置为return时,您是在存储的过程中还是在C#代码中这样做?如果您是在C#中执行此操作,那么它不会显示在代码示例中。如果您在存储过程中设置它,那么我不熟悉这种方法,但它可能只是返回该值。如果是这种情况,那么
command.ExecuteScalar()
将返回一个可以转换为整数的
对象
——NicoRiff的答案显示了这种方法。var returnVal=new SqlParameter(@ReturnValue),SqlDbType.Int){IsNullable=true,Direction=ParameterDirection.ReturnValue};哦,我现在明白了。我道歉。您仍然可以尝试捕获由
命令.ExecuteScalar()
返回的值,或者如果您不希望该行返回值,可以尝试将该行更改为
命令.ExecuteNonQuery()
。快速看一眼,代码的这一部分看起来很有趣。您还可以尝试将参数方向更改为
.Output
,因为我已经成功地使用了这种方法。我明白所有这些“应该行得通”,但既然“行不通”,我们就需要尝试新的东西。您的沙箱中可能有不同的SQL Server版本,或者其他可以解释这一点的东西…谢谢您的输入。我觉得这看起来很有趣,因为我已经修修补补了一段时间。我尝试过的另一种方法是将参数PoId设置为InputOutput,然后在SQL代码中设置参数。这同样适用于我的沙箱,但不适用于我部署的环境。我会清理我的代码