从C#代码调用存储过程时,不返回任何数据

时间:2019-01-04 15:58:15

标签: c# sql-server dapper

我有一个存储过程,该过程接受大约8个参数并返回一堆数据。存储过程本身运行良好,当我在SSMS中调用它时它会返回数据。但是,当我使用Dapper ORM从我的应用程序中调用它时,我没有得到任何数据。

我在这里查找了类似的主题,并且尝试了所有建议的方法:Dapper multi-parameter stored procedure query returns nothing back from database

这是我的代码:

localConnection = new SqlConnection(defaultSettings.SetConnectionString(auth.DB_Name));

var parameters = new DynamicParameters();

try
{
    parameters.Add("@param2", "val1");
    parameters.Add("@param3", "val2");
    parameters.Add("@param4", "val3");
    parameters.Add("@param5", "val4");
    parameters.Add("@param6", "val5");
    parameters.Add("@param7", "val6");
    parameters.Add("@param8", "val7");

    var orders = localConnection.Query<Order>("spGetData", parameters, commandType: CommandType.StoredProcedure).ToList();
}
catch (Exception ex)
{
    log.Error("Getdata Error: " + ex.Message);
}

这是SQL Server存储过程:

CREATE PROCEDURE [dbo].[spGetData]
     @param1 VARCHAR(8),         
     @param2 VARCHAR(8),        
     @param3 VARCHAR(8),         
     @param4 VARCHAR(8),        
     @param5 VARCHAR(8),         
     @param6 VARCHAR(8),         
     @param7 VARCHAR(8) 
AS        
    SET NOCOUNT ON    

    SELECT TOP 1 * 
    FROM Orders a 
    JOIN ChangeLog b ON a.id = b.id
    WHERE a.name = @param1 
      AND a.col2 = @param2  
      AND b.col1 = @param3
      AND b.col3 = @param4 
      AND b.col4 = @param5 
      AND a.col3 = @param6 
      AND b.col5 = @param7

    RETURN 0

知道发生了什么吗?还是我做错了什么?

2 个答案:

答案 0 :(得分:1)

据我所知,Dapper和多个参数没有问题。这是我创建的测试代码:

class Program
{
    static void Main(string[] args)
    {
        SqlConnection c = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=tempdb;Data Source=.\SQLEXPRESS");

        c.Execute(@"
CREATE PROCEDURE GetPerson(
    @N VARCHAR(10),
    @A INT,
    @S INT
)AS
BEGIN
    SELECT @N as Name, @A as Age, @S as Salary;
END;");

        //works
        var p = c.Query<Person>("GetPerson", new { A = 1, N = "John", S = 1000 }, commandType: System.Data.CommandType.StoredProcedure);

        //doesn't work, "procedure expects parameter @A which was not supplied"
        int i = 2, j = 2000; string n = "Frank";
        var q = c.Query<Person>("GetPerson", new { i, n, j }, commandType: System.Data.CommandType.StoredProcedure);

        //works
        int A = 3, S = 3000; string N = "Joe";
        var r = c.Query<Person>("GetPerson", new { S, A, N }, commandType: System.Data.CommandType.StoredProcedure);

        //works
        DynamicParameters dp = new DynamicParameters();
        dp.Add("@A", 4);
        dp.Add("@N", "Derek");
        dp.Add("@S", 4000);
        var s = c.Query<Person>("GetPerson", dp, commandType: System.Data.CommandType.StoredProcedure);

        DynamicParameters dp2 = new DynamicParameters();
        dp2.Add("A", 5);
        dp2.Add("N", "Tim");
        dp2.Add("S", 5000);
        var t = c.Query<Person>("GetPerson", dp2, commandType: System.Data.CommandType.StoredProcedure);

    }
}

class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
}

所有//works返回1个人的查询。该查询输出的Salary列未在Person类中表示,因此只会丢失。

主要要点:

  • dapper在接受参数方面非常灵活
  • dapper参数名称很重要
  • dapper不在乎参数名称中的@
  • 在强类中没有匹配属性的
  • 查询列未显示

您发现这是对您的情况至关重要的最后一个;您的查询没有输出名称与您的订单对象匹配的列

答案 1 :(得分:1)

我发现了问题。我正在使用的<Button variant="contained" component="label" > Upload File <input type="file" style={{ display: "none" }} /> </Button> 类具有应与存储过程的数据列匹配的属性,与之不匹配。

一旦我解决了这个问题,我就会开始工作。