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

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

ただいまの
回答率

90.53%

  • C#

    8836questions

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

  • Visual Studio

    2296questions

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

  • SQL Server

    709questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,527

musix55

score 7

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

using System;
using System.Data;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlClient;
using System.IO;
using System.Text;

private void btnImport_Click(object sender, EventArgs e)
{
    var connectionString = ConfigurationManager.ConnectionStrings["db"].ConnectionString;
    using (var connection = new SqlConnection(connectionString))
    {
        try
        {
            connection.Open();

            using (var transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted))
            using (var command = new SqlCommand() { Connection = connection, Transaction = transaction })
            {
                try
                {
                    StreamReader sr = new StreamReader(@"C:\Program Files\受注伝票.csv", Encoding.GetEncoding("Shift_JIS"));
                    sr.ReadLine();
                    while (sr.Peek() > -1)
                    {
                        string line = sr.ReadLine();
                        string[] lineArray = line.Split(',');
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandText = @"import";
                        command.Parameters.Add(new SqlParameter("@CreateDate", lineArray[7]));
                        command.Parameters.Add(new SqlParameter("@OrderCode", lineArray[17]));
                        command.Parameters.Add(new SqlParameter("@DealNumber", Convert.ToDecimal(lineArray[21])));
                        command.Parameters.Add(new SqlParameter("@DealCode", lineArray[42]));
                        command.Parameters.Add(new SqlParameter("@LastDeliveryDate", lineArray[67]));
                        command.Parameters.Add(new SqlParameter("@DetailNumber", Convert.ToDecimal(lineArray[95])));
                        command.Parameters.Add(new SqlParameter("@OriginalUnitPrice", Convert.ToDecimal(lineArray[141])));
                        command.Parameters.Add(new SqlParameter("@SalesUnitPrice", Convert.ToDecimal(lineArray[143])));
                        command.Parameters.Add(new SqlParameter("@ShipmentInduvidualAmount", Convert.ToDecimal(lineArray[155])));
                        command.Parameters.Add(new SqlParameter("@ShipmentAmountOrder", Convert.ToDecimal(lineArray[156])));
                        command.Parameters.Add(new SqlParameter("@ShipmentAmountWeight", Convert.ToDecimal(lineArray[157])));
                        command.ExecuteNonQuery();
                    }
                    transaction.Commit();
                    sr.Close();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }
        catch (Exception exception)
        {
            MessageBox.Show(exception.Message, "データベース接続エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
            throw;
        }
        finally
        {
            connection.Close();
        }
    }
}
--ストアド
ALTER PROCEDURE [dbo].[import]
(
    @CreateDate nvarchar(19)
    ,@OrderCode nvarchar(13)
    ,@DealNumber decimal(10)
    ,@DealCode nvarchar(13)
    ,@LastDeliveryDate nvarchar(8)
    ,@DetailNumber decimal(4)
    ,@OriginalUnitPrice decimal(10, 2)
    ,@SalesUnitPrice decimal(10)
    ,@ShipmentInduvidualAmount decimal(7, 1)
    ,@ShipmentAmountOrder decimal(6)
    ,@ShipmentAmountWeight decimal(10, 3)
)
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO dataimport
VALUES(
    @CreateDate
    ,@OrderCode
    ,@DealNumber
    ,@DealCode
    ,@LastDeliveryDate
    ,@DetailNumber
    ,@OriginalUnitPrice
    ,@SalesUnitPrice
    ,@ShipmentInduvidualAmount
    ,@ShipmentAmountOrder
    ,@ShipmentAmountWeight
)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yuba

    2017/01/19 03:04

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

    キャンセル

  • musix55

    2017/01/19 07:12

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

    キャンセル

  • katsuya141

    2017/01/19 09:38

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

    キャンセル

  • musix55

    2017/01/19 12:35

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

    キャンセル

回答 3

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/19 08:40

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

    キャンセル

  • 2017/01/19 08:41

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

    キャンセル

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    8836questions

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

  • Visual Studio

    2296questions

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

  • SQL Server

    709questions

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