Хранимая процедура не возвращает никаких данных при вызове из кода C # - PullRequest
0 голосов
/ 04 января 2019

У меня есть хранимая процедура, которая принимает около 8 параметров и возвращает кучу данных. Сама хранимая процедура работает нормально и возвращает данные, когда я вызываю ее в SSMS. Но когда я вызываю его из своего приложения с помощью Dapper ORM, я не получаю никаких данных обратно.

Я посмотрел похожие потоки здесь и перепробовал все, что было предложено, как этот: Превосходный многопараметрический запрос хранимой процедуры ничего не возвращает из базы данных

Вот мой код:

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 голосов
/ 04 января 2019

Я нашел проблему. У класса Order, который я использую, есть свойства, которые должны соответствовать столбцам данных хранимой процедуры, чего не было.

Как только я исправил это, я заработал.

0 голосов
/ 04 января 2019

Насколько я вижу, проблем с 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 обладает гибкостью в отношении того, как он принимает параметры
  • Важное значение имеет имя параметра
  • Дапперу плевать на @ в имени параметра
  • столбцы запроса, которые не имеют соответствующего свойства в строгом классе, не представлены

И, как вы определили, это последний, который был критическим в вашем случае; Ваш запрос не выводил столбцы с именами, которые соответствуют объекту ваших заказов

...