首先,我在全局中创建了DataSet和MySQLDataAdapter。然后在Form_Load事件中,我像这样查询所有表。
dS = New DataSet
dA = New MySqlDataAdapter(myCommand)
Using sqlConn As New MySqlConnection(connStr)
myCommand = New MySqlCommand("Select ID, DevCompanyName from developer_name_table; Select ID, DevType from development_type_table; Select ID, Mukim from mukim_table; Select ID, Daerah from daerah_table; Select ID, Negeri from negeri_table; Select * from project_record ORDER BY FloatNo desc limit 1", sqlConn)
sqlConn.Open()
MsgBox("Connection open.")
Dim myCB As New MySqlCommandBuilder(dA)
dA.SelectCommand = myCommand
dA.UpdateCommand = myCB.GetUpdateCommand
dA.InsertCommand = myCB.GetInsertCommand
dA.DeleteCommand = myCB.GetDeleteCommand
dA.Fill(dS)
dA.FillSchema(dS, SchemaType.Source)
dS.Tables(0).TableName = "developer_name_table"
dS.Tables(1).TableName = "development_type_table"
dS.Tables(2).TableName = "mukim_table"
dS.Tables(3).TableName = "daerah_table"
dS.Tables(4).TableName = "negeri_table"
dS.Tables(5).TableName = "project_record"
End Using
一切工作正常,直到我尝试像这样将新记录添加到数据库中。下面的添加记录代码在按钮单击事件下。首先,我检查记录是否退出,然后像这样添加新行。
For Each r As DataRow In dS.Tables("project_record").Rows()
If r.Item("FloatNo") = TextBox1.Text.Trim() Then
MsgBox("Project exist. Please recheck.")
Exit Sub
End If
Next
SecurityAdd() 'This is just to fill None if field are empty.
Dim row = dS.Tables("project_record").NewRow()
row.Item("FloatNo") = TextBox1.Text.Trim()
row.Item("DevCompanyName") = ComboBox1.Text.Trim()
row.Item("DevType") = ComboBox2.Text.Trim()
row.Item("LotPt") = TextBox2.Text.Trim()
row.Item("Mukim") = ComboBox3.Text.Trim()
row.Item("Daerah") = ComboBox4.Text.Trim()
row.Item("Negeri") = ComboBox5.Text.Trim()
row.Item("TempReference") = RichTextBox1.Text.Trim()
row.Item("PermanentNo") = 0
row.Item("QuotationNo") = 0
row.Item("InvoiceNo") = 0
row.Item("Staff") = loggedUser.ToString() 'Just user ID.
dS.Tables("project_record").Rows.Add(row)
dA.Update(dS, "project_record")
更新后,我确定DataSet已更新,因为第二次单击添加记录时,消息框告诉我该记录已存在。但是,当我检查数据库时,没有新记录吗?我在这里做错了什么?
问题是您正在尝试配置,DataAdapter
使其可在中的所有6个表上使用DataSet
。如果查看构建的INSERT或UPDATE命令,您会发现它们是所有表中所有列的混合物。设置一个DataAdapter
为您完成艰苦的工作就可以在一张桌子上工作。
我不知道什么negeri
,其余的翻译成什么,但是看起来只有一个是事务表。其余的DevCompanyName
似乎是为项目记录表提供值的域/代码表。
通常,其中一些是根据业务规则固定的,而这些则不需要添加/更新的方法。其他人可能需要一种添加新项的方法,但只是偶尔地。手动进行这些更新,以便可以设置DA并将其与应用程序所关注的主表一起使用。如果有添加Mukim等人的表格或标签,只需在其中插入并刷新即可。
至少,我会将那些域表存储在一个单独的目录中DataSet
,以便它们不会妨碍您,但仅使用其中一个,就可以像下面这样配置它:
Using dbcon As New MySqlConnection(MySQLConnStr)
dsS = New DataSet
dbcon.Open()
' add table 1 - Mukim
dsS.Tables.Add("Mukim")
Using cmd As New MySqlCommand("SELECT DeptCode, Descr FROM Department", dbcon)
dsS.Tables("Mukim").Load(cmd.ExecuteReader())
cboColors.DataSource = dsS.Tables("Mukim")
cboColors.DisplayMember = "Descr" ' ie "Management"
cboColors.ValueMember = "DeptCode" ' eg "MGMT"
End Using
' add table 2 - negeri
' this table is fixed - new rows are very rare
Using cmd As New MySqlCommand("SELECT DeptCode, Descr FROM cDepartment", dbcon)
Dim dt As New DataTable
dt.Load(cmd.ExecuteReader)
cboDept.DataSource = dt
cboDept.DisplayMember = "Descr" ' "Sommelier"
cboDept.ValueMember = "DeptCode" ' "SOMM"
End Using
' etc
' main transaction table - project
' do this last
Dim prjcmd = New MySqlCommand(prjSql, dbcon)
daSample = New MySqlDataAdapter(prjcmd)
Dim cb As New MySqlCommandBuilder(daSample)
daSample.SelectCommand = prjcmd
daSample.InsertCommand = cb.GetInsertCommand
' etc
dsS.Tables.Add("Project")
daSample.Fill(dsS.Tables("Project"))
daSample.FillSchema(dsS.Tables("Project"), SchemaType.Source)
End Using
代码将那些域/代码表存储在DataSet
可能会更改的域/代码表中。代替适配器,它们使用填充DataReader
。任何固定的内容(例如“部门”)都将发布到相关的CBO并被遗忘。根据实际更新的频率,您可以对所有这些文件都使用此方法,并在它们获得新行时仅绑定到新表。
该代码还使用为相关CBODataTable
创建的DataSource
。我不确定您的代码在做什么,因为它存储Combobox.Text
。如果我确实DataTable
使用新条目进行了更新,则可以对其进行编码以使其自动显示。
结果是DataAdapter
知道如何更新等主项目表,而不会被这些其他表所混淆。然后插入就可以了:
Dim dr = dsS.Tables("Project").NewRow
dr("Name") = "My New Row"
dr("Mukim") = cboMukim.SelectedValue ' MGMT
... etc
dsS.Tables(1).Rows.Add(dr)
daSample.Update(dsS.Tables("Project"))
dsS.Tables("Project").AcceptChanges()
' See Notes
Dim rows = daSample.Fill(dsS.Tables("Project")) ' refresh
dsS.Tables("Project").Rows.Remove(dr)
SelectedValue
其存储到项目中。DataTable
曲目的行是新的,添加,删除等更新后,使用AcceptChanges
清除这些标志。尚不清楚第3项是否适用。FloatNo
可能是PK,在这种情况下,您可以跳过删除操作。同样,循环遍历“所有”行以查看是否存在“ FloatNo”,这将仅循环遍历已加载的一(1)行,因为查询包含一个LIMTI 1
子句。
并非没有,但您可以使用来简化UI DataGridView
。Mukim等人可能是ComboBox列,而不是表单上的组合框,因此可以为您添加新行。您只需要在验证和/或他们单击保存后进行更新即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句