質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

27272閲覧

SQLSERVERへCSVファイルをBulkInsertする際にSQLServerテーブルに「""」が挿入される。

kei5

総合スコア13

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/07/06 02:30

###前提・実現したいこと
vb.net においてMDBファイルからデータをCSV形式でエクスポートした後に、CSVデータをSQLServerに
BulkInsert処理をかけます。その際にCSVファイルの「""」を削除してるにも関わらず、
InsertされたSQLServerのテーブルには「""」が入ったままになってしまいます。
データは全てのレコードがInsertされていることを確認していますが、
「""」もInsertされているとデータとして利用できないことから、何か解決策があれば
ご教授いただくと助かります。
※データ件数は10万件です。

なお、「""」はMDBの項目型に依存しているようで、日付項目は「""」が入ってこずに
テキスト型の項目だけ「""」が付されています。

恐らく「型」の問題だとは考えています。
※SQLServerのInsert先の項目型は「nvarchar」を利用しています。

なお、直接AccessテーブルからSQLServerへデータをInsertできる方法があれば
そちらのコードをご教授いただいても大変助かります。

###発生している問題・エラーメッセージ
SQLServerには以下のように登録されてきます。

年月 更新日時 ソース名 "201606" | 2016/06/01 | "MDB" "201606" | 2016/06/02 | "EXCEL"

###該当のソースコード
変数宣言は省略します。

'エクスポート処理 ' 初期値の定義 dbNAME = "XXX.mdb" 'MDB 名を入力 ;[db1.mdb]を変更します dbPath = "C:\test" ' MDB の保存場所:このファイルと同一フォルダを指定 tbl = "明細" 'データベーステーブル ;[ST_TABLE]を変更します myDB = dbPath & "\" & dbNAME strPath = dbPath 'CSV ファイルの保存場所 EX)このファイルと同一フォルダを指定 strFileName = "明細.csv" 'CSV ファイルのファイル名 ;*****を変更します cnn.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & myDB & ";") ' MDB との接続を確立する Kill(dbPath & "\" & strFileName) 'CSVファイルの削除 'CSVの指定 strConnect = "[Text;database=" & strPath & "]." & "[" & strFileName & "]" 'SQLの発行 strSQL = "SELECT * INTO " & strConnect & " FROM " & tbl cnn.Execute(strSQL) cnn.Close() : cnn = Nothing 'ダブルコーテーション削除処理 FSO = CreateObject("Scripting.FileSystemObject") With FSO.GetFile("C:\test\明細.csv").OpenAsTextStream buf = .ReadAll .Close() End With FSO.GetFile("C:\test\明細.csv").Delete() FSO.CreateTextFile("C:\test\明細.csv") buf = Replace(buf, """", "") With FSO.GetFile("C:\test\明細.csv").OpenAsTextStream(8) .Write(buf) .Close() End With FSO = Nothing 'BULKInsert処理 cnn = "" cnn &= "Data Source = xx.xx.xx.xx;" cnn &= "Initial Catalog = DB;" cnn &= "User ID=TEST; Password=TEST!;" cnn &= "Trusted_Connection = False;" Dim connectionString As String = cnn ' Open a sourceConnection to the database. Using sourceConnection As SqlConnection = _ New SqlConnection(connectionString) sourceConnection.Open() ' Delete all from the destination table. Dim commandDelete As New SqlCommand commandDelete.Connection = sourceConnection commandDelete.CommandText = _ "DELETE FROM dbo.Meisai" commandDelete.ExecuteNonQuery() 'BulkInsert Dim commandInsert As New SqlCommand commandInsert.Connection = sourceConnection commandInsert.CommandText = _ "BULK INSERT dbo.Meisai FROM 'c:\test\明細.csv' " & _ " WITH ( FIELDTERMINATOR =',', ROWTERMINATOR = '\n', FIRSTROW = 2);" commandInsert.ExecuteNonQuery() End Using

###試したこと
CSVで「""」を削除することが、そもそもいけないと考えて一度テキストファイルに変更してから
「""」を削除しましたが、SQLServerには「""」が入力されたままInsertされてしまいました。

###補足情報(言語/FW/ツール等のバージョンなど)
vb.net 2013
MS Access 2013(mdb形式)
SQLServer 2014

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

bcpコマンドでフォーマットファイルを生成し、BulkInsert時に使用すれば可能です。
フォーマット ファイルの作成 (SQL Server)

これが面倒ならば、発想を転換して登録後にダブルクォーテーションを置換する
UPDATE文を実行する方法はいかがでしょうか?

UPDATE Meisai SET test1 = REPLACE(test1, '"', ''), test2 = REPLACE(test2, '"', '')

投稿2016/07/06 07:39

so-ichiro

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei5

2016/07/06 10:02

ご連絡有難うございます。フォーマットファイルは利用したくないので、UPDATEで更新をかけるようにしたいと考えています。VB.netの場合は「””」と「削除」をどのように記載すればよろしいのでしょうか?FSOで行った倍は REPLACE(年月,"""", "")とやると「""」が変更されたのですが。ご教授いただけると助かります。
kei5

2016/07/06 10:31

何度も申し訳ありません。VB.netの「"」は「’””’」で表現できました。この方法で変更できたので、利用したいと思います。有難うございました。
guest

0

環境が掲示されていませんが、
(OS、各ツールの、バージョン、エディション、x86 / x64 の別)

単純な方法例

MS SQL Server Management Studio から
(インストールしていなければ入れてください。LocalDB/AtacchedDBは別途)
1.該当インスタンスへ接続して
2.該当テーブルか、インポート作業用ワークを作って、それを右クリック
3.テーブル ⇒ タスク
4.データのインポート ⇒ ウィザード画面が開きますから、
適切に設定してインポートします。

投稿2016/07/06 02:50

編集2016/07/06 02:55
daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei5

2016/07/06 02:58

ご連絡有難うございます。vb.netのWindowsアプリケーション上で実現したいので、あくまでもBulkInsertを実行したいです。ちなみに、インポートウィザードからやると1651件までは上手くINSERTされますが、それ以降は以下のメッセージが出力されてウィザードがABENDします。 ※ エラー 0xc02020a1: データ フロー タスク 1: データ変換に失敗しました。列 "摘要" のデータ変換から、状態値 4 と状態を示すテキスト "テキストが切り捨てられたか、または対象になるコード ページで 1 つ以上の文字が一致しませんでした。" が返されました。 (SQL Server インポートおよびエクスポート ウィザード) ちなみにnvarchar(1000)を指定しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問