C#SqlDataAdapter必须声明标量变量Sql异常

C#SqlDataAdapter必须声明标量变量Sql异常,c#,sqldataadapter,updatecommand,C#,Sqldataadapter,Updatecommand,C#新手,正在使用Windows窗体应用程序。我试图对SQL数据库执行更新查询,但一直遇到“必须声明标量变量”错误,我不明白为什么 下面的代码成功地打开了连接。我的update语句是有效的。浏览了很多关于这个话题的帖子,我没有发现我的错误。。。任何帮助都将不胜感激 public void SetJobStatus(long JobId) { string strSql = "update Jobmaster set jobstatus = 5 where equid = @st

C#新手,正在使用Windows窗体应用程序。我试图对SQL数据库执行更新查询,但一直遇到“必须声明标量变量”错误,我不明白为什么

下面的代码成功地打开了连接。我的update语句是有效的。浏览了很多关于这个话题的帖子,我没有发现我的错误。。。任何帮助都将不胜感激

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();
    }
}
public void设置作业状态(长作业ID)
{
string strSql=“update Jobmaster set jobstatus=5,其中equid=@stationId和ID@jobId和OfflineEntry=0;”;
使用(SqlConnection conn=newsqlconnection())
{
conn.ConnectionString=GlobalVars.connString;
conn.Open();
//使用此处的连接,并检查以确认其已打开
如果(连接状态!=连接状态打开)
{
如果(conn!=null)
{
康涅狄格州关闭();
}
conn.Open();
}
SqlCommand命令;
SqlDataAdapter=新的SqlDataAdapter();
command=新的SqlCommand(strSql,conn);
//下面的AddWithValue给出了错误:
//System.Data.SqlClient.SqlException:'必须声明标量变量“@stationId”。'
//command.Parameters.AddWithValue(“@stationId”,1);
//command.Parameters.AddWithValue(“@jobId”,jobId);
//接下来,我尝试了这个,但出现了相同的错误:
//System.Data.SqlClient.SqlException:'必须声明标量变量“@stationId”。'
Add(“@stationId”,SqlDbType.Int);
command.Parameters[“@stationId”]。值=1;
Add(“@jobId”,SqlDbType.Int);
command.Parameters[“@jobId”].Value=jobId;
adapter.UpdateCommand=newsqlcommand(strSql,conn);
adapter.UpdateCommand.ExecuteOnQuery();
}
}

我已经检查了您的代码,需要进行一些更改。请尝试运行以下代码:

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();
            }
        }
    }
}
public void SetJobStatus(int-JobId)
{
string strSql=“update Jobmaster set jobstatus=5,其中equid=@stationId和ID@jobId和OfflineEntry=0;”;
使用(SqlConnection conn=newsqlconnection())
{
尝试
{
conn.ConnectionString=GlobalVars.connString;
conn.Open();
SqlCommand=newsqlcommand(strSql,conn);
command.CommandType=CommandType.Text;
Add(“@stationId”,SqlDbType.Int);
command.Parameters[“@stationId”]。值=1;
Add(“@jobId”,SqlDbType.Int);
command.Parameters[“@jobId”].Value=jobId;
command.ExecuteNonQuery();
}
捕获(例外情况除外)
{
if(conn.State==ConnectionState.Open)
{
康涅狄格州关闭();
}
}
最后
{
if(conn.State==ConnectionState.Open)
{
康涅狄格州关闭();
}
}
}
}
小贴士:

  • 任务完成后或出现错误时,始终关闭连接

    • 谢谢大家的参与。WSC的评论起到了改变
      adapter.UpdateCommand=命令的作用工作。在做出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();
          }
      
      }
      
      public void设置作业状态(长作业ID)
      {
      string strSql=“update Jobmaster set jobstatus=5,其中equid=@stationId和ID@jobId和OfflineEntry=0;”;
      使用(SqlConnection conn=newsqlconnection())
      {
      conn.ConnectionString=GlobalVars.connString;
      conn.Open();
      //使用此处的连接,并检查以确认其已打开
      如果(连接状态!=连接状态打开)
      {
      如果(conn!=null)
      {
      康涅狄格州关闭();
      }
      conn.Open();
      }
      SqlCommand命令;
      SqlDataAdapter=新的SqlDataAdapter();
      command=新的SqlCommand(strSql,conn);
      //工作
      command.Parameters.AddWithValue(“@stationId”,GlobalVars.stationId);
      command.Parameters.AddWithValue(“@jobId”,jobId);
      //工作
      //Add(“@stationId”,SqlDbType.Int);
      //command.Parameters[“@stationId”]。值=5;
      //Add(“@jobId”,SqlDbType.Int);
      //command.Parameters[“@jobId”].Value=jobId;
      //在adapter.UpdateCommand.ExecuteOnQuery行引发错误:
      //'参数化查询'(@stationId int,@jobId int)update Jobmaster set jobstatus=5 wh'需要未提供的参数'@stationId'
      //Add(“@stationId”,SqlDbType.Int,5);
      //Add(“@jobId”,SqlDbType.Int,(Int)jobId);
      adapter.UpdateCommand=命令;
      adapter.UpdateCommand.ExecuteOnQuery();
      }
      }
      
      如果只执行
      命令.ExecuteNonQuery()
      ?执行命令实际上不需要适配器?代码抛出异常的是哪一行?通常这意味着值是
      null
      ,或者没有添加参数,尽管我看不到在这里发生这种情况;旁注:使用“Dapper”(NuGet上免费)可能会容易得多:
      conn.Execute(strSql,new{stationId=1,jobId=jobId})您正在声明
      adapter.UpdateCommand=newsqlcommand(strSql,conn)
      将参数添加到
      命令后,这意味着在执行
      ExecuteNonQuery
      时实际上没有添加任何参数。如果执行
      adapter.UpdateCommand=command应该可以。SQL命令有四个查询1)选择2)更新3)插入4)删除。要使UpdateCommand正常工作,您需要所有四个查询。CommandBuilder接受Select查询并