0

vb.net 2010にレジストリを追加するアプリケーションがありますが、アプリケーションMS Access Patient dbをリセットする (閉じて再度実行する) まで、何も追加されないことがあります。これは非常に悪いことです。

情報を追加したいテーブルは次のようになります。

PatientId Proyect Email        RFC
-----------------------------------
1         firstP  firs@any.com  KEY
2         secondP sec@any.com   GTE
.... 

(プロジェクトは意図的なものであり、プロジェクトではありません)

テーブルの構造には、自動インクリメント ID 値 (PatientID) があります。割り当てる必要がある次の ID を知るには、関数があります。

Public Function GenerateAutoID()
        Return Me._patientDataTable.Rows(Me._patientDataTable.Rows.Count - 1)("PatientID").ToString()
    End Function

これは、新しいデータを db に挿入できないバグであると思われます...次に、保存ボタンがクリックされたときに実行される関数は次のとおりです。

Public Sub Save()
        Dim query = String.Empty
        If Not _updateFlag Then
            ' save query
            query = "INSERT INTO Patient(Proyect,Email,RFC)"
            query &= " VALUES ('" & txtProyect.Text & "','" & txtEmail.Text & "','" & txtRFC.Text & "')"
            DatabaseFunctions.ExecuteQuery(query)
            MessageBox.Show("Data saved.", "System", MessageBoxButtons.OK, MessageBoxIcon.Information)

        Else
            ' update query
            '... code that updates
        End If
        Clear()
        Reload()
    End Sub

コードにはClear()、フォーム内のすべてのテキストフィールドをリセットするだけ のものが含まれReload()ていLoadDBData()ます。

Public Sub Reload()
        SetToolTipsToButtons() 'this is for some fancy buttons
        LoadDBData()
        txtPatientID.Text = (Integer.Parse(GenerateAutoID()) + 1).ToString()
        FillListNames()
        SetAutoComplete()
    End Sub



Public Sub LoadDBData()

    Dim query As String = "SELECT * FROM Patient "
    Me._patientDataTable = DatabaseFunctions.GetDataTable(query)
    dgvInfo.Rows.Clear()

    For Each dtRow In Me._patientDataTable.Rows

        dgvInfo.Rows.Add()
        dgvInfo.Rows(dgvInfo.RowCount - 1).Cells("colPatientID").Value = dtRow("PatientID").ToString()
        dgvInfo.Rows(dgvInfo.RowCount - 1).Cells("colProyect").Value = dtRow("Proyect").ToString()
        dgvInfo.Rows(dgvInfo.RowCount - 1).Cells("colEmail").Value = dtRow("Email").ToString()
        dgvInfo.Rows(dgvInfo.RowCount - 1).Cells("colRFC").Value = dtRow("RFC").ToString()

    Next    
    dgvInfo.ClearSelection()

End Sub

odbc 接続を処理するクラスは次のとおりです。

Imports System.Data.Odbc
Imports System


Public Class DatabaseFunctions

    Shared con As OdbcConnection
    Public Shared Sub CreateConnection()
        con = New OdbcConnection
        'con.ConnectionString = "Dsn=XXX"
        con.ConnectionString = "Dsn=XXX;uid=sa;pwd=XXXxxx;"
        con.Open()
    End Sub

    Private Shared Sub CheckConnection()
        If con Is Nothing OrElse con.State = ConnectionState.Closed Then
            CreateConnection()
        End If
    End Sub

    Public Shared Function GetDataReader(ByVal SQL As String) As OdbcDataReader
        CheckConnection()
        Dim cmd As New OdbcCommand(SQL, con)
        Dim dr As OdbcDataReader
        dr = cmd.ExecuteReader
        Return dr
    End Function

    Public Shared Function GetDataTable(ByVal SQL As String) As DataTable
        CheckConnection()
        Dim cmd As New OdbcCommand(SQL, con)
        Dim table As New DataTable
        Dim da As New OdbcDataAdapter(cmd)
        da.Fill(table)
        Return table
    End Function

    Public Shared Sub ExecuteQuery(ByVal SQL As String)
        CheckConnection()
        Dim cmd As New OdbcCommand(SQL, con)
        cmd.ExecuteNonQuery()
    End Sub
End Class

そして、フォームがロードされたときのコード:

 Private Sub frmPatientRegistration_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            Reload()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Systema", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

だから私は save() コードを少し変更して、テーブルに同じ数の行があるかどうか、もう1行ある場合はすべて良いかどうかを知ることを考えていましたが、そうでない場合はもう一度試してください....

私が考えていたこの解決策はエレガントではないことは知っていますが、おそらくこれを回避するために問題はコードの他の部分にあります...しかし、自動インクリメントまたはAccess dbファイルの何かにあると思いますか? こんな経験ありませんか??

プログラムをデバッグしましたが、正常に動作しますが、スタンドアロン アプリとして実行した場合にのみ、何も保存されないことがあります....プログラムを再実行するまで...

4

1 に答える 1

1

close接続も ありません

con.Close()
cmd.Dispose()
con.Dispose()

次のように変更します。

Imports System.Data.Odbc
Imports System

Public Class DatabaseFunctions

    Shared con As OdbcConnection


    Public Shared Function GetDataReader(ByVal SQL As String) As OdbcDataReader
        Dim dr As OdbcDataReader
        'CheckConnection()
        Try
            con = New OdbcConnection
            con.ConnectionString = "Dsn=XXX;uid=sa;pwd=XXXxxx;"
            con.Open()
            Dim cmd As New OdbcCommand(SQL, con)
            dr = cmd.ExecuteReader
            con.Close()
            cmd.Dispose()
            con.Dispose()
            Return dr
        Catch ex As Exception
            MessageBox.Show(ex.Message, "System", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            If (con.State = System.Data.ConnectionState.Open) Then
                con.Close()
                con.Dispose()
            End If
        End Try
        Return dr
    End Function

    Public Shared Function GetDataReaderVal(ByVal SQL As String) As String
        Dim resultado As String
        'CheckConnection()
        Try
            con = New OdbcConnection
            con.ConnectionString = "Dsn=XXX;uid=sa;pwd=XXXxxx;"
            con.Open()
            Dim cmd As New OdbcCommand(SQL, con)
            Dim dr As OdbcDataReader
            resultado = ""
            dr = cmd.ExecuteReader
            dr.Read()
            resultado = dr.GetValue(0).ToString
            con.Close()
            cmd.Dispose()
            con.Dispose()
            Return resultado
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Sistem", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            If (con.State = System.Data.ConnectionState.Open) Then
                con.Close()
                con.Dispose()
            End If
        End Try
        resultado = "0"
        Return resultado
    End Function


    Public Shared Function GetDataTable(ByVal SQL As String) As DataTable
        Dim table As New DataTable
        'CheckConnection()
        Try
            con = New OdbcConnection
            con.ConnectionString = "Dsn=XXX;uid=sa;pwd=XXXxxx;"
            con.Open()
            Dim cmd As New OdbcCommand(SQL, con)

            Dim da As New OdbcDataAdapter(cmd)
            da.Fill(table)
            con.Close()
            cmd.Dispose()
            con.Dispose()
            Return table
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Sistem", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            If (con.State = System.Data.ConnectionState.Open) Then
                con.Close()
                con.Dispose()
            End If
        End Try
        Return table
    End Function



    Public Shared Sub ExecuteQuery(ByVal SQL As String)
        'CheckConnection()
        Try
            con = New OdbcConnection
            con.ConnectionString = "Dsn=XXX;uid=sa;pwd=XXXxxx;"
            con.Open()
            Dim cmd As New OdbcCommand(SQL, con)
            cmd.ExecuteNonQuery()
            con.Close()
            cmd.Dispose()
            con.Dispose()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Sistem", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            If (con.State = System.Data.ConnectionState.Open) Then
                con.Close()
                con.Dispose()
            End If
        End Try
    End Sub
End Class
于 2012-12-02T16:58:24.880 に答える