C# 存储过程和返回变量中的值不同
我的登录页面中有两个实例,具体取决于返回的vat(下面存储过程中的返回变量),当我在服务器上执行存储过程时,结果是C# 存储过程和返回变量中的值不同,c#,sql,sql-server,C#,Sql,Sql Server,我的登录页面中有两个实例,具体取决于返回的vat(下面存储过程中的返回变量),当我在服务器上执行存储过程时,结果是INTERNAL,但在登录页面上执行else上的条件,而不是INTERNAL string usertype = u.ViewUserType((int)Session["Id"]); string vattype = u.ViewUserVat((string)Session["Code"]); if (usertype == "
INTERNAL
,但在登录页面上执行else
上的条件,而不是INTERNAL
string usertype = u.ViewUserType((int)Session["Id"]);
string vattype = u.ViewUserVat((string)Session["Code"]);
if (usertype == "Client")
{
if (vattype == "INTERNAL")
{
Response.Redirect("~/NonIFAClient/");
}
else
{
Response.Redirect("~/Client/");
}
}
public string ViewUserVat(string code)
{
CamOnlineAccess.Utilities u = new CamOnlineAccess.Utilities();
SqlCommand c = u.GetCommandSP("dbo.ViewUserVat");
c.Parameters.AddRange(new System.Data.SqlClient.SqlParameter[] {
new System.Data.SqlClient.SqlParameter("@code",System.Data.SqlDbType.VarChar,50),
new System.Data.SqlClient.SqlParameter("@vat",SqlDbType.VarChar, 50, System.Data.ParameterDirection.Output, false, ((byte)(0)), ((byte)(0)), "", System.Data.DataRowVersion.Current, null)});
c.Parameters["@code"].Value = code;
c.Connection.Open();
c.ExecuteScalar(); // because we have output parameters
c.Connection.Close();
return (string)c.Parameters["@vat"].Value;
}
存储过程:
ALTER PROCEDURE [dbo].[ViewUserVat]
-- Add the parameters for the stored procedure here
@code varchar,
@vat varchar(50) output
AS
SELECT
TOP 1 @vat = vattable
FROM
dbo.portfolio
WHERE
owner = @code
比较中可能存在空格或铸造问题 试一试
从存储过程返回数据有几种方法-可以使用
返回
,可以执行简单的选择
,也可以使用out参数。访问此值的方式不同,具体取决于方法-ExecuteScalar
,ExecuteNonQuery
,…-用于执行查询。它还受到控制是否返回受影响行的数量以及(如果我没记错的话)存储过程声明方式的影响
自从我上次不得不处理这件事以来,已经有一段时间了,我记不清所有的细节,也不知道有一份全面的清单列出了所有的细节。但我很肯定以下几点对你的情况是有效的
更改存储过程以返回一行一列
ALTER PROCEDURE [dbo].[ViewUserVat]
@code varchar
AS
SELECT
TOP 1 vattable
FROM
dbo.portfolio
WHERE
owner = @code
然后像这样使用由ExecuteScalar()
返回的值
public String ViewUserVat(String code)
{
var command = CamOnlineAccess.Utilities().GetCommandSP("dbo.ViewUserVat"))
try
{
command.Parameters.AddWithValue("@code", code);
command.Connection.Open();
return (String)command.ExecuteScalar();
}
finally
{
command.Connection.Close();
command.Dispose();
}
}
您没有提供的明显信息是,在进行比较时,
vattype
的值是多少?另一个想法是区分大小写是否是一个问题。您以前使用过linq吗?它哪里出了问题?存储过程是否返回了错误的值?SqlCommand是否返回了错误的值?值是否如预期的那样无处不在,但仍然是错误的分支?您的存储过程不会返回实际的数据集-因此,您不应该调用.ExecuteScalar()
,而应该使用.ExecuteNonQuery()
来运行存储过程ExecuteScalar
用于查询/存储过程仅返回一行、一列(如SELECT COUNT(*)…
或类似内容),因为返回的数据集(不是通过输出参数)应为“内部”。。。但实际价值是什么?我猜它是DBNull.Value
。谢谢,但是上面的代码将“无法将类型为”System.DBNull的对象强制转换为类型为“System.String”异常。@danny如果存储过程返回DBNull,其他对象将被执行,这不是很明显吗?我知道这很明显,但我的问题是“为什么”。在服务器上运行存储过程查询时,结果(vat)是“内部”而不是DBNull。但当我运行网站时,返回的值为空。这就是问题所在。不管怎样,检查我哪里出了问题。。??
public String ViewUserVat(String code)
{
var command = CamOnlineAccess.Utilities().GetCommandSP("dbo.ViewUserVat"))
try
{
command.Parameters.AddWithValue("@code", code);
command.Connection.Open();
return (String)command.ExecuteScalar();
}
finally
{
command.Connection.Close();
command.Dispose();
}
}