前提・実現したいこと
Visual Studio2019を使用して 在庫管理Windowsアプリケーションを作成しております。 その中でExcelファイルを読み込み、Formに配置しているDataGridViewに表示を行い 表示された内容をSQLServerに用意している2つのTABLEにInsertするようにしたいと考えております。 登録部分で躓いてしまったため書けておりませんが登録するデータの重複チェックを行い、 重複していない時は両TableにINSERT、 重複しているようであれば ・mst_tableにはINSERTしない ・DATA_tableは重複しているデータの数量の部分に足す(UPDATE) 行うようにしたいと考えております。 ■Formに配置されているコントロール ・Button1 ⇒ OpenFileDialogを使用してExcelファイルを選択してDataGridView1に表示 ・Button2 ⇒ DataGridView1に表示されている内容をSQLServerにInsert ・DataGridView1 ⇒ 読み込んだExcelファイルの表示 読み込むExcelファイルは8列×3000行ぐらいです。 列数は固定で、行数は可変となります。 ■INSERTするTable(データ型) ・mst_table ⇒ 品物マスター ・列名1 … nvarchar(50) ・列名2 … nvarchar(50) ・列名3 … nvarchar(50) ・列名4 … decimal(8, 0) ・列名5 … varbinary(MAX) ・列名6 … nvarchar(50) ・列名7 … date ・列名8 … nvarchar(50) ・DATA_table ⇒ 品物の在庫数量管理 ・列名1 … nvarchar(50) ・列名2 … int ・列名3 … datetime
発生している問題・エラーメッセージ
DataGridViewに表示した内容をDBへ登録する際に下記エラーが発生します。 ・エラーメッセージ 「実行タイムアウトの期限が切れました。操作完了前にタイムアウト期間が過ぎたか、サーバーが応答していません。」 DataTableの内容を順番に確認をしながらInsertしているので発生しているのだと思うのですが 今の私ではこれ以外に良い方法が見つかりませんでした。
該当のソースコード
VB
1 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 2 3 Dim dt As New DataTable 4 5 dt = DataGridView1.DataSource 6 7 Call insert_Table(dt) 8 9 End Sub 10 11 Sub insert_Table(ByVal dt As DataTable) 12 13 Dim check_Sql As String = Nothing 14 Dim Insert_Sql_mst As String = Nothing 15 Dim Insert_Sql_DATA As String = Nothing 16 Dim sinamono As String = Nothing 17 Dim used As Boolean = True 18 19 20 Using db_cn As New SqlConnection(接続文字列) 21 Using db_cmd As SqlCommand = db_cn.CreateCommand 22 23 db_cn.Open() 24 25 Try 26 27 db_cmd.Transaction = db_cn.BeginTransaction() 28 29 For i As Integer = 0 To dt.Rows.Count - 1 30 31 sinamono = dt.Rows(i)("EXCEL列名2").ToString 32 33 If sinamono <> Nothing Then 34 35 mySql_check = "SELECT COUNT(*) " 36 mySql_check &= "FROM mst_table " 37 mySql_check &= "WHERE EXCEL列名2 = '" & sinamono & "'" 38 39 40 '******【すでに登録されているか確認】********* 41 42 ml_function.UsedCode(check_Sql) 43 44 '***************************************** 45 46 47 '登録がなかった場合、【新規登録(INSERT)】 48 If used = True Then 49 50 Insert_Sql_mst = "INSERT INTO mst_table " 51 Insert_Sql_mst &= "(列名1, 列名2, 列名3, 列名4, 列名5, 列名6, 列名7, 列名8)" 52 Insert_Sql_mst &= "VALUES(" 53 Insert_Sql_mst &= "'" & dt.Rows(i)("EXCEL列名1").ToString & "', " 54 Insert_Sql_mst &= "'" & dt.Rows(i)("EXCEL列名2").ToString & "', " 55 Insert_Sql_mst &= "'" & dt.Rows(i)("EXCEL列名3").ToString & "', " 56 Insert_Sql_mst &= "'" & CInt(dt.Rows(i)("EXCEL列名4").ToString) & "', " 57 Insert_Sql_mst &= "NULL, " 58 Insert_Sql_mst &= "'" & dt.Rows(i)("EXCEL列名6").ToString & "', " 59 Insert_Sql_mst &= "'" & DateTime.Now() & "', " 60 Insert_Sql_mst &= "'" & My.Settings.変数 & "'" 61 Insert_Sql_mst &= ")" 62 63 Insert_Sql_DATA = "INSERT INTO DATA_table " 64 Insert_Sql_DATA &= "(列名1, 列名2, 列名3) " 65 Insert_Sql_DATA &= "VALUES(" 66 Insert_Sql_DATA &= "'" & dt.Rows(i)("EXCEL列名2").ToString & "', " 67 Insert_Sql_DATA &= "'" & CInt(dt.Rows(i)("EXCEL列名7").ToString) & "', " 68 Insert_Sql_DATA &= "'" & DateTime.Now() & "'" 69 Insert_Sql_DATA &= ")" 70 71 72 db_cmd.CommandText = Insert_Sql_mst 73 db_cmd.ExecuteNonQuery() 74 75 db_cmd.CommandText = Insert_Sql_DATA 76 db_cmd.ExecuteNonQuery() 77 78 End If 79 80 End If 81 82 Next 83 84 db_cmd.Transaction.Commit() 85 86 MessageBox.Show("登録完了。") 87 88 Catch ex As Exception 89 90 MessageBox.Show(ex.Message, "エラー") 91 db_cmd.Transaction.Rollback() 92 93 End Try 94 95 End Using 96 End Using 97 End Sub 98 99 Public Function UsedCode(check_Sql As String) As Boolean 100 101 '※存在している時はTrue 102 Dim used As Boolean = True 103 104 105 Using db_con As New SqlConnection(接続文字列) 106 107 Using db_cmd As SqlCommand = db_con.CreateCommand() 108 109 db_con.Open() 110 111 Dim db_dr As SqlDataReader 112 113 db_cmd.CommandText = check_Sql 114 115 db_dr = db_cmd.ExecuteReader() 116 117 If db_dr.HasRows Then 118 db_dr.Read() 119 If db_dr(0) = 0 Then 120 'カウント0で存在なしはFalse 121 used = False 122 123 End If 124 End If 125 126 End Using 127 End Using 128 129 Return used 130 131 End Function
試したこと
下記サイトを参考にDataTableを一括登録する方法など考えましたがDataGridViewに表示した内容を
二つのDataTableに分けて登録するような応用が出来ませんでした。
参考サイト
リンク
補足情報(FW/ツールのバージョンなど)
Visual Studio2019
SQLServer2016
開発言語 VB
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/27 02:23