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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

3275閲覧

C# で Oracle データベースのテーブルに CSV データの挿入のやり方

Hajimer-99

総合スコア0

CSV

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/10/31 02:40

編集2021/10/31 07:34

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
C#を初めて二週間目でわからないことだらけの初心者です。
OracleのデータベースのテーブルにプログラムでCSVファイルを挿入したいのですがうまくいきません。
データ自体の読み込みは成功しているのですがfor文のループでnameとaddressのカラムにCSVに入っている
名前と住所が記載されず[System.string]と表記されてしまいます。
いろいろとweb検索をしたのですがfor文でCSVのデータを入れているサイトが見つかりません。

発生している問題・エラーメッセージ

DataTableにSystem.string表記

該当のソースコード

C#ここに言語名を入力
ソースコード

public static void Main() { //配列からリストに格納する List<string> lists = new List<string>(); StreamReader sr = new StreamReader(@"C:\file\CSV\test.csv"); //末尾まで繰り返す while (!sr.EndOfStream) { //CSVファイルの一行を読み込む string line = sr.ReadLine(); lists.Add(line); Console.WriteLine(line); } string sql = "insert into CSV_TEST(id,name,address) VALUES (:id, :name, :address)"; try { using (OracleConnection conn = new OracleConnection()) { conn.ConnectionString = "User ID=USER; Password=PASS; Data Source=Data source"; conn.Open(); Console.WriteLine("DBに接続しました。"); using (OracleTransaction transaction = conn.BeginTransaction()) { try { //csvのデータを挿入 for (int i = 0; i < lists.Count(); ++i) { string line = lists[i]; using (OracleCommand cmd = new OracleCommand(sql, conn)) { cmd.BindByName = true; cmd.Parameters.Add(new OracleParameter(":id", OracleDbType.Int32, (i+1), ParameterDirection.Input)); cmd.Parameters.Add(new OracleParameter(":name", OracleDbType.Varchar2, line.Split(','), ParameterDirection.Input)); cmd.Parameters.Add(new OracleParameter(":address", OracleDbType.Varchar2, line.Split(','),ParameterDirection.Input)); cmd.ExecuteNonQuery(); } } transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); Console.WriteLine(ex.ToString()); } } } } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); } }

試したこと

補足情報(FW/ツールのバージョンなど)

visual studio 2019
A5M2 ver 2.14

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/10/31 04:02 編集

× detatable 〇 DataTable 綴りも大文字小文字も正しく書きましょう。修正してください。 ソースコードはインデント崩れて見づらくなるので、コードの挿入(<code>アイコン)で記入してください。
退会済みユーザー

退会済みユーザー

2021/10/31 06:10

×: C#でdetatableにCSVデータの挿入のやり方 〇: C# で Oracle データベースのテーブルに CSV データの挿入のやり方 ・・・ではないのですか? 本文の方には ADO.NET の DataTable は出てこないけど。
Hajimer-99

2021/10/31 06:34

すいません、このサイト使うのも初めてでして 説明も下手ですみません。
退会済みユーザー

退会済みユーザー

2021/10/31 06:43

タイトルや質問内容は編集できるので「C# で Oracle データベースのテーブルに CSV データの挿入のやり方」が正しければタイトルをそれに直してください。 C# で datatable と言うと ADO.NET の DataTable を想像する人がほとんどだと思います。
Hajimer-99

2021/10/31 06:56

ご指摘ありがとうございます。 まだできないこと知らないことだらけなので 間違いがあれば修正のコメントがあればすごく助かります。
退会済みユーザー

退会済みユーザー

2021/10/31 07:13 編集

DetaではなくDataです。 ソースコードに何故無駄なハイフンを入れてるんですか? コードの挿入で、```と```の間にソースを記入すれば、きちんとインデントも反映される筈です。プレビューできちんと確認してください。 [3-7. Markdownを利用しましょう] https://teratail.com/help/question-tips#questionTips3-7
guest

回答1

0

OracleParameter のコンストラクタで値をセットしているところが line.Split(',') になっているので "System.String[] が値としてカラムに入ります。

CSV のレイアウトや Oracle のテーブルレイアウトが提示されていませんが、

C#

1string[] values = line.Split(','); 2cmd.Parameters.Add(new OracleParameter(":name", OracleDbType.Varchar2, values[0], ParameterDirection.Input)); 3cmd.Parameters.Add(new OracleParameter(":address", OracleDbType.Varchar2, values[1], ParameterDirection.Input));

のようにすればいいのではないかと思います。

ですが、ODP.NET には配列バインドの機能があるので、以下のようにすると SQL 1回で複数レコードの登録が出来ます。

C#

1static OracleParameter CreateArrayParameter(string name, OracleDbType oracleDbType, ParameterDirection direction, Array values, int dataSize) 2{ 3 var arraySize = values.Length; 4 var p = new OracleParameter(name, oracleDbType, direction); 5 p.Size = arraySize; 6 var arrayBindSize = new int[arraySize]; 7 for (int i = 0; i < arraySize; i++) 8 { 9 arrayBindSize[i] = dataSize; 10 } 11 p.ArrayBindSize = arrayBindSize; 12 p.ArrayBindStatus = new OracleParameterStatus[arraySize]; 13 p.Value = values; 14 return p; 15} 16 17var arraySize = lists.Count; 18var ids = new int[arraySize]; 19var names = new string[arraySize]; 20var addresses = new string[arraySize]; 21for (int i = 0; i < lists.Count(); ++i) 22{ 23 string line = lists[i]; 24 string[] values = line.Split(','); 25 ids[i] = i + 1; 26 names[i] = values[0]; 27 addresses[i] = values[1]; 28} 29using (OracleCommand cmd = new OracleCommand(sql, conn)) 30{ 31 cmd.BindByName = true; 32 cmd.ArrayBindCount = arraySize; 33 cmd.Parameters.Add(CreateArrayParameter(":id", OracleDbType.Int32, ParameterDirection.Input, ids, 4)); 34 cmd.Parameters.Add(CreateArrayParameter(":name", OracleDbType.Varchar2, ParameterDirection.Input, names, 128)); 35 cmd.Parameters.Add(CreateArrayParameter(":address", OracleDbType.Varchar2, ParameterDirection.Input, addresses, 128)); 36 cmd.ExecuteNonQuery(); 37}

投稿2021/10/31 04:41

KOZ6.0

総合スコア2626

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

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

Hajimer-99

2021/10/31 07:04

ありがとうございます! 試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問