2016-12-13 1 views
1

유효한 XML 문자열이 오류를 일으키는 SqlBulkCopy (C#, 프레임 워크 4.5.1)에 문제가 있습니다. System.Data.SqlClient.SqlException : ... "SqlBulkCopy 오류 : 잘못된 문자이지만 XML 문자열이 유효 한 것 같습니다

표는 다음과 같습니다 {"XML 파싱 라인 (1), 문자 (29), 문자열 리터럴이 예상되었다 "}

CREATE TABLE [dbo].[JobManager_BigTextTest](
[PKID] [int] IDENTITY(1,1) NOT NULL, 
[BigXML] [xml] NOT NULL, PK_JobManager_BigTextTest] PRIMARY KEY CLUSTERED 
(
    [PKID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data] 
) ON [Data] TEXTIMAGE_ON [Data] 

(잘 작동)을 XML의 SQL 삽입은 ..

INSERT INTO JobManager_BigTextTest 
(
    BigXML 
) 
VALUES 
(
    '<ArrayOfTriggerEvent xmlns="http://schemas.datacontract.org/2004/07/RRD.JobManager.AutomatedWorkScheduler.Triggers" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><TriggerEvent i:type="a:ScheduleEvent" xmlns:a="http://schemas.datacontract.org/2004/07/RRD.JobManager.AutomatedWorkScheduler.Triggers.Events"><a:Schedule i:type="b:IncrementalSchedule" xmlns:b="http://schemas.datacontract.org/2004/07/RRD.JobManager.AutomatedWorkScheduler.Schedules"><b:DaysOfMonth xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/><b:DaysOfWeek xmlns:c="http://schemas.datacontract.org/2004/07/System"/><b:Frequency>Daily</b:Frequency><b:LastDayOfMonth>false</b:LastDayOfMonth><b:LastExecuted i:nil="true"/><b:LastModified>2014-08-21T14:40:30.6116736-05:00</b:LastModified><b:EndTime i:nil="true"/><b:Increment>PT5M</b:Increment><b:StartTime>PT0S</b:StartTime></a:Schedule></TriggerEvent><TriggerEvent i:type="a:ScheduleEvent" xmlns:a="http://schemas.datacontract.org/2004/07/RRD.JobManager.AutomatedWorkScheduler.Triggers.Events"><a:Schedule i:type="b:SpecificSchedule" xmlns:b="http://schemas.datacontract.org/2004/07/RRD.JobManager.AutomatedWorkScheduler.Schedules"><b:DaysOfMonth xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><c:int>8</c:int><c:int>11</c:int><c:int>24</c:int></b:DaysOfMonth><b:DaysOfWeek xmlns:c="http://schemas.datacontract.org/2004/07/System"/><b:Frequency>Monthly</b:Frequency><b:LastDayOfMonth>false</b:LastDayOfMonth><b:LastExecuted i:nil="true"/><b:LastModified>2014-08-21T14:40:30.6116736-05:00</b:LastModified><b:StartTimes xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><c:duration>PT11H</c:duration><c:duration>PT11H30M</c:duration><c:duration>PT13H30M</c:duration></b:StartTimes></a:Schedule></TriggerEvent></ArrayOfTriggerEvent>' 
) 

C# co

public static DataTable GetDataTableFromSqlDestination(string tableName) 
{ 
    tableName = MakeInjectionProof(tableName); // error if injection discovered 
    var dataTable = new DataTable(); 
    var query = $"SELECT * FROM [{tableName}] WHERE 1 = 0"; 

    using (var connection = new SqlConnection("my_connection")) 
    using (var command = new SqlCommand(query, connection)) 
    { 
     command.CommandTimeout = connection.ConnectionTimeout; 
     command.CommandType = CommandType.Text; 
     connection.Open(); 

     var da = new SqlDataAdapter(command); 

     da.FillSchema(dataTable, SchemaType.Mapped); 

     connection.Close(); 

     dataTable.PrimaryKey = null; // strip off primary key 
     dataTable.Columns.Remove("PKID"); 
    } 

    return dataTable; 
} 

는 DataTable에 행으로 (또는 행)를 첨가 한 후, 대량 복사 하는 C# 메소드가 호출되어

I 빈의 DataTable은 만드는 데 사용 드 ...

public static void BulkCopyProcessChunk 
(
    string tableName, 
    DataTable dataTable, 
    SqlConnection connection, 
    SqlTransaction transaction 
) 
{ 
    using (var sbc = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction)) 
    { 
     sbc.BulkCopyTimeout = 0; // Indefinite time out 
     sbc.DestinationTableName = tableName; 

     sbc.BatchSize = dataTable.Rows.Count; 

     foreach (DataColumn r in dataTable.Columns) 
     { 
      sbc.ColumnMappings.Add(r.ColumnName, r.ColumnName); 
     } 

     sbc.WriteToServer(dataTable); // <--- error occurs here 
    } 
} 

XML DataColumn, BigXML의 최대 길이가 -1 인 System.String 데이터 유형이 있습니다. 아무도 여기서 무슨 일이 일어나는지 말해 줄 수 있니? 1 호선, 문자 29 ... 기본 - 네임 스페이스 속성이 문자열 리터럴 예상이 시점에서

+0

가장 좋은 일을 시도하는 것은 SQL 서버와 함께 제공 SQL Server 관리 Studio (SSMS)에 쿼리를 실행하는 것입니다. C#에서보다 100 배 좋은 오류 메시지. 테이블이 생성되지 않았거나 테이블에 열이 없기 때문에 일반적으로 C#에서 테이블은 -1이 발생합니다. class.form 생성자에서 코드를 호출하지 않았는지 확인하십시오. 클래스가 생성 된 후에는 폼로드 메서드에 있어야합니다. – jdweng

+0

위와 같이 쿼리를 실행하여 동일한 문자열을 동일한 테이블에 삽입했습니다. 테이블이나 문자열에 아무런 문제가없는 것으로 나타났습니다 –

답변

0

오류 메시지 포인트 ... 당신은 이중 qoutes의 네임 스페이스를 제공하고 있습니다. 모든 것이 정상인 것처럼 보이지만 :

SqlBulkCopy 및 이중 qoutes와 관련된 문제를 가리키는 게시물이 여러 개 있습니다 (e.g. this one).

는 다음을 시도 할 수 있습니다 : 대신 두 배의

  • 를 사용하여 하나의 qoutes : <ArrayOfTriggerEvent xmlns='Your namespace' NextAttr='SomeVAlue' ...

  • 시도를 " - CHARACTER를 탈출. 일반적으로 이것은 기호 (xmlns=""Your namespace"")를 두 번 사용하거나 이스케이프 문자로 수행합니다. 할 \", ^" 또는 백틱 (`") ...

좀 더 information on Escape Characters

+0

작은 따옴표를 사용하여 시도했지만 성공했습니다. 도와 주셔서 감사합니다!!!! –

관련 문제