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

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

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

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

SQL Server

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

Visual Studio

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

Q&A

解決済

3回答

14658閲覧

CSVからデータを取得し、データベースに書き込む方法

musix55

総合スコア16

C#

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

SQL Server

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

Visual Studio

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

0グッド

0クリップ

投稿2017/01/18 13:55

何度もお世話になっております。
現在作っているプログラム(Windowsフォームアプリ)で、CSVから特定の列のデータを取得し(配列に格納した後)データベースに書き込むという動作を実現したいと思っています。
しかし何度試してもエラーになってしまい、皆さんの知恵を拝借したく相談しました。
複数回書き直したためぐちゃぐちゃになってしまっていますが、やりたい方向としては取得した文字列を区切って配列に入れ、データベースに追加するという流れをループで繰り返すという感じです。
(他にもTextFieldParserなど?いろいろな書き方があると思います)
あまり複雑でなければ他の手段でも構いませんので、ぜひアドバイスいただけたらと思います。

C#

1using System; 2using System.Data; 3using System.Windows.Forms; 4using System.Configuration; 5using System.Data.SqlClient; 6using System.IO; 7using System.Text; 8 9private void btnImport_Click(object sender, EventArgs e) 10{ 11 var connectionString = ConfigurationManager.ConnectionStrings["db"].ConnectionString; 12 using (var connection = new SqlConnection(connectionString)) 13 { 14 try 15 { 16 connection.Open(); 17 18 using (var transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)) 19 using (var command = new SqlCommand() { Connection = connection, Transaction = transaction }) 20 { 21 try 22 { 23 StreamReader sr = new StreamReader(@"C:\Program Files\受注伝票.csv", Encoding.GetEncoding("Shift_JIS")); 24 sr.ReadLine(); 25 while (sr.Peek() > -1) 26 { 27 string line = sr.ReadLine(); 28 string[] lineArray = line.Split(','); 29 command.CommandType = CommandType.StoredProcedure; 30 command.CommandText = @"import"; 31 command.Parameters.Add(new SqlParameter("@CreateDate", lineArray[7])); 32 command.Parameters.Add(new SqlParameter("@OrderCode", lineArray[17])); 33 command.Parameters.Add(new SqlParameter("@DealNumber", Convert.ToDecimal(lineArray[21]))); 34 command.Parameters.Add(new SqlParameter("@DealCode", lineArray[42])); 35 command.Parameters.Add(new SqlParameter("@LastDeliveryDate", lineArray[67])); 36 command.Parameters.Add(new SqlParameter("@DetailNumber", Convert.ToDecimal(lineArray[95]))); 37 command.Parameters.Add(new SqlParameter("@OriginalUnitPrice", Convert.ToDecimal(lineArray[141]))); 38 command.Parameters.Add(new SqlParameter("@SalesUnitPrice", Convert.ToDecimal(lineArray[143]))); 39 command.Parameters.Add(new SqlParameter("@ShipmentInduvidualAmount", Convert.ToDecimal(lineArray[155]))); 40 command.Parameters.Add(new SqlParameter("@ShipmentAmountOrder", Convert.ToDecimal(lineArray[156]))); 41 command.Parameters.Add(new SqlParameter("@ShipmentAmountWeight", Convert.ToDecimal(lineArray[157]))); 42 command.ExecuteNonQuery(); 43 } 44 transaction.Commit(); 45 sr.Close(); 46 } 47 catch 48 { 49 transaction.Rollback(); 50 throw; 51 } 52 } 53 } 54 catch (Exception exception) 55 { 56 MessageBox.Show(exception.Message, "データベース接続エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); 57 throw; 58 } 59 finally 60 { 61 connection.Close(); 62 } 63 } 64}

SQL

1--ストアド 2ALTER PROCEDURE [dbo].[import] 3( 4 @CreateDate nvarchar(19) 5 ,@OrderCode nvarchar(13) 6 ,@DealNumber decimal(10) 7 ,@DealCode nvarchar(13) 8 ,@LastDeliveryDate nvarchar(8) 9 ,@DetailNumber decimal(4) 10 ,@OriginalUnitPrice decimal(10, 2) 11 ,@SalesUnitPrice decimal(10) 12 ,@ShipmentInduvidualAmount decimal(7, 1) 13 ,@ShipmentAmountOrder decimal(6) 14 ,@ShipmentAmountWeight decimal(10, 3) 15) 16AS 17BEGIN 18SET NOCOUNT ON; 19 20INSERT INTO dataimport 21VALUES( 22 @CreateDate 23 ,@OrderCode 24 ,@DealNumber 25 ,@DealCode 26 ,@LastDeliveryDate 27 ,@DetailNumber 28 ,@OriginalUnitPrice 29 ,@SalesUnitPrice 30 ,@ShipmentInduvidualAmount 31 ,@ShipmentAmountOrder 32 ,@ShipmentAmountWeight 33) 34 35END

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

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

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

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

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

yuba

2017/01/18 18:04

エラーとはどんなエラーでしょう。
musix55

2017/01/18 22:12

何度も修正しているのでいくつかあるのですが、よく出ていたのは「プロシージャまたは関数の引数が多すぎます。」「入力文字列の形式が正しくありません」でした。引数の数や順序、型などが違っていないかは確認しています。
katsuya141

2017/01/19 00:38

command.ExecuteNonQuery();の行で出ているエラーかどうかは確認されていますか?
musix55

2017/01/19 03:35

ブレークポイントを設定しても、catchされるまでそのまま進んでしまいます。→自己解決しました。
guest

回答3

0

自己解決

いろいろ試してみたところ、whileを回すごとにParamerers.Addを繰り返したために、引数が増えている(ように見える)のが原因だったみたいです。
Paramerers.Addの前に
command.Paramerers.Clear();
を記述したところ、無事期待通りの動作をするようになりました。
知恵をお貸しくださったみなさん、ありがとうございました!

投稿2017/01/19 03:43

musix55

総合スコア16

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

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

0

Parameters.AddとParameters["@ほげ"].Value をセットで使うか、Parameters.AddWithValueを使うのでしょう。

投稿2017/01/19 00:42

編集2017/01/19 00:50
katsuya141

総合スコア367

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

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

0

insert命令に、カラム名リストを指定するのが抜けているようです。

投稿2017/01/18 23:00

yuba

総合スコア5568

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

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

Panzer_vor

2017/01/18 23:40

> yubaさん INSERT文におけるカラムリストは明示した方が良いには良いですが、 省略も可能なので今回のエラーの直接的な原因でない気がします。
yuba

2017/01/18 23:41

なるほど。テーブル定義はだせますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問