VB.NETでのデータベース書き込みについて

このQ&Aのポイント
  • リストレビューに表示されているデータをデータベースに書き込む処理を追加したいですが、データセットにメモリ上のテーブルを作成してデータベースへ書き込む方が良いのでしょうか?
  • または、直接データベースに書き込む方が良いですか?
  • データベース書き込みの方法について教えてください。
回答を見る
  • ベストアンサー

VB.NETでのデータベース書き込みについて

リストレビューに表示されているデータをデータベースに書き込む処理を追加したいのですが、データセットにメモリ上のテーブルを作成してデータベースへ書き込む方が良いのでしょうか? それとも直接データベースに書き込む方が良いのでしょうか? 前者のテーブル作成のコードは書きの通りです。 Public Function AddDataSetTable(ByVal kojo_cd() As String, ByVal kojo_name() As String, ByVal kojo_date() As String)   Dim dtSet As New DataSet("DataSetTable")   Dim dtTable As New DataTable("CalDatTable")   Dim fmain As New FrmMain   Dim i As Integer   'テーブルに列を追加    With dtTable.Columns     .Add("コード")     .Add("名称")     .Add("日にち")    End With   'テーブルに行を追加   With dtTable.Rows    For i = 0 To UBound(kojo_cd)     .Add(New Object() {kojo_cd(i), kojo_name(i), kojo_date(i)})    Next i   End With   'データセットにテーブルを追加   dtSet.Tables.Add(dtTable) End Function

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

メモリ上 or 直接 >直接データベースに書き込む方が良いのでしょうか? PG的には、何も考えないで済む随時更新だと、楽チンです。 同時更新を防ぐための排他制御のパターンも減ります。 ただし、データの更新量や速度、また運用での扱いにより、「ベストな方法」はどちらとも言えません。 それらを考慮してまとめて更新となった場合、参照/更新/登録を行う際のテーブルの優先度を決めておかないと、プログラムが固まる(デッドロック)恐れがあります。 これをきちんと行う設計がなされていない限り、まとめて更新はしない方が無難です。 複数テーブルにまたがらない更新でも、複数レコードの更新についても、排他フラグなどを持っていないと、データの矛盾が発生するかもしれません。 まとめます。 メモリテーブルの方が高速。 ただし、更新順序の設計がきちんとされていなければ、トランザクションを開始して直接がベスト。

関連するQ&A

  • VB2005で、動的にコントロールを作成出来ない件

    MDIのフォームで、 子フォーム1にコントロール(ラベルなど)を追加したい場合、 子フォーム2のボタンクリックで追加しようとすると 追加されません。 (子フォーム1のボタンで同一フォームへコントロールを  追加しようとすると追加できました。) どのようにすれば追加できるでしょうか? 子フォーム2の追加ボタン関数のコード Private Sub Add_click()  AddLabel(子フォーム1, "hogehoge") End Sub モジュール(関数群)のコード Private Sub AddLabel(Byval objForm As Form, ByVal strText As String)  Dim ctlAddLabel As New Label()  With ctlAddLabel   .AutoSize = False   .Location = New Point(0, 0)   .Size = New Size(200, 40)   .Name = "Label" & Counter 'Counter は追加の度に1ずつ増えます   .Text = strText  End With  objForm.Controls.Add(ctrlAddLabel) End Sub

  • vb2008より、ファイル読み込み書き込みの際に発生する文字化けについて

     初めて投稿させて頂くkuro_sanと申します。どうぞよろしくお願いします。  現在visual basic 2008を用いてプログラムを作成しているのですが、データの読み込み、書き込みを行う箇所で問題が発生したために、行き詰まっております。  コードを以下に示させて頂きます。 [書き込み処理関数] Private Sub WriteLog(ByVal FileName As String) 'File Open Dim Writer As New IO.StreamWriter(FileName, True) '書き込み処理 For i As Integer = 0 To i Writer.WriteLine(Table(0, i) & "," & Table(1, i) & "," & Table(2, i)) Next Writer.Close() End Sub [読み込み処理関数] Private Sub Readlog(ByVal FileName As String) Dim Reader As New IO.StreamReader(FileName, System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items() As String = New String() {} Dim Line As String = Reader.ReadLine 'CSVの一行 'データの読み込み i = 0 Do Until IsNothing(Line) Items = Line.Split(",") i += 1 Table(0, i) = Items(0).ToString Table(1, i) = Items(1).ToString Table(2, i) = Val(Items(2)) Line = Reader.ReadLine Loop End Sub です。  書き込みはtext形式の物に行っています。Table配列には(0,i),(1,i)にはString型の文字が、(2,i)には数字が入力されています。 入力、出力は行うことが出来るのですが、(0,i),(1,i)にひらがな、カタカナ、漢字などの文字が使われていると、読み込みを行った際に文字化けして格納されてしまいます。 (例:くろ,kuro,1 → 縺上m,kuro,1)  出力されたtextの中では文字化けが起こっていませんが、形式を直接csvに変換したり、読み込みを行った際に文字化けが発生している事から、書き込み時に問題があるのではないか、と思い調べているのですが、原因を判明できていません。 文字化けを発生させずに読み込み、書き込み処理を行う方法をご存知である方がいらっしゃればご教授頂けますと幸いです。

  • VB.NETでのAccessテーブルリンク

    現在、VB.NET上で操作し、Accessのテーブルのリンクをしているのですが、 リンク処理の直後に、最後にテーブルのリンク処理をしたテーブルを 開こうとすると、 「要求された名前、または序数に対応する項目がコレクションで見つかりません。」という エラーが出ます。 なお、リンクしたテーブルには、きちんと正しいリンクで開こうとしたテーブルが登録されています。 それで、最後にリンクしたのが悪いのかと思い、順番を変えると、 そのエラーは起こらずに通常に起動しました。 ですが、順番を変えただけで普通に動く、というのが なんだか腑に落ちません。(まあ、無事に動いているのでいいのですが(汗 ) 以下にリンク処理を記載します。 何故、このようなことが起こるのかわかる方いらっしゃいましたら、ご教授お願い致します。 予想でもかまいません。 Public Sub DBLink() LFlag = False Dim rs As ADODB.Recordset = New ADODB.Recordset Dim Sql As String = String.Empty Dim dbPName As String = String.Empty Dim tName() As String 'リンク先のパスを指定 Dim f As New frmLinkPath f.ShowDialog() f.Close() f = Nothing 'パスを指定したか否か If LFlag Then 'TMPのパスは固定 dbPName = PathLast(Application.StartupPath) & "TMP.mdb" 'リンクするテーブル名を取得 'mdbLには、テーブル名がカンマ区切りで入っています tName = mdbL.Split(",") 'リンク先のテーブルを削除 For i = 0 To tName.Length - 1 Sql = "DROP TABLE " & tName(i) rs.Open(Sql, cn) Call SLink(tName(i), dbPName) Next dbPName = PathLast(DBPath) & "MST.mdb" 'リンクするテーブル名を取得 tName = mdbS.Split(",") 'リンク先のテーブルを削除 For i = 0 To tName.Length - 1 Sql = "DROP TABLE " & tName(i) rs.Open(Sql, cn) Call SLink(tName(i), dbPName) Next Else MsgBox("リンク先が指定されなかったので、" & vbCrLf & "テーブルの再リンクをキャンセルします", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "") End If End Sub ''' <summary> ''' データベース再リンク ''' </summary> ''' <param name="psNm">リンクするテーブル名</param> ''' <param name="psMdb">リンク元データベース名</param> ''' <remarks></remarks> Public Sub SLink(ByVal psNm As String, ByVal psMdb As String) Try Dim lodDb As dao.Database Dim ltDef As dao.TableDef Dim lsSource As String Dim lsTarget As String Dim daoE As New dao.DBEngine 'リンク先データベースとリンクデータベース名を指定 lsSource = psMdb lsTarget = PathLast(Application.StartupPath) & "DATA.mdb" '既存のデータベースの場合は OpenDatabase を使用する) lodDb = daoE.OpenDatabase(lsTarget) '任意の名前でテーブル定義を作成する ltDef = lodDb.CreateTableDef(psNm) 'リンク先のテーブル名を指定する ltDef.SourceTableName = psNm 'リンク先のデータベースを指定する(対象がMDBの場合セミコロンの前は省略) ltDef.Connect = ";Database=" & lsSource '定義したテーブルをアペンド(追加)する lodDb.TableDefs.Append(ltDef) lodDb.Close() lodDb = Nothing Catch ex As Exception Debug.Print(ex.Message) 'Throw End Try End Sub

  • VB.NETのデリゲートについて

    VB.NETのデリゲートについて質問です。 以下のプログラムなのですが、 デリゲート型をインスタンス化しているところで、コンストラクタにパラメータを渡していますが、 そのコンストラクタはどこに定義されているのでしょうか。 (AddressOf t1.Ohayou)というパラメータが渡されていますが、このパラメータを受け取っているコンストラクタがどれなのかが分かりません。 ご教示よろしくお願いいたします。 Delegate Sub Myprint(ByVal s As String) Module Module1 Sub Main() Dim t1 As Test1 = New Test1() Dim t2 As TEst2 = New Test2() Dim d As Myprint = New Myprint(AddressOf t1.Ohayou) d.Invoke("VB太郎") d = New Myprint(AddressOf t2.Konbanwa) d.Invoke("VB太郎") End Sub End Module Class Test1 Sub Ohayou(ByVal s As String) Console.WriteLine("おはようございます。{0}です。", s) End Sub End Class Class Test2 Sub Konbanwa(ByVal s As String) Console.WriteLine("こんばんわ。{0}です。", s) End Sub End Class

  • データベースを更新したい(VB2008)

    VB2008でつくったアプリケーションでAccessのデータを更新したいです。DataGridView1でデータを表示させ更新ボタン押下時にデータ(Accessのテーブル)を更新したいです。 DataGridView1でデータを表示することはできましたが、「更新」押下に更新されません。 Accessのテーブル名は「01データです」 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me._01データTableAdapter.Fill(Me.年賀状DataSet._01データ) End Sub Private Sub 更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 更新.Click With DataGridView1 .Update()     End With     MsgBox("更新しました") End Sub

  • DataGridViewにリンク列の追加に関して

    開発環境:Visual Basic 2008 教えて下さい。 画面上にDataGridViewを配置し、データベースから取得した値を表示させていますが、 その際に、ある項目だけリンク列としたいと考えています。 いろいろネットで調べたところ、単純にDataGridViewにリンク列にする方法は記載がありましたが、 Datatableとバインドしているような場合のやり方は記載がなく、、、 以下のような場合(リンク項目をリンクとしたい)はどのようにリンクとしたら良いでしょうか?? ※ リンク項目はDBの内容で、それぞれリンク先を異なるリンク先にしたいと考えています。 《記述内容》 Private Sub 作成_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'データセットにテーブルを追加する dtTable = dtSet.Tables.Add("データ_TBL") 'テーブルにフィールドを追加する dtTable.Columns.Add("部品", Type.GetType("System.String")) dtTable.Columns.Add("リンク項目", Type.GetType("System.String")) 'DataGridViewにデータを表示する G_GRID.DataSource = dtTable End Sub Private Sub BTN_表示_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_TEXT.Click ********* かなり抜粋 ********* Do until data_row("部品") = IN_名称(HCOUNT).IN_部品 ← 上処理でDBより取得 data_row("リンク項目") = IN_名称(HCOUNT).IN_リンク項目 ← 上処理でDBより取得 dtTable.Rows.Add(data_row) loop End Sub よろしくお願いします。

  • VB2008で構造体を引数とした時にエラー

    VB2008の勉強を始めて数週間の初心者です。 勉強用にいろいろとプログラムを作っているのですが、 構造体(Structure)を引数で渡して戻り値を取得する Functionを作成してみました。 同一クラス内のPrivate Function の場合は問題ないのですいが、 追加した別クラスに Function を作成したところ 「 型 'TEST_A.Form1.str_IN' の値を 'TEST_A.Class1.str_IN' に変換できません。」 のエラーが表示されてしまいます。 別クラスのFunctionを使用する時、引数には構造体は指定できないのでしょうか? なにか文法上の誤りがあるのでしょうか? 初心者なので変な質問してたらスイマセン。 詳しい方がいらっしゃいましたらよろしくお願いします。 ------------------------------------------------------ Public Class Form1  Public Structure str_IN   Public in_aaa As String  End Structure  Private Sub Button1_Click(ByVal sender As System.Object,  ByVal e As System.EventArgs) ~   Dim stin As New str_IN   '------------------------------------   stin.in_aaa = "aaa"   Label1.Text = Test_Sub(stin) '<------- これはok   '-------------------------------------   Dim cls = New Class1   stin.in_aaa = "aaa"   Label1.Text = cls.CFnk(stin) '<----- エラーになる  End Sub  Private Function Test_Sub(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class ------------------------------------------------------------ Public Class Class1 '新たに作成したクラス  Public Structure str_IN   Public in_aaa As String  End Structure  Public Function CFnk(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class

  • VB.NETで出来てC#で出来ない???

    VB.NETでは出来るのにC#で同じようにするやり方がわからなくて困っています。 VSのバージョンは2008です。 やりたいことは 『param.Item("AAA") = "111"』 このように書けるクラスを作りたいのですが、 VBで出来てC#では出来ないのでしょうか? イメージとしてはプロパティにメソッドをくっつけたようなクラス? C#ではこのように書くとエラーになります。 どのようにしたらいいでしょうか? public string Item(string Key) {  set { _param[Key] = value; } } VB Dim param As New Param() param.Item("AAA") = "111" ----Paramクラス---- Imports System.Text Public Class Param Private _Hash As New Hashtable Default Public Property Item(ByVal Key As String) As String Get Return _Hash(Key) End Get Set(ByVal value As String) _Hash(Key) = value End Set End Property End Class ---------

  • VB 2008: 文字サイズの指定要領が判りません!

    指定秒だけメッセージを表示する関数を作成しています。 しかし、文字サイズの設定要領が判りません。 VB.NET 学習40日余という初学者です。 宜しくお願いします。   Sub PauseMsg2(ByVal Msg As String, ByVal PauseTime As Double, ByVal aColor As Color, ByVal iFontSize AS Integer)     Dim frm As New Form     Dim lbl As New Label()     With lbl       .Text = Msg       .BorderStyle = BorderStyle.None       .Location = New Point(10, 10)       .ForeColor = aColor       .Size = XXXXX       .Width = 478     End With     With frm       .HelpButton = False       .FormBorderStyle = FormBorderStyle.FixedDialog       .ControlBox = False       .MaximizeBox = False       .MinimizeBox = False       .Text = ""       .Width = 500       .Height = 20       .StartPosition = FormStartPosition.CenterScreen       .Controls.Add(lbl)       .Show()       Pause(PauseTime)       .Close()     End With   End Sub   ' ------------   ' ポーズ関数   ' ------------   Sub Pause(ByVal PauseTime As Double)     Dim Finish As Double = DateAndTime.Timer + PauseTime     Do       DoEvents()     Loop Until DateAndTime.Timer > Finish   End Sub

  • VB2010とアクセスの接続方法

    textboxにID入力し、ENTERを押したらそのIDのデータがアクセスのデータベースから出力される、というプログラムを書き方のヒントを教えていただけないでしょうか。 Imports System.Data.OleDb Public Class Form1 Private Sub Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Enter '▼データの取得 Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database\Animals.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Adapter As New OleDbDataAdapter(SQLCm) Dim Table As New DataTable SQLCm.CommandText = "SELECT * FROM T_akusesu" Adapter.Fill(Table) '▼データの連結 textbox.DataBindings.Add("Text", Table, "名前") textbox2.DataBindings.Add("Text", Table, "フリガナ") Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Sub End Class ・アクセスデータ  ID、名前、氏名 以上、よろしくお願い致します。