【问题标题】:inserted accent into SQL在 SQL 中插入重音
【发布时间】:2012-08-07 12:02:09
【问题描述】:

我有口音问题(例如:é、à、è 等)。 当我直接在 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:我使用 nvarchar 而不是 varchar 类型

当我改变语法时:

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

我得到:

当我通过 SQL Profiler 查看时:

【问题讨论】:

  • (由于您已经编辑了您的专栏是 nvarchar,我怀疑我之前的评论是问题 - 我已将其作为答案发布)
  • 这可能是字体问题吗?如果您选择文本而不是网格,您会看到 é 吗?
  • 你为你的 SQL 实例设置了什么collation
  • 检查您在保存 sql 脚本文件时使用的编码(ANSI 与 Unicode)。请参阅我的更新答案。

标签: c# sql sql-server-2008 non-ascii-characters


【解决方案1】:
INSERT INTO LETTRE_VOIT (LIB_PORT) VALUES ('Payé') 

确实有效,但通常你应该使用:

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

N 表示它是一个unicode 字符串。

【讨论】:

  • @podiluska 嗯 - 你对这个特殊字符是正确的,我认为它是“只是另一个 unicode 字符”。但总的来说,它是正确的。
  • 绝对 - 这是我最初的想法
【解决方案2】:

这可能是因为您使用的是varchar 而不是nvarcharnvarchar SQL 类型是您在存储 ASCII 之外的字符时想要使用的类型。 nvarchar 存储为 unicode。 This SO post 涵盖了差异。

编辑:由于所讨论的字符位于扩展的 ASCII 集中,因此 ASCII 与 unicode 可能不是问题(正如@podiluska 所指出的那样)。

编辑 2:您是否检查了 sql 脚本文件的编码(ANSI 与 Unicode?)。查看this forum post。保存 sql 脚本文件 (UpdateEtClotureList.sql) 时,从保存按钮下拉菜单中选择“使用编码保存”,然后选择 Unicode(代码页 65001)。

【讨论】:

  • 我不这么认为。 é 是一个 ascii 字符,所以它可以在 varchar 中使用。
  • @podiluska 是的,你是right。但是,这绝对看起来像一个编码问题。
【解决方案3】:

LoadFileToString 是否破坏了 SQL?如果打印出来会怎样?你还能看到 é 字符吗?

如果你把 SQL 改成

WHEN 'false' THEN 'Pay' +CHAR(233)

【讨论】:

    【解决方案4】:

    在检查 NVARCHAR 列和 N'' Unicode 字符串文字后,我的猜测是 Outils.LoadFileToString() 没有使用正确的 Encoding 来读取 .sql 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-22
      • 2014-03-10
      • 2019-11-17
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多