【问题标题】:Get result from procedure with specific database从具有特定数据库的过程中获取结果
【发布时间】:2015-05-21 01:20:07
【问题描述】:

我有这个程序:

ALTER procedure dbo.scUsuarioCorrecto
    @usrLogin nvarchar(15),
    @usrPassword nvarchar(255)
AS
    select case when exists 
        (select * from Usuario where usrLogin = 
            @usrLogin and usrPassword = @usrPassword
            AND usrHabilitado = 1) 
        then CAST(1 as bit) else CAST(0 as bit) end as correcto;

我无法更改它,所以我必须解决它,我如何从 C# 中捕获那个位,我已经连接到数据库并且我能够调用一些程序,但是我遇到了这个问题

尝试将参数设置为输出:

SqlParameter result = new SqlParameter("correcto", SqlDbType.Int)
{
   Direction = ParameterDirection.Output
};
cmd.Parameters.Add(result);

但我收到“to many parameters”错误,抱歉,如果我犯了一个愚蠢的错误,我今天真的是从 C# 开始的,我也使用了搜索按钮。

【问题讨论】:

  • 您确实必须以tutorial 开头,而不是在代码编辑器中随机输入。
  • 您实际上是在向您的代码撒谎,说明该参数是如何工作的。当您创建 SqlParameter 时,它旨在表示数据库中存在的内容。数据库没有将其用作输出参数,因此您的代码无法实现。

标签: c# sql tsql stored-procedures ado.net


【解决方案1】:

问题是,您正在执行您的存储过程并试图读取它,就好像有一个Output parameter。如果您无法修改存储过程以提供输出参数,则将您的代码修改为以下内容:

using (var connection = new SqlConnection())
{
    connection.ConnectionString = "Your Connection String";
    using (var command = new SqlCommand())
    {
        command.Connection = connection;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "scUsuarioCorrecto";
        command.Parameters.AddWithValue("@usrLogin", "Your login");
        command.Parameters.AddWithValue("@usrPassword", "Your password");

        connection.Open();
        using (var adapter = new SqlDataAdapter())
        {
            using (var ds = new DataSet())
            {
                adapter.SelectCommand = command;
                adapter.Fill(ds);

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    var correcto = (bool)ds.Tables[0].Rows[0]["correcto"];
                } else
                {
                    // Something went wrong
                }
            }
        }
    }
}

【讨论】:

  • 我认为 SqlDataReader 会更可取......但自从我玩过 ADO 的东西以来,它已经有点过了
  • @misterManager - 实际上,你是对的。我的数据适配器可能是矫枉过正,我应该修改它以使用 DataReader。但是,因为他只会用一个值检索一行,所以无论哪种方式都可能不会影响性能。
  • 仍然是一个很好的答案。使用 (var reader = command.ExecuteReader()){ var correcto = reader["correcto";]} 如果我没有严重错误的话,DataReader 只是更简洁一点.... 给或取一个循环或 [0]某处
  • 谢谢,我得到一个错误:“System.Data.DataTableCollection 不包含行”在这里:“ds.Tables.Rows.Count > 0)”我错过了导入的东西吗?
【解决方案2】:

我想把它放在我对 Icemanind 帖子的评论中(但为了便于阅读而单独发布)。此版本使用 ExecuteScalar :

using (var connection = new SqlConnection())
{
    connection.ConnectionString = "Your Connection String";
    using (var command = new SqlCommand())
    {
        command.Connection = connection;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "scUsuarioCorrecto";
        command.Parameters.AddWithValue("@usrLogin", "Your login");
        command.Parameters.AddWithValue("@usrPassword", "Your password");

        connection.Open();
        object obj = command.ExecuteScalar();
        if (obj is bool)
        {
            bool correcto = (bool)obj;                
        }
        else
        {
           // either empty result set, or value in row is NULL.
        }  
    }
}

关于 ExecuteScalar 的一般说明:

如果 SQL 请求的结果集为空,则 obj 将为 null(即 C# null)。如果结果集至少有一行,但第一列的值为 NULL(即 SQL Server NULL),则 obj 将为 DBNull.Value。

【讨论】:

  • 你的版本肯定更轻量级。我的 DataAdapter 解决方案肯定比需要的更臃肿。后来我意识到了,但我有公司过来,无法回到我的电脑上重写它,哈哈。
【解决方案3】:

该过程只接受两个参数。在这种情况下,由于它正在执行选择,因此您应该能够像从标准 SELECT 语句中一样读取它。

Here's a link to get you started.

【讨论】:

    【解决方案4】:

    问题是你需要用OUTPUT设置参数

    USE AdventureWorks2008R2;
    GO
    IF OBJECT_ID('Sales.uspGetEmployeeSalesYTD', 'P') IS NOT NULL
        DROP PROCEDURE Sales.uspGetEmployeeSalesYTD;
    GO
    CREATE PROCEDURE Sales.uspGetEmployeeSalesYTD
    @SalesPerson nvarchar(50),
    @SalesYTD money OUTPUT
    AS  
    
        SET NOCOUNT ON;
        SELECT @SalesYTD = SalesYTD
        FROM Sales.SalesPerson AS sp
        JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID
        WHERE LastName = @SalesPerson;
    RETURN
    GO
    

    【讨论】:

    • OP 表示他们无法更改程序,必须解决现有问题。
    猜你喜欢
    • 2018-10-13
    • 1970-01-01
    • 2016-11-14
    • 2020-08-03
    • 1970-01-01
    • 2015-11-09
    • 2021-07-24
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多