3

アクセントに問題があります (例: é、à、è など)。SQL Server 2008 Management に直接挿入すると、 INSERT INTO LETTRE_VOIT (LIB_PORT) VALUES ('Payé')うまく機能します。しかし、この構文を C# にロードすると、機能しません。

 try
            {
                using (var connectionWrapper = new Connexion())
                {
                    var connectedConnection = connectionWrapper.GetConnected();


                    string sql_Syntax = Outils.LoadFileToString(HttpContext.Current.Server.MapPath("~/SQL/UpdateEtClotureList.sql"));
                    SqlCommand comm_Command = new SqlCommand(sql_Syntax, connectionWrapper.conn);
                    comm_Command.Parameters.AddWithValue("@CHAUFFEUR", CHAUFFEUR);
                    comm_Command.Parameters.AddWithValue("@Trans", ClotList);
                    string IdOrdre = "";
                    SqlDataReader readerOne = comm_Command.ExecuteReader();
                    while (readerOne.Read())
                    {
                        if (IdOrdre != "") IdOrdre += ",";
                        IdOrdre += readerOne["NO_ORDRE"].ToString();                    
                    }
                    return IdOrdre;
                }
            }
            catch (Exception excThrown)
            {
                throw new Exception(excThrown.Message);
            }

UpdateEtClotureList.sql の内容:

DECLARE @AfterUpdate table (
    NO_ORDRE_Temp int NOT NULL, 
    CODE_DEST_Temp varchar(10) NOT NULL,
    DATE_CLOTUR_Temp datetime NOT NULL, 
    CODE_CLIENT_Temp varchar(20) NOT NULL,
    MODAL_MODE_Temp char(1) NOT NULL,
    MODAL_PORT_Temp bit NOT NULL,
    LIVRS_EXPRS_Temp bit NOT NULL,
    ENLEV_UNITE_Temp int NOT NULL,
    NBR_COLIS_Temp int NOT NULL,
    POID_Temp decimal(10, 2) NOT NULL,
    ENLEV_CREMB_Temp decimal(10, 2)  NULL,
    ENLEV_DECL_Temp decimal(10, 2)  NULL

  )  

UPDATE ORDRE 
SET STATUT_ORDRE = 2, DATE_CLOTUR = GETDATE(), CHAUFFEUR = @CHAUFFEUR
OUTPUT inserted.NO_ORDRE, inserted.CODE_DEST, inserted.DATE_CLOTUR, inserted.CODE_CLIENT, inserted.MODAL_MODE, inserted.MODAL_PORT,inserted.LIVRS_EXPRS,inserted.ENLEV_UNITE,  inserted.NBR_COLIS,inserted.POID,inserted.ENLEV_CREMB,inserted.ENLEV_DECL INTO @AfterUpdate
WHERE STATUT_ORDRE = 1 AND (TRANSPORTEUR IN (SELECT ParsedString From dbo.ParseStringList(@Trans)))



INSERT INTO LETTRE_VOIT 

OUTPUT inserted.NO_ORDRE

select rsVoit.NOID, NO_ORDRE_Temp, rsOrdre.CODE_DEST_Temp,rsOrdre.DATE_CLOTUR_Temp, rsOrdre.CODE_CLIENT_Temp, rsOrdre.MODAL_MODE_Temp, rsOrdre.MODAL_PORT_Temp,
CASE rsOrdre.MODAL_PORT_Temp
            WHEN 'false' THEN 'Payé'
            ELSE 'Du'
        END, 
rsOrdre.LIVRS_EXPRS_Temp,
CASE rsOrdre.LIVRS_EXPRS_Temp
            WHEN 'false' THEN 'Long'
            ELSE 'Express'
        END, 
  rsOrdre.ENLEV_UNITE_Temp, LIBELLE, NBR_COLIS_Temp,POID_Temp,ENLEV_CREMB_Temp,ENLEV_DECL_Temp
from @AfterUpdate rsOrdre
inner join
(
  select CODE_DEST,MODAL_MODE, MODAL_PORT, LIVRS_EXPRS,ENLEV_UNITE, ROW_NUMBER() over (order by CODE_DEST) as NOID
  from ORDRE
  group by CODE_DEST,MODAL_MODE,MODAL_PORT,LIVRS_EXPRS,ENLEV_UNITE
) rsVoit on rsVoit.CODE_DEST = rsOrdre.CODE_DEST_Temp and rsVoit.MODAL_MODE = rsOrdre.MODAL_MODE_Temp
and rsVoit.MODAL_PORT = rsOrdre.MODAL_PORT_Temp and rsVoit.LIVRS_EXPRS = rsOrdre.LIVRS_EXPRS_Temp
and rsVoit.ENLEV_UNITE = rsOrdre.ENLEV_UNITE_Temp

LEFT JOIN T_UNITE ON rsOrdre.ENLEV_UNITE_Temp = T_UNITE.NOID

order by rsVoit.NOID, NO_ORDRE_Temp

結果は Pay* で、 Payé ではなく、* は四角形の記号です。

よろしくお願いします。

PS: varchar 型の代わりに nvarchar を使用しますnvarchar

構文を変更すると:

....
CASE rsOrdre.MODAL_PORT_Temp
            WHEN 'false' THEN N'Payé'
            ELSE 'Du'
        END, 
rsOrdre.LIVRS_EXPRS_Temp,
.....

私は得た: 結果

SQLプロファイラを見ると: ここに画像の説明を入力

4

4 に答える 4

3

varcharこれは、の代わりに使用しているためでしょnvarcharうか? SQL 型は、nvarcharASCII 以外の文字を格納する場合に使用するものです。 nvarcharUnicode として保存されます。 This SO postは違いをカバーしています。

編集:問題の文字は拡張 ASCII セットに含まれているため、おそらく ASCII と Unicode の関係は問題になりません (@podiluska が指摘)。

編集 2: SQL スクリプト ファイルのエンコーディングを確認しましたか (ANSI と Unicode のどちらですか?)。このフォーラムの投稿を確認してください。SQL スクリプト ファイル (UpdateEtClotureList.sql) を保存するときは、保存ボタンのドロップダウンから [エンコード付きで保存] を選択し、[Unicode (コードページ 65001)] を選択します。

于 2012-08-10T07:47:32.913 に答える
2

SQLがLoadFileToString破損していますか?それを印刷するとどうなりますか?まだéのキャラクターが見えますか?

SQLを次のように変更するとどうなりますか

WHEN 'false' THEN 'Pay' +CHAR(233)
于 2012-08-10T08:48:24.163 に答える
2

NVARCHAR列とN''Unicode文字列リテラルを確認した後、私の推測では、Outils.LoadFileToString()は.sqlファイルを読み取るために正しいエンコーディングを使用していません。

于 2012-08-10T08:52:48.623 に答える
2
INSERT INTO LETTRE_VOIT (LIB_PORT) VALUES ('Payé') 

動作しますが、一般的には次を使用する必要があります。

INSERT INTO LETTRE_VOIT (LIB_PORT) VALUES (N'Payé')

を付けて、Nそれが Unicode 文字列であることを示します。

于 2012-08-10T08:13:40.317 に答える