C# SqlDataAdapter Должен объявить скалярную переменную Sql Exception

Новичок в C# и работает над приложением Windows Form. Я пытаюсь выполнить запрос на обновление базы данных SQL, но продолжаю сталкиваться с ошибкой «Должен объявить скалярную переменную», и я не понимаю, почему.

Приведенный ниже код успешно открывает соединение. Мое заявление об обновлении действительно. Просматривая множество сообщений по этой теме, я просто не вижу своей ошибки... буду признателен за любую помощь.

public void SetJobStatus(long JobId)
{
    string strSql = "update Jobmaster set jobstatus = 5 where equid = @stationId AND ID <> @jobId AND OfflineEntry = 0;";

    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString = GlobalVars.connString;
        conn.Open();
        // use the connection here, and check to confirm it is open
        if (conn.State != ConnectionState.Open)
        {
            if (conn != null)
            {
                conn.Close();
            }
            conn.Open();
        }
        SqlCommand command;
        SqlDataAdapter adapter = new SqlDataAdapter();

        command = new SqlCommand(strSql, conn);
        //below AddWithValue gives error:
        //System.Data.SqlClient.SqlException: 'Must declare the scalar variable "@stationId".'
        //command.Parameters.AddWithValue("@stationId", 1);
        //command.Parameters.AddWithValue("@jobId", JobId);
        
        //next I tried this, and the same error:
        //System.Data.SqlClient.SqlException: 'Must declare the scalar variable "@stationId".'
        command.Parameters.Add("@stationId", SqlDbType.Int);
        command.Parameters["@stationId"].Value = 1;
        command.Parameters.Add("@jobId", SqlDbType.Int);
        command.Parameters["@jobId"].Value = JobId;

        adapter.UpdateCommand = new SqlCommand(strSql, conn);
        adapter.UpdateCommand.ExecuteNonQuery();
    }
}

person argent65    schedule 05.10.2020    source источник
comment
Что, если вы просто сделаете command.ExecuteNonQuery()? Адаптер на самом деле не нужен для выполнения команды? В какой строке код выдает исключение?   -  person Chetan Ranpariya    schedule 05.10.2020
comment
обычно это означает, что значение равно null или параметр не был добавлен, хотя здесь я этого не вижу; примечание: это может быть намного проще с Dapper (бесплатно в NuGet): conn.Execute(strSql, new { stationId = 1, jobId = JobId });   -  person Marc Gravell    schedule 05.10.2020
comment
Вы объявляете adapter.UpdateCommand = new SqlCommand(strSql, conn); после того, как добавили свои параметры в command, что означает, что вы фактически не добавляете никаких параметров, когда делаете ExecuteNonQuery. Если вы сделаете adapter.UpdateCommand = command;, это должно сработать.   -  person WSC    schedule 05.10.2020
comment
Команда SQL имеет четыре запроса: 1) Выбрать 2) Обновить 3) Вставить 4) Удалить. Чтобы UpdateCommand работал, вам нужны все четыре запроса. CommandBuilder принимает запрос на выбор и автоматически генерирует остальные три. См.: docs.microsoft.com/en-us/dotnet/api/   -  person jdweng    schedule 05.10.2020
comment
Извиняюсь, что не указал ошибку. Когда я выполняю код, как показано выше, возникает ошибка объявления скалярной переменной в adapter.UpdateCommand.ExecuteNonQuery().   -  person argent65    schedule 05.10.2020


Ответы (2)


Я проверил ваш код, и он требует некоторых изменений. Пожалуйста, попробуйте запустить код ниже:

public void SetJobStatus(int JobId)
{
    string strSql = "update Jobmaster set jobstatus = 5 where equid = @stationId AND ID <> @jobId AND OfflineEntry = 0;";

    using (SqlConnection conn = new SqlConnection())
    {
        try
        {
            conn.ConnectionString = GlobalVars.connString;
            conn.Open();
            SqlCommand command = new SqlCommand(strSql, conn);
            command.CommandType = CommandType.Text;
            command.Parameters.Add("@stationId", SqlDbType.Int);
            command.Parameters["@stationId"].Value = 1;
            command.Parameters.Add("@jobId", SqlDbType.Int);
            command.Parameters["@jobId"].Value = JobId;
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }
        finally
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }
    }
}

Советы:

  • Всегда закрывайте соединение после завершения задачи или в случае ошибки.
person Ravi Parasaniya    schedule 05.10.2020
comment
Соединение будет автоматически закрыто из-за оператора using: stackoverflow.com/a/18588084/2850543 - person Millie Smith; 06.10.2020

Спасибо всем, кто сюда зашел. Комментарий WSC помог - изменение adapter.UpdateCommand = command; сработало. Я попробовал три варианта добавления параметров после изменения WSC - два из них сработали, один нет.

Мой пересмотренный код ниже. У меня есть все три варианта, перечисленные в коде, надеюсь, это поможет кому-то еще.

public void SetJobStatus(long JobId)
{
    string strSql = "update Jobmaster set jobstatus = 5 where equid = @stationId AND ID <> @jobId AND OfflineEntry = 0;";

    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString = GlobalVars.connString;
        conn.Open();
        // use the connection here, and check to confirm it is open
        if (conn.State != ConnectionState.Open)
        {
            if (conn != null)
            {
                conn.Close();
            }
            conn.Open();
        }
        SqlCommand command;
        SqlDataAdapter adapter = new SqlDataAdapter();

        command = new SqlCommand(strSql, conn);
        
        //works
        command.Parameters.AddWithValue("@stationId", GlobalVars.stationId);
        command.Parameters.AddWithValue("@jobId", JobId);

        //works
        //command.Parameters.Add("@stationId", SqlDbType.Int);
        //command.Parameters["@stationId"].Value = 5;
        //command.Parameters.Add("@jobId", SqlDbType.Int);
        //command.Parameters["@jobId"].Value = JobId;

        //throws error at adapter.UpdateCommand.ExecuteNonQuery line:
        //'The parameterized query '(@stationId int,@jobId int)update Jobmaster set jobstatus = 5 wh' expects the parameter '@stationId', which was not supplied.'
        //command.Parameters.Add("@stationId", SqlDbType.Int, 5);
        //command.Parameters.Add("@jobId", SqlDbType.Int, (int)JobId);

        adapter.UpdateCommand = command;
        adapter.UpdateCommand.ExecuteNonQuery();
    }

}
person argent65    schedule 05.10.2020