【发布时间】:2023-03-16 15:31:01
【问题描述】:
我正在 C# asmx webservice 中执行存储过程。 存储过程如下:
@userName NVARCHAR(50),
@password NVARCHAR(50),
@defaultTabApp NVARCHAR(20) OUT
AS
Declare @defaultTabApptemp NVARCHAR(20)
set @defaultTabApptemp ='NoAccess'
BEGIN TRANSACTION
if EXISTS(SELECT Top 1 [userId],[userName] FROM [dbo].[users] WHERE [userName]=@userName AND [password]=@password AND [AppAccess]=N'Yes')
Begin
set @defaultTabApptemp = (select Top 1 [dbo].[users].[defaultTabApp] FROM [dbo].[users] WHERE [userName]=@userName AND [password]=@password AND [AppAccess]=N'Yes')
end
select @defaultTabApp = @defaultTabApptemp
COMMIT TRANSACTION
return @defaultTabApp
我的 C# 代码是:
[WebMethod]
public string Login(string userName, string userPass)
{
string result;
SqlConnection conn = new SqlConnection(new DBConnection().ConnectionString);
try
{
SqlCommand cmd = new SqlCommand("_getSpecificUserLogin", conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
cmd.Parameters.AddWithValue("@userName", userName);
cmd.Parameters.AddWithValue("@password", userPass);
cmd.Parameters.Add("@defaultTabApp", SqlDbType.NVarChar,20);
cmd.Parameters["@defaultTabApp"].Direction = ParameterDirection.Output;
int i = cmd.ExecuteNonQuery();
result = Convert.ToString(cmd.Parameters["@defaultTabApp"].Value);
}
finally
{
conn.Close();
}
return result;
}
我在这一行的标题中发现了异常:int i = cmd.ExecuteNonQuery(); 我试图将其更改为执行标量,但遇到了同样的问题。我的存储过程中没有 int 类型。究竟是什么问题?提前致谢。
【问题讨论】:
-
您的程序似乎有点混乱。您是否使用 SSMS 运行该程序并检查其输出是否正确?我不相信你有正确的语法,或者可以使用 RETURN 语句来达到你想要的目的。请提供表架构和示例数据。
-
而且不需要
if exists...select...,你可以在一行中完成所有操作,然后你也不需要交易我希望你没有存储明文密码...... -
其实我的同事写了存储过程,我应该写webservice的c#代码。所以最好不要使用return语句?
标签: c# sql-server exception stored-procedures asmx