何度もお世話になっております。
現在作っているプログラム(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
回答3件
あなたの回答
tips
プレビュー