Можете ли вы сказать, что не так с SqlDataReader я возвращаю "System.Data.SqlClient.SqlException:" Должен объявить скалярную переменную "@idorder" - PullRequest
1 голос
/ 11 февраля 2020

Привет, поскольку я использую оператор using, мои одноразовые соединения должны обрабатываться, как только он покидает оператор, но мой код жестко связан с другими методами в программе, где я опрашиваю базу данных или получаю информацию. Поэтому я решил добавить conn.Open () и conn.Close (), чтобы избежать ошибок тайм-аута или оставить одновременно открытыми многие подключения к базе данных. Я получаю сообщение об ошибке, с которым я не знаком, и это:

System.Data.SqlClient.SqlException: 'Должен объявить скалярную переменную "@idorder"

Это относится к моему параметру ? Что я делаю не так?

Надеюсь, это поможет другим разработчикам начать с ADO. NET

public List<LogModel> GetLatestLogsOnEachSystemId(
       {
            List<string> _systemIds = new List<string>();
            _systemIds.Add("MA");
            _systemIds.Add("MB");
            _systemIds.Add("DY");
            _systemIds.Add("FA");

            using (SqlConnection conn = new SqlConnection(connString))
            {

                for (int i = 0; i < _systemIds.Count; i++)
                {
                    string systemId = _systemIds[i];

                    var querystring = "select top 1 * " +
                                        "from dbo.RadarMF30_log " +
                                            "where SYSTEM_ID = @id" +
                                                "order by Log_writing_time desc";


                    SqlCommand cmd = new SqlCommand(querystring, conn);
                    conn.Open();
                    cmd.Parameters.AddWithValue("@id", systemId);
                    SqlDataReader reader = cmd.ExecuteReader();
                    conn.Close();

                    var model = new LogModel
                    {
                        errorCode = reader.GetString(0),
                        errorMsg = reader.GetString(1),

Ответы [ 3 ]

2 голосов
/ 11 февраля 2020
 "select top 1 * " +
    "from dbo.RadarMF30_log " +
    "where SYSTEM_ID = @id" +
    "order by Log_writing_time desc";

Нет пробела между @id и order.

Поэтому он считает, что существует переменная с именем @idorder

1 голос
/ 11 февраля 2020

JamesS и Yaman уже рассмотрели фундаментальную проблему, но: в качестве общего совета, если вы собираетесь иметь SQL в C#, дословных строковых литералах (@"...") избегайте почти все проблемы с пробелами:

    const string query = @"
select top 1 *
from dbo.RadarMF30_log
where SYSTEM_ID = @id
order by Log_writing_time desc";

(примечание: это не обязательно должно быть const - просто ... здесь также не нужно, чтобы оно было переменной)

В качестве примечания: это тот тип сценария, который также очень хорошо работает с такими инструментами, как «Dapper», чтобы вообще не связываться с ADO. NET вообще:

    var model = conn.QuerySingle<LogModel>(@"
select top 1 *
from dbo.RadarMF30_log
where SYSTEM_ID = @id
order by Log_writing_time desc", new { id = systemId });

Больше не надо связываться с нюансы команд и параметров, или беспокойство о том, закрыли ли вы соединение слишком рано (посмотрите внимательно: вы закрыли соединение слишком рано).


В качестве примечания: вы также можете захотеть чтобы избежать select * - это может вызвать два разных типа проблем:

  • , возвращающих множество больших столбцов (CLOB / BLOB и c), которые вам не нужны, влияющих на производительность
  • иногда, просто иногда, столбцы не в том порядке, в котором вы указали т; если вы связываете порядковым (GetString(0) et c в вашем коде), это может иметь огромное влияние; обратите внимание, что «Dapper» связывается по name , так что здесь это не такая большая проблема (при условии, что имена достаточно хорошо совпадают, чтобы библиотека поняла, что вы имели в виду)
0 голосов
/ 11 февраля 2020

, поскольку между @id и order нет пробела, он считает, что имя параметра - @idorder, что не указано

var querystring = "select top 1 * " +
                                        "from dbo.RadarMF30_log " +
                                            "where SYSTEM_ID = @id " +
                                                "order by Log_writing_time desc";

или

var querystring = "select top 1 * " +
                                        "from dbo.RadarMF30_log " +
                                            "where SYSTEM_ID = @id" +
                                                " order by Log_writing_time desc";
...