从SQL Server存储过程返回多个值

本文关键字:返回 存储过程 SQL Server | 更新日期: 2023-09-27 18:02:57

我想做的是使用我的spLogin存储过程从同一表返回两个值,这两个值我都想保存在c#的会话中。

这是表格

create table tbClients
(
    ClientID int primary key identity(0,1),
    ClientFirstName varchar(20),
    ClientLastName varchar(20),
    ClientAddress varchar(60),
    ClientOrigin varchar(20),
    ClientUsername varchar(20),
    ClientPassword int,
    ClientSecurity int
)

当客户端单击登录按钮时,我想编写一个过程来检查用户是否有效,他们的安全级别是什么,以及他们的名字是什么。

这是我到目前为止写的

create procedure spLogin(
    @ClientUsername varchar(20),
    @ClientPassword int
)
AS BEGIN
    DECLARE @Security int
    DECLARE @ClientFirstName varchar(20)        
    IF EXISTS (SELECT * FROM tbClients 
               WHERE ClientUsername = @ClientUsername 
                 AND ClientPassword = @ClientPassword)
    BEGIN               
        SELECT 
            @Security = ClientSecurity, 
            @ClientFirstName = ClientFirstName 
        FROM tbClients 
        WHERE
            ClientUsername = @ClientUsername 
            AND ClientPassword = @ClientPassword
        IF(@Security = 1)
        BEGIN
            SELECT 'Admin' as Security, @ClientFirstName
        END
        ELSE
        BEGIN
            SELECT 'Customer' as Security, @ClientFirstName
        END
    END
    ELSE
    BEGIN
        SELECT 'INVALID'
    END
END
GO

不知道这是否会起作用,因为我不知道如何在c#中存储这些值而不使用数据集,到目前为止似乎还没有工作?

从SQL Server存储过程返回多个值

我将把这个过程写得有点不同像这样.....

create procedure spLogin
    @ClientUsername     varchar(20)
   ,@ClientPassword     int
   ,@Security           VARCHAR(10)     OUTPUT
   ,@ClientFirstName    varchar(20)     OUTPUT
   ,@ValidLogin         INT             OUTPUT
AS 
BEGIN
  SET NOCOUNT ON;        
    IF EXISTS (SELECT * FROM tbClients 
               WHERE ClientUsername = @ClientUsername 
                 AND ClientPassword = @ClientPassword)
      BEGIN               
            SELECT @ValidLogin = 1 
                  ,@Security = CASE WHEN ClientSecurity = 1 
                                 THEN 'Admin' ELSE 'Customer' END
                  ,@ClientFirstName = ClientFirstName 
            FROM tbClients 
            WHERE ClientUsername = @ClientUsername 
              AND ClientPassword = @ClientPassword
      END
    ELSE
      BEGIN
            SET @ValidLogin = 0;
      END
END
GO

不是c#专家,但你会处理c#中的输出参数,如....

// define connection and command, in using blocks to ensure disposal
using(SqlConnection conn = new SqlConnection(pvConnectionString ))
using(SqlCommand cmd = new SqlCommand("dbo.spLogin", conn))
{
    cmd.CommandType = CommandType.StoredProcedure;
    // set up the input parameters
    cmd.Parameters.Add("@ClientUsername", SqlDbType.VarChar, 20);
    cmd.Parameters.Add("@ClientPassword", SqlDbType.Int);
    cmd.Parameters.Add("@Security", SqlDbType.VarChar, 10).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@ClientFirstName", SqlDbType.VarChar, 20).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@Success", SqlDbType.Int).Direction = ParameterDirection.Output;
    // set parameter values
    cmd.Parameters["@ClientUsername"].Value = UserNamTextbox.Text;
    // open connection and execute stored procedure
    conn.Open();
    cmd.ExecuteNonQuery();
    // read output value from @Security
    int Security = Convert.ToInt32(cmd.Parameters["@Security"].Value);
    if Security == 1 ....... and so on.......
    conn.Close();
}

所以我不是100%确定你有多少c#在你的端,但这里是基本的:

使用这个问题中的代码从SQL Server获取数据:从SQL Server数据库中填写数据表

然后,一旦你有了你的数据表,你就可以用for循环遍历它,就像这样(假设你把你的数据表定义为'dt'):

foreach (DataRow row in dt.Rows) 
{
    //do what you need with your data.
    var value = row["ColumnName"];
    Console.WriteLine(value.ToString());
}

希望对你有帮助。

结果您的存储过程只返回一行,您可以检查column是否存在于datatable中:

if (dt.columns.Contains("Security"))
{
   ....
}else{
   // Show error in fist row, fist column  
   return dt.Rows[0][0].ToString();
}

您可以执行storedprocedure并将结果填充到数据集中。

每个select语句将被存储为一个数据表,您可以使用索引访问相应的表。