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ファイルの何かにあると思いますか? こんな経験ありませんか??
プログラムをデバッグしましたが、正常に動作しますが、スタンドアロン アプリとして実行した場合にのみ、何も保存されないことがあります....プログラムを再実行するまで...