-2
UPDATE Productions 
SET CountryCode = (CASE WHEN @SOffice='LA' OR @SOffice='GA' then 'USA' ELSE 'CAN' END)

これが正しい update ケース ステートメントであるかどうかは誰でも確認できます。何らかのエラーが発生しているようです。それは私には正しいようです。

私はアプリケーションに取り組んでおり、次の更新ステートメントがあります。

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();

しかし、アプリケーションをビルドしてこの機能を実行すると、次のエラーが発生します。

例外メッセージ: スカラー変数 "@SOffice" を宣言する必要があります。メソッドによってトリガーされる例外: OnError

これは何を意味するのでしょうか??

4

3 に答える 3

4
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  

上記のコードを SQL Server 2008 にコピー アンド ペーストすると、正常に動作することがわかります。

これがマルセロに役立つことを願っています

于 2013-07-11T16:12:23.573 に答える
3

コマンドを実行するために使用している SqlCommand オブジェクトにそのパラメーターを入れる必要があります。@シンボルは、SqlParameter をコマンドに追加する必要がある場合は、@SOffice削除する必要がある変数でない場合はSql の変数を示します。@実行する前に

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

また、SQLステートメントを動的に構築するのではなく、パラメーターとして他のオプションを含めるParameters必要があります。コマンドのプロパティを介してパラメーターを追加する方がはるかに安全です...コマンドをusingステートメントでラップし、connあまりにも1つに包まれるべきです

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();


    }
于 2013-07-11T15:47:40.583 に答える
0

宣言されていないクエリ@SOffice varで

以下のリンクを使用してください。

http://msdn.microsoft.com/en-us/library/z72eefad%28v=vs.100%29.aspx

于 2013-07-11T16:23:32.570 に答える