C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

vb.net 配列をaccsessへinsert

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■90785 / inTopicNo.1)  vb.net 配列をaccsessへinsert
  
□投稿者/ せれねる (1回)-(2019/04/22(Mon) 11:44:13)

分類:[VB.NET/VB2005 以降] 

お世話になります。

今現在、vb.netにて

1. mdbファイルから起動時の「会員」のデータを取得
2. 「現在の日時」を取得
3. あらかじめ作成されている「会員ログイン」に「会員」のデータと「exeファイル起動時の日時」をinsert

という機能を作成しており3項目の
mdbファイルに「DataTable」または「datarow」の値をaccsessへinsertする方法をうまく探す出すことが
できませんでした。


--------------------------------------------------------
■vb.netコード

Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
        Try
            ''ユーザーグリッドの初期設定有効
            Call m_userControlClass.UserCtrlInitialize(Me)
 'DBコネクション生成
            Dim oleCon As New OleDb.OleDbConnection()
            Dim oleDataAd As OleDb.OleDbDataAdapter
            Dim dtSet As New DataSet()
            Dim dtTable As New DataTable
            Dim dr As DataRow = dtTable.NewRow
            Dim dc = New DataColumn
            Dim strSql As String

            Dim dtime As DateTime = New DateTime

            '接続文字列を作成
            oleCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
            & "Data Source= C:\テストDB\てすと会員.mdb;" _
            & "Persist Security Info=False"

            'SQL文を作成
            strSql = "Select kaiinID,Name1,kaiinPref,kaiinCity,kaiinPhone,kaiinFax from kaiin"
            'レコードを取得
            oleDataAd = New OleDb.OleDbDataAdapter(strSql, oleCon)
            oleDataAd.Fill(dtSet, "kaiin")
            'データセットから「会員」テーブルを取得
            dtTable = dtSet.Tables("kaiin")


            '「exeファイル起動時の日時」を取得するため列の名前を設定
            dc.ColumnName = "totime"
            ' 初期値
            dc.DefaultValue = String.Empty
            ' データ型
            dc.DataType = Type.GetType("System.String")
            ' 「exeファイル起動時の日時」列を取得した「会員」へ追加
            dtTable.Columns.Add(dc)

            Dim iRowCount As Integer
            Dim iColCount As Integer
            For iRowCount = 0 To dtTable.Rows.Count - 1
                For iColCount = 0 To dtTable.Columns.Count - 1
                    Console.Write(dtTable.Rows(iRowCount)(iColCount) & ControlChars.Tab)
                Next

                For Each row As DataRow In dtTable.Rows
          ' 「exeファイル起動時の日時」をrow("totime")へ格納
                    row.Item("totime") = System.DateTime.Now
                    Console.WriteLine(row("totime").ToString)
                Next
            Next

        Catch ex As Exception


        Finally

        End Try
    End Sub

--------------------------------------------------------

■上記コードのおおまかな概要
「てすと会員.mdbのkumiaiテーブル」からselect文で取得した「datatable」をrowに渡し、
「row」の中に「totime」という列を作成しそこに「現在時刻」を入れ込む

--------------------------------------------------------

■mdbのテーブルデータ

kaiinテーブルの列

 KumiaiID,SeikyuName1,KumiaiPref,KumiaiCity,KumiaiPhone,KumiaiFax

kaiinログインテーブルの列

 KumiaiID,SeikyuName1,KumiaiPref,KumiaiCity,KumiaiPhone,KumiaiFax,totime

--------------------------------------------------------

当方、vb.netを触り始めて1週間のド素人になります。

非常に拙いコードで申し訳ありません。


何卒ご教授のほどよろしくお願いいたします。



引用返信 編集キー/
■90795 / inTopicNo.2)  Re[1]: vb.net 配列をaccsessへinsert
□投稿者/ WebSurfer (1809回)-(2019/04/23(Tue) 09:56:57)
No90785 (せれねる さん) に返信

> 3. あらかじめ作成されている「会員ログイン」に「会員」のデータと「exeファイル起動時の日時」をinsert

そのコードはどの部分ですか? アップされたものには見当たらないように思います。

ひょっとして、そのコードを書いてほしいということですか?
引用返信 編集キー/
■90798 / inTopicNo.3)  Re[2]: vb.net 配列をaccsessへinsert
□投稿者/ せれねる (2回)-(2019/04/23(Tue) 11:47:01)
No90795 (WebSurfer さん) に返信
> ■No90785 (せれねる さん) に返信
>
>>3. あらかじめ作成されている「会員ログイン」に「会員」のデータと「exeファイル起動時の日時」をinsert
>
> そのコードはどの部分ですか? アップされたものには見当たらないように思います。
>
> ひょっとして、そのコードを書いてほしいということですか?

ご返信いただきありがとうございます。

完全なコードを書いてほしいということではないです。
記述の意見やアドバイス、をいただければと思い投稿いたしました。
引用返信 編集キー/
■90799 / inTopicNo.4)  Re[3]: vb.net 配列をaccsessへinsert
□投稿者/ せれねる (3回)-(2019/04/23(Tue) 12:14:08)
自己解決しました。

ありがとうございました。
解決済み
引用返信 編集キー/
■90800 / inTopicNo.5)  Re[3]: vb.net 配列をaccsessへinsert
□投稿者/ WebSurfer (1810回)-(2019/04/23(Tue) 12:32:53)
No90798 (せれねる さん) に返信

insert するデータを保持する DataTable は完成しているのですよね?

型が分からないのですが全部文字列でよければ、まず以下のような INSERT クエリを作って、

INSERT INTO [kaiinログイン] (KumiaiID,SeikyuName1,KumiaiPref,KumiaiCity,KumiaiPhone,KumiaiFax,totime) VALUES (?,?,?,?,?,?,?)

以下の記事の「// Excel ブックにデータを INSERT」とコメントのあるコードのようにして
やりたいことはできそうです。Excel とありますが、その部分のコードは Access でも同じ
はずです。

http://surferonwww.info/BlogEngine/post/2012/01/26/Creating-Excel-workbook-by-using-ACE-OleDb-provider.aspx

コードの insertQuery が上の INSERT クエリ、table が DataTable です。
引用返信 編集キー/
■90807 / inTopicNo.6)  Re[4]: vb.net 配列をaccsessへinsert
□投稿者/ せれねる (4回)-(2019/04/23(Tue) 15:10:21)
再度ご返信いただき、ありがとうございます。

参考サイト、insertクエリの生成までいただき
ありがとうございます。

--------------------------------------------------------
■自己解決した時のコード

 Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
        Try
            ''ユーザーグリッドの初期設定有効
            Call m_userControlClass.UserCtrlInitialize(Me)
            'DBコネクション生成
            Dim oleCon As New OleDb.OleDbConnection()
            Dim oleDataAd As OleDb.OleDbDataAdapter
            Dim dtSet As New DataSet()
            Dim dtTable As New DataTable
            Dim dr As DataRow = dtTable.NewRow
            Dim dc = New DataColumn
            Dim strSql As String

            Dim dtime As DateTime = New DateTime

            '接続文字列を作成
            oleCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
            & "Data Source= C:\高速DB\ライズ事業協同組合.mdb;" _
            & "Persist Security Info=False"

            'SQL文を作成
            strSql = "Select KumiaiID,SeikyuName1,KumiaiPref,KumiaiCity,KumiaiPhone,KumiaiFax from kumiai"
            'レコードを取得
            oleDataAd = New OleDb.OleDbDataAdapter(strSql, oleCon)
            oleDataAd.Fill(dtSet, "kumiai")


            'データセットからテーブルを取得
            dtTable = dtSet.Tables("kumiai")
            '列の名前
            dc.ColumnName = "totime"
            ' 初期値
            dc.DefaultValue = String.Empty
            ' データ型
            dc.DataType = Type.GetType("System.String")
            ' 列を追加
            dtTable.Columns.Add(dc)

            Dim iRowCount As Integer
            'Dim iColCount As Integer
      
------------'追加コード1↓

            Dim oleCona As New OleDb.OleDbConnection()
            oleCona.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
            & "Data Source= C:\高速DB\ライズ事業協同組合.mdb;" _
            & "Persist Security Info=False"

            '接続オープン
            oleCona.Open()

            Dim SQLCm As OleDb.OleDbCommand = oleCona.CreateCommand

-----------'追加コード終わり1↑


            For iRowCount = 0 To dtTable.Rows.Count - 1
                'For iColCount = 0 To dtTable.Columns.Count - 1
                'Console.Write(dtTable.Rows(iRowCount)(iColCount) & ControlChars.Tab)
                'Next

                For Each row As DataRow In dtTable.Rows
                    row.Item("totime") = System.DateTime.Now
                    Console.WriteLine(row.Item("KumiaiID").ToString)
                    Console.WriteLine(row.Item("SeikyuName1").ToString)
                    Console.WriteLine(row.Item("KumiaiPref").ToString)
                    Console.WriteLine(row.Item("KumiaiCity").ToString)
                    Console.WriteLine(row.Item("KumiaiPhone").ToString)
                    Console.WriteLine(row.Item("KumiaiFax").ToString)
                    Console.WriteLine(row.Item("totime").ToString)
 
         
--------------------'追加コード2↓

                    SQLCm.CommandText = "insert into kumiai_login (KumiaiID,KumiaiName,KumiaiPref,KumiaiCity,KumiaiPhone,KumiaiFax,totime)" &
                        "values (
                        '" & (row.Item("KumiaiID")) & "',
                        '" & (row.Item("SeikyuName1")) & "',
                        '" & (row.Item("KumiaiPref")) & "',
                        '" & (row.Item("KumiaiCity")) & "',
                        '" & (row.Item("KumiaiPhone")) & "',
                        '" & (row.Item("KumiaiFax")) & "',
                        '" & (row.Item("totime")) & "')"
                    SQLCm.ExecuteNonQuery()

--------------------'追加コード終わり2↑

                Next

            Next

        Catch ex As Exception

        Finally

        End Try
    End Sub
--------------------------------------------------------

しかしながら、行き当たりばったりなコードのため見づらくまた、
「ExecuteNonQuery には Connection が開かれていて使用可能なことが必要です。現在の接続の状態は '終了" です。」
というエラーがでており、対応するため(対応ではないかと思いますが)dbのConnectionを追加で記述するという
おかしなソースコードとなりました。

一応はmdbファイル「てすと会員」のkaiinログインテーブルにinsertはされたものの
いただいた情報をもとに再度ソースコードを書きなおします。

自己解決したとは言え、新たに詳しい解説とともに
コードの参考までいただき本当にありがとうございます。


引用返信 編集キー/
■90811 / inTopicNo.7)  Re[5]: vb.net 配列をaccsessへinsert
□投稿者/ PANG2 (278回)-(2019/04/23(Tue) 15:22:55)
SQL文一発で

INSERT INTO kumiai_login SELECT *,'2019/04/23 15:21:35' FROM kumiai


INSERT INTO ステートメント (Microsoft Access SQL)
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/insert-into-statement-microsoft-access-sql
引用返信 編集キー/
■90812 / inTopicNo.8)  Re[5]: vb.net 配列をaccsessへinsert
□投稿者/ WebSurfer (1813回)-(2019/04/23(Tue) 16:08:54)
No90807 (せれねる さん) に返信

> 一応はmdbファイル「てすと会員」のkaiinログインテーブルにinsertはされたものの
> いただいた情報をもとに再度ソースコードを書きなおします。

クエリは最低限パラメータ化することをお勧めします。

SQL インジェクションの防止とパフォーマンスの向上がパラメータ化する主な目的です。
パラメータ化するということを習慣にした方がよさそうです。

今回のケースでは SQL インジェクションの心配はないかもしれませんが、パフォーマンス
向上にはメリットがあるのではないかと思います。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ