2016-12-13 15 views
1

有効なXML文字列が原因でSqlBulkCopy(フレームワーク4.5.1)に問題が発生します。System.Data.SqlClient.SqlException: { "XMLの解析:行1、文字29、リテラル文字列が期待された"}」SqlBulkCopyのエラー:無効な文字ですが、XML文字列が有効であるようです

表がある...

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; 
} 

、一括コピーを行うC#の方法は...

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)のデータ型はSystem.Stringで、最大長は-1です。誰がここで何が起こっているか教えてもらえますか?デフォルトの名前空間属性は、文字列リテラルを期待

+0

... \"^"またはバッククォート('")を試してみてください。エラーメッセージは、C#より100倍優れています。テーブルが構築されていないか、テーブルにカラムがないので、通常、c#a -1のテーブルは発生します。 class.formコンストラクタからコードを呼び出さないようにしてください。クラスが構築された後は、フォームのロードメソッドでなければなりません。 – jdweng

+0

私は上記のように同じテーブルに同じ文字列を挿入するためにクエリを実行しましたが、テーブルや文字列に何も問題はないようです。 –

答えて

0

ライン1、文字29にエラーメッセージポイント...

は、この時点で...あなたはダブルクォートの中に名前空間を提供しています。だからすべてがOKだと思われますが、

SqlBulkCopyとダブルQoutesに関する問題を指し示す投稿がいくつかあります(e.g. this one)。

あなたが次のことを試すことができます。代わりに倍増の

  • 使用単一qoutes:<ArrayOfTriggerEvent xmlns='Your namespace' NextAttr='SomeVAlue' ...

  • " -characterをエスケープしてみてください。通常これは、記号(xmlns=""Your namespace"")を二重にするか、エスケープ文字で行います。行うための最善のことは、SQL Serverに付属しているSQL Server Management Studioを(SSMS)でクエリを実行することです

いくつかのよりinformation on Escape Characters

+0

一重引用符を使用しようとしましたが、これが成功しました。あなたに助けてくれてありがとう!!!! –

関連する問題