2012-08-10 1 views
2

에 삽입되었습니다. 억양에 문제가 있습니다 (예 : é, à, è, etc.). SQL Server 2008 관리에 직접 삽입했을 때 INSERT INTO LETTRE_VOIT (LIB_PORT) VALUES ('Payé') 잘 작동합니다. 하지만 C#에서이 구문을로드하면 작동하지 않습니다.억양이 SQL

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 

결과 대신 PAYE의 지불 * 인은, * 사각형 기호입니다.

미리 감사드립니다.

PS : 나는 nvarchar

내가 구문을 변경하면 대신 VARCHAR 타입의 NVARCHAR를 사용

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

내가 가지고 : result

을하고 난 SQL 프로파일 러를 통해 볼 때 : enter image description here

+0

(귀하의 열이 이미 nvarchar로 편집되었으므로 이전 질문이 문제 였을 것으로 생각합니다. 답변으로 게시했습니다.) – Bridge

+0

글꼴 문제 일 수 있습니까? 그리드가 아닌 텍스트를 선택하면 é이 보입니까? – podiluska

+0

무엇 [조합] (http : //blog.sqlauthority.com/2007/08/30/sql-server-2005-find-database-collation-t-sql-and-ssms /) SQL 인스턴스에 대해 설정 했습니까? –

답변

2

LoadFileToString은 SQL을 손상 시키는가? 그걸 인쇄하면 어떻게됩니까? 여전히 é 문자가 보이십니까? 당신은 NVARCHAR 열 및 N ''유니 코드 문자열 리터럴을 확인한 후

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

우우! 마침내 :) – podiluska

3

012를 사용하고 있기 때문일 수 있습니다.회부 원 nvarchar? nvarchar SQL 형식은 ASCII 이외의 문자를 저장하는 경우 사용할 형식입니다. nvarchar은 유니 코드로 저장됩니다. This SO post은 차이점을 다룹니다.

편집 : 문제의 문자가 확장 ASCII 세트에 있기 때문에 ASCII 대 유니 코드 (@podiluska가 지적한)와 관련하여 문제가되지 않을 수도 있습니다.

EDIT 2 : SQL 스크립트 파일 (ANSI 대 유니 코드)에서 인코딩을 확인 했습니까? this forum post을 확인하십시오. SQL 스크립트 파일 (UpdateEtClotureList.sql)을 저장할 때 저장 버튼 드롭 다운에서 "인코딩으로 저장"을 선택하고 유니 코드 (코드 페이지 65001)를 선택하십시오.

+1

꽤 많이 확실히 –

+0

나는 그렇게 생각하지 않는다. é는 ascii 문자이므로 varchar에서는 괜찮습니다. – podiluska

+1

@podiluska 예, 맞습니다 (http://www.asciitable.com/). 그러나 확실히 인코딩 문제처럼 보입니다. –

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

이 작업을 수행하지만, 일반적으로 당신은 사용해야

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

N으로는 유니 코드 문자열의 것을 나타냅니다.

+0

해야합니다. – podiluska

+0

@podiluska 흠 - 당신이이 특별한 캐릭터와 맞을 때, 나는 그것이 "또 다른 유니 코드 캐릭터"라고 생각했습니다. 일반적으로 그것은 사실입니다. – Bridge

+0

절대적으로 - 그것은 나의 초기 생각이었다 – podiluska

1

에 SQL을 변경하면, 내 생각 엔이 Outils.LoadFileToString()가 .SQL를 읽을 수있는 올바른 Encoding를 사용하지 않는다는 것입니다 무엇

파일.