유효한 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 ... 기본 - 네임 스페이스 속성이 문자열 리터럴 예상이 시점에서
에
가장 좋은 일을 시도하는 것은 SQL 서버와 함께 제공 SQL Server 관리 Studio (SSMS)에 쿼리를 실행하는 것입니다. C#에서보다 100 배 좋은 오류 메시지. 테이블이 생성되지 않았거나 테이블에 열이 없기 때문에 일반적으로 C#에서 테이블은 -1이 발생합니다. class.form 생성자에서 코드를 호출하지 않았는지 확인하십시오. 클래스가 생성 된 후에는 폼로드 메서드에 있어야합니다. – jdweng
위와 같이 쿼리를 실행하여 동일한 문자열을 동일한 테이블에 삽입했습니다. 테이블이나 문자열에 아무런 문제가없는 것으로 나타났습니다 –