C#SqlDataAdapter必须声明标量变量Sql异常
C#新手,正在使用Windows窗体应用程序。我试图对SQL数据库执行更新查询,但一直遇到“必须声明标量变量”错误,我不明白为什么 下面的代码成功地打开了连接。我的update语句是有效的。浏览了很多关于这个话题的帖子,我没有发现我的错误。。。任何帮助都将不胜感激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
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查询并