Выполнение хранимой процедуры в приложении. NET с использованием SQLQuery возвращает неверные значения - PullRequest
1 голос
/ 27 февраля 2020

Issue Descripton:

Я пытаюсь вызвать хранимую процедуру в. NET Базовом приложении. Для целей тестирования я отправляю жестко закодированные значения с тем же значением и типом данных, что и то, что я передаю в SQL Редактор запросов к серверу.

Ниже приведен скриншот того, какие значения, Имя хранимой процедуры и ее тип данных I Прохожу в SQL Редактор запросов к серверу:

Expected Values from DB

Ниже приведен код на стороне NET:

int targetID = 2069;
int problemId1 = 0;
int tradeId1 = 0;

SqlParameter param1 = new SqlParameter("@targetType", 28);
SqlParameter param2 = new SqlParameter("@targeID", targetID);
SqlParameter param3 = new SqlParameter("@startDateToUse", "2019");
SqlParameter param4 = new SqlParameter("@problemID", problemId1);
SqlParameter param5 = new SqlParameter("@tradeID", tradeId1);

tempspexec = DbContext.Database
    .SqlQuery<StoredProcDataExecution>("exec GetWorkOrderChartDataAsync @targetType, @targeID, @startDateToUse, @problemID, @tradeID ", param1, param2, param3, param4, param5
    ).ToList();

Примечание: На следующем снимке экрана показан тип данных param3 и значения для справки.

Data Type Description

Объяснение:

Хранимой процедуре требуется значение String для "startDateToUse", если мы передаем ей int, она вылетает и возвращает все нули в наборе данных. Я передаю String в моем приложении. NET, но он по-прежнему возвращает все нули в моем наборе данных.

Вот что я вижу, если передаю значение int в редакторе запросов SQLServer.

Deesc

Тип данных изменяется на DateTime

DateTime datatype

Спасибо за вашу поддержку.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Я нашел решение для этого.

Я начал использовать SQLCommand вместо SQLQuery. Работал пока.

                DataTable dt = new DataTable();
                SqlConnection conn = new SqlConnection(ConfigurationManager.
                                 ConnectionStrings["SampleTXT"].ConnectionString);
                    conn.Open();

                SqlCommand cmd = new SqlCommand("sp_GetWorkOrderChartDataAsync", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                       // Some Code here

                    }
                }

Спасибо всем за решающее время и поддержку. Все комментарии были очень полезны.

0 голосов
/ 27 февраля 2020

Одна из причин сбоя, которую я вижу здесь, заключается в том, что порядок параметров не тот, который вы думаете; в SSMS вы передаете параметры по name , но в C# вы передаете их по position ; возможно, попробуйте назвать их при использовании exec?

tempspexec = DbContext.Database
    .SqlQuery<StoredProcDataExecution>("exec GetWorkOrderChartDataAsync @targetType=@targetType, @targeID=@targeID, @startDateToUse=@startDateToUse, @problemID=@problemID, @tradeID=@tradeID", param1, param2, param3, param4, param5
    ).ToList();

Обратите внимание, что было бы намного чище, если бы вы сказали SqlQuery, что вы вызываете хранимую процедуру; тогда вам это вообще не нужно, так как «по имени» является значением по умолчанию для SqlClient, если тип команды является хранимой процедурой.

В качестве отступления: вы могли бы найти инструменты например, Dapper проще для этого:

tempspexec = conn.Query<StoredProcDataExecution>("GetWorkOrderChartDataAsync",
    new { // parameters
        targetType=28, targeID=targetID, startDateToUse="2019",
        problemID=problemId1, tradeID=tradeId1
    }, commandType: CommandType.StoredProcedure).AsList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...