c# - SQL Server存储过程-参考

本文关键字:参考 存储过程 SQL Server | 更新日期: 2023-09-27 18:10:44

我目前正在使用c#, SQL Server和编写Web API应用程序。

我正在创建SQL Server存储过程,并有几个工作,包括插入数据库,以及更新数据库中的条目。然而,我现在正试图处理输出,并且正在努力解决一些简单的问题。

我希望通过电子邮件地址,并返回第一个匹配的行id。

下面是存储过程:
CREATE PROCEDURE USER_PROCEDURE_GET_ID
    @Email VARCHAR(200),
    @id int Out
AS
    SELECT * 
    FROM [dbo].[Users]
    WHERE Email = @Email
    SET @id = id
    RETURN @id
下面是c#代码
public int GetID( string emailAddress )
{
// Create an SQL command
SqlCommand command = new SqlCommand();
command.Connection = this.sqlConnection;
// Set the command type to use a stored procedure
command.CommandType = CommandType.StoredProcedure;
// The name of the stored procedure
command.CommandText = "USER_PROCEDURE_GET_ID";
// Add the email address
command.Parameters.Add( new SqlParameter( "@email", emailAddress ) );
// Add the output param
SqlParameter outputParam = new SqlParameter( "@id", SqlDbType.Int )
{
    Direction = ParameterDirection.Output
};
command.Parameters.Add( outputParam );
// Create the reader
SqlDataReader reader = null;
// Execute the command
try
{
    reader = command.ExecuteReader();
}
catch (InvalidCastException ex)
{
}
catch (SqlException ex)
    {
}
catch (InvalidOperationException ex)
{
}
catch (IOException ex)
{
}
finally
{
       reader.Close();
    }
Debug.Write( "user id: " + outputParam.Value.ToString() );
return 0;
}

我知道我没有正确处理异常,我没有对返回的值做任何事情。此时,我没有得到返回的值,还得到了一个错误:

系统。NullReferenceException:对象引用没有设置为对象的实例。

c# - SQL Server存储过程-参考

您需要在select子句中设置@id,并且您也不返回它(它是一个out参数)。

CREATE PROCEDURE USER_PROCEDURE_GET_ID
@Email varchar(255),
@id int Out
AS
SELECT @id = id FROM [dbo].[Users]
WHERE Email = @Email

这确实不需要存储过程。

我不确定您在这里的工作是否正确(不确定您如何设置@id输出参数),但我也相信有一种更简单的方法来完成您所要求的。当你说你只想要第一行的单个值时,听起来你想要使用ExecuteScalar而不是带有输出参数的阅读器,因为在输出参数和结果集周围有一些奇怪的要求,我不记得了。

我想说你应该这样做。

object result = command.ExecuteScalar("SELECT TOP 1 Id FROM [dbo].[Users] WHERE Email = @Email");
if (!DBNull.Value.Equals(result)) return (int)value;
// return whatever value you want for "no-match" here