2

私は (PRINT) データをきれいに出力する SQL クエリを提供されました。スティッキーな部分は、既に EF4.1 を使用しているアプリケーションを介して、それを実行する必要があることです (そして、明らかに後で出力を使用する必要があります)。

これが私がこれまでに持っているものです。

        string sqlQuery = string.Empty;
        _ctx.Connection.Open();
        DbCommand com = _ctx.Connection.CreateCommand();

        sqlQuery = @"declare @note varchar(1000)
                    set @note = (select
                    'Client: '+cast([NO_CLIENT] as varchar)+' - '+TABLE1.[nom]+
                    CHAR(13)+CHAR(10)+
                    'Adr_1 '+[ADR_1]+
                    CHAR(13)+CHAR(10)+
                    'Adr_2 '+[ADR_2]+
                    CHAR(13)+CHAR(10)+
                    'Adr_3 '+[ADR_3]+
                    CHAR(13)+CHAR(10)+
                    'Adr_4 '+[ADR_4]+
                    CHAR(13)+CHAR(10)+
                    'Contact: '+[CONTACT]+
                    CHAR(13)+CHAR(10)+
                    'Postal Code|Code Postal: '+substring([CODE_POSTAL],1,3)+' '+substring([CODE_POSTAL],4,3)+
                    CHAR(13)+CHAR(10)+
                    'Tel No: '+[TELEPHONE]+' Ext.: '+[POSTE_EXTENSION]+
                    CHAR(13)+CHAR(10)+
                    'Fax No: '+[NO_FAX]+
                    CHAR(13)+CHAR(10)+
                    'Clinic: '+[CLINIQUE_QUI_FACTURE]+
                    CHAR(13)+CHAR(10)+
                    'Langu.: '+ case [LANGUE] when 1 then 'Fr' when 2 then 'En' Else 'N/A'  end+
                    CHAR(13)+CHAR(10)+
                    case [ACTIF] when 0 then 'Non-Active|Inactif' when 1 then 'Active|Actif' Else 'N/A' end+
                    CHAR(13)+CHAR(10)+
                    'Account Man.|Chargé Cpte: '+CAST(TABLE1.[NO_VENDEUR_1] AS VARCHAR)+' - '+clve.[NOM]+
                    CHAR(13)+CHAR(10)+
                    'DATE REGISTERED|DATE ENREGISTREMENT: '+[DATE_ENREGISTREMENT]+
                    CHAR(13)+CHAR(10)+
                    '---------- MARKETING INFO ----------'+
                    CHAR(13)+CHAR(10)+
                    'Company|Cie: '+[TABLE2_NOM]+
                    CHAR(13)+CHAR(10)+
                    'Contact: '+[TABLE2_CONTACT]+
                    CHAR(13)+CHAR(10)+
                    'Tel.: '+[TABLE2_TELEPHONE]+
                    CHAR(13)+CHAR(10)+
                    'Adr_1: '+[TABLE2_ADR1]+
                   CHAR(13)+CHAR(10)+
                   'Adr_2: '+[TABLE2_ADR2]+
                   CHAR(13)+CHAR(10)+
                   'Adr_3: '+[TABLE2_ADR3]+
                   CHAR(13)+CHAR(10)+
                   'Adr-4: '+[TABLE2_ADR4]+
                   CHAR(13)+CHAR(10)+
                   'City|Ville: '+[TABLE2_VILLE_PROV]+
                   CHAR(13)+CHAR(10)+
                   'Postal Code|Code Postal: '+substring([TABLE2_CODE_POSTAL],1,3)+' '+substring([TABLE2_CODE_POSTAL],4,3)+
                   CHAR(13)+CHAR(10)+
                   'Fax No: '+[TABLE2_FAX_1]+
                   CHAR(13)+CHAR(10)+
                   'Ext.: '+[TABLE2_FAX_1_POSTE]+
                   CHAR(13)+CHAR(10)+
                   'Fax 2 :'+[TABLE2_FAX_2]+
                   CHAR(13)+CHAR(10)+
                   'Email1: '+[TABLE2_EMAIL1]+
                   CHAR(13)+CHAR(10)+
                   'Email2: '+[TABLE2_EMAIL2]

                    FROM TABLE1 
                        left join TABLE3 on TABLE1.no_vendeur_1 = TABLE3.no_vendeur
                        where [NO_CLIENT] = 2003)


                    print @note

                ";

        com.CommandText = @sqlQuery;
        DbDataReader rd = com.ExecuteReader();

クエリは SQL Management Studio で正常に実行されますが、アプリケーションがクエリを実行すると、この例外が発生します: (何らかの形で解析しているように見えます)

The query syntax is not valid. Near term '@note', line 1, column 14.

私は何を間違っていると思いますか?(多分全部笑)

4

2 に答える 2

2

まず、ステートメントを として実行できないと確信しています。次のようにすればうまくいくと思います。PrintSqlReader

select @note =

さらに、SQLステートメントを次のように変更します(私の好み):

select @note =

それ以外の

set @note =

更新 1

だから私は次のことをしました:

using (SqlConnection con = new SqlConnection(@"Data Source=localhost\sqlexpress;
                     Integrated Security=SSPI;MultipleActiveResultSets=true"))
{
  con.Open();
  using (SqlCommand com = new SqlCommand(string.Empty, con))
  {
    string blah = @"declare @note varchar(1000) 
      set @note = 'asdf' 
      select @note";
    com.CommandText = blah;
    com.ExecuteReader();
  }
}

そして、問題なく実行されます。そのため、1 行目に問題がある可能性が高く (エラー状態として)、DbCommand が何かを正しく解析していないか、提供していないコードが DbCommand を変更している可能性があります。

さらに、Entity Framework を使用している場合、同じものを作成するために使用する代わりに、Entity Framework を完全にバイパスするのはなぜでしょうか?

于 2012-09-28T20:21:15.997 に答える
0

これが私がやったことです:

var r = _ctx.ExecuteStoreQuery<string>(@sqlQuery).FirstOrDefault();

sqlQueryは@noteの値を宣言し設定し、最後にselectを実行します。

r にはフラット テキストが含まれます。

これは私を正しい方向に向けました: ExecuteStoreCommand は -1 、 EntityFramework 、C# を返しますか?

于 2012-09-28T21:38:41.967 に答える