🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

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

C#

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

SQL

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

Q&A

解決済

3回答

5203閲覧

csvファイルの行ごとの読み込み、sqlへの書き込みのループ時のエラー

FM88mhmh

総合スコア22

CSV

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

C#

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

SQL

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

0グッド

0クリップ

投稿2019/11/06 02:34

csvファイルから一行読み取り、sqlへ書き込むのを繰り返したいのですが、
一行目は通るのですが、二回目のcmd.ExecuteNonQuery();を実行時にエラーが出てしまいます。

原因と解決策を教えていただけませんか?
よろしくお願いいたします。

コード

C#

1 class Ccsv 2 { 3 string csvLine; 4 string[] csvData; 5 //csvの読み込み 6 public void Readcsv(string csvpass, string serverInformation) 7 { 8 if (File.Exists(csvpass)) 9 { 10 StreamReader csvFile = new StreamReader(csvpass, Encoding.GetEncoding("UTF-8")); 11 string constr = serverInformation; 12 var con = new SqlConnection(constr); 13 var cmd = con.CreateCommand(); 14 15 con.Open(); 16 try 17 { 18 do 19 { 20 //csvファイルの読み込み 21 csvLine = csvFile.ReadLine(); 22 csvData = csvLine.Split(','); 23 24 //sqlへ書き出し 25 cmd.CommandText = @"INSERT INTO ExcelTest (品名, 品番) VALUES (@itemName, @itemNum)"; 26 cmd.Parameters.Add(new SqlParameter("@itemName", csvData[2])); //品名 27 cmd.Parameters.Add(new SqlParameter("@itemNum", int.Parse(csvData[3]))); //品番 28 cmd.ExecuteNonQuery(); 29 } while (csvFile.Peek() != -1); 30 } 31 finally 32 { 33 con.Close(); 34 csvFile.Close(); 35 } 36 } 37 } 38 }

エラー文

System.Data.SqlClient.SqlException: '変数名 '@itemName' は既に宣言されています。変数名は、クエリ バッチまたはストアド プロシージャ内で一意にしてください。'

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/11/06 02:50 編集

開発環境(OS, Visual Studio, .NET のバージョン、DB サーバは何かとそのエディションとバージョン)を書いてください。 どの行でエラーが出るのか書いてください。
guest

回答3

0

ベストアンサー

CSV は 2 行以上あって、ループの中で、

cmd.Parameters.Add(new SqlParameter("@itemName", csvData[2])); //品名 cmd.Parameters.Add(new SqlParameter("@itemNum", int.Parse(csvData[3]))); //品番

を繰り返しているからだと思います。

パラメータを追加するのはループの外に出して(そこでは値は追加しない)、ループの中でパラメータの Value プロパティに値を設定するようにしたらどうなりますか?

【追記】

cmd.CommandText の設定もループの外に出してください。

投稿2019/11/06 02:57

編集2019/11/06 03:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

FM88mhmh

2019/11/06 03:45

ありがとうございます。 sqlへの書き込みの部分をループの外に出して、 csvの変数は配列の配列にいれてsqlにINSERTしてみます。
guest

0

2回目のループ時に前のループでパラメータがすでに追加されていますので同一の名前で追加できません。

パラメータをクリアするなりしてください。

投稿2019/11/06 02:55

YAmaGNZ

総合スコア10469

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

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

FM88mhmh

2019/11/06 03:30

sqlへの書き込みの部分をループから出して書き換えてみます ありがとうございます
guest

0

cmd.Parametersに対して
1ループ目に@itemName@itemNumを追加して、
2ループ目に@itemName@itemNumを追加しようとするから
2ループ目に同名のパラメータは既に追加されていますというエラーメッセージですよね?
そのままの意味なので、クリアして追加し直すか、既にある@itemNameのValueを変更するかでいいのではないでしょうか。

投稿2019/11/06 02:55

workaholist

総合スコア559

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

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

FM88mhmh

2019/11/06 03:42

”@~”はC#の変数とは別物なんでしょうか? ``` b = a[i]; c[i] = b; ``` の”b”のような使い方はできないんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問