列マッピングを持つMySQLBulkLoader? -- c# フィールド と mysql フィールド と bulkinsert フィールド と sqlbulkcopy フィールド 関連 問題

MySqlBulkLoader with Column Mapping?












0
vote

問題

日本語

<コード> SqlBulkCopy を使用して、Bulk InsertsをSQL Serverデータベースに実行します。私は私のプログラムのための mysql のサポートと SqlBulkCopy に最も近いものを提供しています。しかし、 MySqlBulkLoader では、 MySqlBulkLoader はファイルとのみ機能し、 @GetMapping("details/{id}") public String read(@PathVariable int employeeId, Model model) { model.addAttribute("students_data", studentsRepo.read(employeeId)); //the line underneath will work using as an example the int 2 in the parameter. But I want the int coming from the url. //model.addAttribute("students_data", studentsRepo.read(2)); return "details"; } 0 DataTable をファイルに変換する必要があります。 >。そして、挿入前に外部キーチェックを無効にする必要があります。私は両方をしましたが、今私はもう1つの問題を抱えています:

マイ宛先テーブルには、ID列(AUTO-INCREMENTとPK)があり、<コード> @GetMapping("details/{id}") public String read(@PathVariable int employeeId, Model model) { model.addAttribute("students_data", studentsRepo.read(employeeId)); //the line underneath will work using as an example the int 2 in the parameter. But I want the int coming from the url. //model.addAttribute("students_data", studentsRepo.read(2)); return "details"; } 1 はソースファイルの最初の列をこの列にマッピングします。したがって、最初のレコードのみが間違った列マッピングで挿入されます。これが私が役に立つかどうかを使う方法です:

<事前> <コード> @GetMapping("details/{id}") public String read(@PathVariable int employeeId, Model model) { model.addAttribute("students_data", studentsRepo.read(employeeId)); //the line underneath will work using as an example the int 2 in the parameter. But I want the int coming from the url. //model.addAttribute("students_data", studentsRepo.read(2)); return "details"; } 2

とこれは私のファイルの最初の数行です:

<事前> <コード> @GetMapping("details/{id}") public String read(@PathVariable int employeeId, Model model) { model.addAttribute("students_data", studentsRepo.read(employeeId)); //the line underneath will work using as an example the int 2 in the parameter. But I want the int coming from the url. //model.addAttribute("students_data", studentsRepo.read(2)); return "details"; } 3

<コード> @GetMapping("details/{id}") public String read(@PathVariable int employeeId, Model model) { model.addAttribute("students_data", studentsRepo.read(employeeId)); //the line underneath will work using as an example the int 2 in the parameter. But I want the int coming from the url. //model.addAttribute("students_data", studentsRepo.read(2)); return "details"; } 4 の列マッピングを提供する方法はありますか? @GetMapping("details/{id}") public String read(@PathVariable int employeeId, Model model) { model.addAttribute("students_data", studentsRepo.read(employeeId)); //the line underneath will work using as an example the int 2 in the parameter. But I want the int coming from the url. //model.addAttribute("students_data", studentsRepo.read(2)); return "details"; } 5 プロパティがあることがわかりますが、読み取り専用です。

mysqlbulkcopy と呼ばれる場所に書かれた図書館があります。公式の情報源から来ていません。

英語

I use SqlBulkCopy to do bulk inserts into a SQL Server database. I am now providing MySql support for my program and the nearest thing to SqlBulkCopy is MySqlBulkLoader. But in MySqlBulkLoader, I have to first convert my DataTable to a file because MySqlBulkLoader only works with files and not DataTable. And then I have to disable foreign key checks before the insert. I have done them both but now I am left with one more problem:

My destination table has an identity column (auto-increment and PK) and MySqlBulkLoader maps the first column in the source file to this column and therefore only the first record is inserted with wrong column mappings. Here is how I use the function if it helps:

using (var conn = new MySqlConnection(connectionString)) {     var bl = new MySqlBulkLoader(conn);     bl.TableName = tableName;     bl.Timeout = 600;     bl.FieldTerminator = ",";     bl.LineTerminator = "  ";     bl.FileName = tempFilePath;     bl.NumberOfLinesToSkip = 1;     numberOfInsertedRows = bl.Load(); } 

And this is first few lines on my file:

CampaignRunId,RecipientId,IsControlGroup 27,"testrecipient_0",False 27,"testrecipient_1",False 27,"testrecipient_2",False 27,"testrecipient_3",False 27,"testrecipient_4",False 27,"testrecipient_5",False 27,"testrecipient_6",False 27,"testrecipient_7",False 27,"testrecipient_8",False 27,"testrecipient_9",False 27,"testrecipient_10",False 27,"testrecipient_11",False 27,"testrecipient_12",False 27,"testrecipient_13",False 

Is there a way to provide column mapping for MySqlBulkLoader? I see that it has a Columns property but it is read-only.

There is a library written somewhere called MySqlBulkCopy but I ran into other problems using it and it does not come from an official source.

</div
           

回答リスト

1
 
vote

私は最近もMySqlBulkLoaderを使用して、とMySQLに挿入する適切なフォーマットにMSSQLから引き出された日付をフォーマットするために、Columnsプロパティを使用する必要性に出くわしてきました。列プロパティは読み取り専用ですが、それだけの手段はあなたが後ではなく、オブジェクトを作成するときにプロパティを設定する必要があります。

まず、コードブロックを変更

<事前> <コード> using (var conn = new MySqlConnection(connectionString)) { var bl = new MySqlBulkLoader(conn); bl.TableName = tableName; bl.Timeout = 600; bl.FieldTerminator = ","; bl.LineTerminator = " "; bl.FileName = tempFilePath; bl.NumberOfLinesToSkip = 1; numberOfInsertedRows = bl.Load(); }

これに:

<事前> <コード> using (var conn = new MySqlConnection(connectionString)) { var bl = new MySqlBulkLoader(conn) { TableName = tableName, Timeout = 600, FieldTerminator = ",", LineTerminator = " ", FileName = tempFilePath, NumberOfLinesToSkip = 1 }; var numberOfInsertedRows = bl.Load(); } 最終的なコードブロックは、このようなものに見えるかもしれませんので、

次に、あなたは、先にあなたがColumnsプロパティのために好きな値を使用する行くことができます:

<事前> <コード> using (var conn = new MySqlConnection(connectionString)) { var bl = new MySqlBulkLoader(conn) { TableName = tableName, Timeout = 600, FieldTerminator = ",", LineTerminator = " ", FileName = tempFilePath, NumberOfLinesToSkip = 1, Columns = { "CampaignRunId", "RecipientId", "IsControlGroup" } }; var numberOfInsertedRows = bl.Load(); }
 

I've recently been using MySqlBulkLoader also, and came across the need to use the Columns property in order to format a date that was pulled out of MSSQL into the right format to insert into MySQL. The columns property is readonly, but that just means you need to set the properties when you create the object, rather than afterwards.

First, change this block of code

using (var conn = new MySqlConnection(connectionString)) {     var bl = new MySqlBulkLoader(conn);     bl.TableName = tableName;     bl.Timeout = 600;     bl.FieldTerminator = ",";     bl.LineTerminator = "  ";     bl.FileName = tempFilePath;     bl.NumberOfLinesToSkip = 1;     numberOfInsertedRows = bl.Load(); } 

to this:

using (var conn = new MySqlConnection(connectionString)) {     var bl = new MySqlBulkLoader(conn)     {         TableName = tableName,         Timeout = 600,         FieldTerminator = ",",         LineTerminator = "  ",         FileName = tempFilePath,         NumberOfLinesToSkip = 1     };     var numberOfInsertedRows = bl.Load(); } 

Then, you can go ahead an use whatever value you want to for the Columns property, so your final code block may look something like this:

using (var conn = new MySqlConnection(connectionString)) {     var bl = new MySqlBulkLoader(conn)     {         TableName = tableName,         Timeout = 600,         FieldTerminator = ",",         LineTerminator = "  ",         FileName = tempFilePath,         NumberOfLinesToSkip = 1,         Columns = { "CampaignRunId", "RecipientId", "IsControlGroup" }     };     var numberOfInsertedRows = bl.Load(); } 
</div
 
 
   
   
1
 
vote

ビルデビッド・ハートリーの答えに:あなたは、列名先験的がわからない場合、あなただけの列のリストをクリアし、改めてそれにアイテムを追加することができます。

これは、このようなものになるだろう

<コード> bl.Columns.Clear(); foreach (string col in yourColumns) { bl.Columns.Add(col); }

 

Building on David Hartley's answer: if you don't know the column names a priori, you could just clear the list of column and add items to it afresh.

It'll be something like this:

bl.Columns.Clear(); foreach (string col in yourColumns) { bl.Columns.Add(col); }

</div
 
 

関連する質問

0  日付は1/1/1753 12:00:00 AMと12/31/9999 11:59:59 PMオーバーフローエラーSqlBulkCopy [重複]  ( Date must be between 1 1 1753 120000 am and 12 31 9999 115959 pm overflow er ) 
この質問はすでにここで回答を持っています エラー - SQLDateTimeオーバーフロー。 1/1/1753 12:00:00 00:00と12/31/9999 11:59:59 PM ...

1  データベース表C#にデータベースを挿入/更新可能  ( Insert update whole datatable into database table c sharp ) 
私は問題に直面しています私はここで解決したいと思っています。 <コード> DataSet に3つの異なるテーブルがあり、データベーステーブルに挿入したいです。 私は SqlBulkCopy を使ってこれを行うことができることを知っていますが、キャッチがあり、...

4  SQLBulkCopyを使用してSQL_VARIANT列に挿入するときに列の種類を設定する方法  ( How can i set column type when using sqlbulkcopy to insert into a sql variant co ) 
SQLBULKCOPYを使用して、.NET DatableオブジェクトからSQL_VARIANT列を含むSQL Serverテーブルに挿入/更新しています。ただし、SQLBulkCopyは、必要なものが「DateTime2」の場合、SQL型 'DateTim...

1  SQLバルクコピーでID値を取得する方法  ( How to get the identity values in sql bulk copy ) 
SqlBulkCopyの後にテーブルから同じテーブルへの識別値を取得する必要があります。データの量は数千のレコードになる可能性があります。 誰かが私を助けてくれることができますか? ...

1  SqlBulkCopy WriteSoServerにはデータベース列がすべてデータベース列が必要ですか?  ( Do i need all database columns in my datatable for sqlbulkcopy writetoserver ) 
CSVからデータを一度にインポートしていて、すべてのフィールドがMy Tableを実行していません。私は私のCSVの列だけでデータを分解していましたが、文字列からbooleanへの変換についてのエラーが発生しました。私が追加しているフィールドのどれもブール値...

20  SQLBulkCopyが働いていません  ( Sqlbulkcopy not working ) 
私はExcelシートから<コード> DataSet を持っています。 LeadId がPkである Lead_Hdr テーブルにレコードを挿入するには、SQLBULKコピーを使用したいと思いました。 以下のコードの実行中に以下のエラーが発生しています。 ...

1  BCPを使用してSQL Serverテーブルからファイルへの書き込み  ( Writing from sql server table to file using bcp ) 
私のキャップがSQL Server、HAでの作業からオンになっていただけです。 とにかく、から書いてみようとしているim servername.databasename.databaseInstanceName.tableName c: fi...

0  SQLBulkCopyとDataTableのパフォーマンスの問題  ( Performance issue with sqlbulkcopy and datatable ) 
ファイルからデータベースへの大量のデータを効率的にインポートする必要があります。 そのデータを含むRRFファイルがほとんどありません。ファイルのサイズはgtです。 400MBと最終的にはそれは&gtになる可能性があります。ファイルからデータベースへの200万の...

0  SQLXMLバルクローダーエラー - スキーマ: 'catalog_item'で期待される関係  ( Sqlxml bulk loader error schema relationship expected on catalog item ) 
ロードするために本当に大きなファイルがあるので、SQL Server SQLXMLバルクを使用してSQL Serverにデータをロードしています。テスト目的のために私は小さなXMLファイルを使って試しています。 PowerShellスクリプトを使用してSQL ...

0  デバッグ、SQL Serverの例外、操作が完了する前のタイムアウト期間またはサーバーが応答していない  ( How to debug sql server exception the timeout period elapsed prior to completi ) 
SqlBulkCopy を使用して、SQL Server 2014に大きなファイル(~25 GB、4億回線)をロードしています。 マイバルクコピーサイズは10k行、タイムアウトは1時間です。ファイル全体は、ファイル全体を保存するか、失敗した場合にロールバッ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有