C# 使用case和or更新语句

C# 使用case和or更新语句,c#,sql,sql-server,sql-server-2008,C#,Sql,Sql Server,Sql Server 2008,是否有人可以确认这是一个正确的更新案例陈述。我似乎遇到了某种错误。在我看来这是正确的 我正在处理一个应用程序,并有以下更新声明: UPDATE Productions SET CountryCode = (CASE WHEN @SOffice='LA' OR @SOffice='GA' then 'USA' ELSE 'CAN' END) 但是,当我构建应用程序并运行此功能时,会出现以下错误: 异常消息:必须声明标量变量“@SOffice”。 异常由方法触发:OnError 这意味着什么??

是否有人可以确认这是一个正确的更新案例陈述。我似乎遇到了某种错误。在我看来这是正确的

我正在处理一个应用程序,并有以下更新声明:

UPDATE Productions 
SET CountryCode = (CASE WHEN @SOffice='LA' OR @SOffice='GA' then 'USA' ELSE 'CAN' END)
但是,当我构建应用程序并运行此功能时,会出现以下错误:

异常消息:必须声明标量变量“@SOffice”。 异常由方法触发:OnError


这意味着什么???

您需要将该参数放入用于执行命令的SqlCommand对象中,
@
符号表示Sql中的一个变量,如果
@SOffice
不是一个变量,则需要删除
@
,如果是,则需要在执行命令之前向该命令添加一个SqlParameter

SqlCommand cmd = new SqlCommand("UPDATE Productions SET CountryCode = (CASE WHEN @SOffice IN ('LA', 'GA') then 'USA' ELSE 'CAN' END), ProvinceCode = '" + user.GetProvinceCode() + "' WHERE ID = " + newProductionID, conn);
cmd.ExecuteNonQuery();
您还应该在as参数中包含其他选项,而不是通过动态构建sql语句,通过命令的
parameters
属性添加参数更安全。。。您还需要使用语句将命令包装在一个
中,conn也应该包装在一个
语句中

cmd.Parameters.Add(new SqlParameter("SOffice",DbType.Char,2){Value = "LA"})

在SQLServer2008上复制并粘贴上面的代码,您会发现它工作正常

希望这有帮助
marcelo

在您的查询@SOffice var中,未声明

使用下面的链接


那么错误是什么呢,顺便说一句,不用
,你可以这样写,
@SOffice IN('LA','GA')
是的,smart没有想到!。谢谢:)这是一个有效的语句,工作正常-因此您的错误与其他内容有关。SOffice是一个列吗?如果是,请移除@标志。否则,更新就没有意义了。每当您在@SOffice中传递一个新参数值时,您都会更新整个表?因为您只是在执行更新,为什么不使用
cmd.ExecuteScalar()
?请不要在这里喊叫。我们都能读得很好(或者我们可能不会在这里)。键盘上的Shift键是有原因的——使用它可以使文本更容易阅读和理解。请用它。谢谢
using(var conn = new SqlConnection(ConfigurationMananger
                         .ConnectionStrings["conn"].ConnectionString)
    using(cmd = conn.CreateCommand())
    {
        cmd.CommandText = 
        @"UPDATE Productios 
          SET CountryCode = (CASE 
                                WHEN @SOffice IN('LA','GA') 
                             THEN 'USA' ELSE 'CAN'
                            END),
              ProvinceCode = @ProvinceCode
          WHERE ID = @newProductionID";
        cmd.Parameters.AddRange(new[]{
            new SqlParameter("SOffice",DbType.Char,2)
                {
                    Value = "LA"
                },
            new SqlParameter("ProvinceCode",DbType.Int)
                {
                    Value = user.GetProvinceCode()
                },
            new SqlParameter("newProductionID",DbType.Int)
                {
                    Value = newProductionID
                }
        });
        if(!conn.State == ConnectionState.Open)
            conn.Open();
        var resultCount = cmd.ExecuteNonQuery();


    }
declare @Productions table(
     ind int not null identity(1,1)primary key clustered
    ,CountryCode nchar(3) not null 
    ,SOFFICE NCHAR(2) NULL
    )

insert into @Productions (CountryCode, SOFFICE) VALUES ('ITA','LA')
insert into @Productions (CountryCode, SOFFICE) VALUES ('ITA','VE')
insert into @Productions (CountryCode, SOFFICE) VALUES ('ITA','LZ')
insert into @Productions (CountryCode, SOFFICE) VALUES ('FRA','GA')
insert into @Productions (CountryCode, SOFFICE) VALUES ('FRA','BF')
insert into @Productions (CountryCode, SOFFICE) VALUES ('ITA','VR')
insert into @Productions (CountryCode, SOFFICE) VALUES ('GER','LA')
insert into @Productions (CountryCode, SOFFICE) VALUES ('CAN','LA')


SELECT * FROM @Productions      

UPDATE P
   SET COUNTRYCODE = CASE P.SOFFICE WHEN 'LA' THEN 'USA' 
                                    WHEN 'GA' THEN 'USA'
                                    ELSE 'CAN'
                     END -- CASE
   FROM @PRODUCTIONS P


SELECT * FROM @Productions