数日心血,无私奉献!

1.解决了很多网友修改后datagridview1之后无法保存数据到数据库的问题!

先导入三个类,使后文写代码时简单,就是省去了包的路径,可直接用类名

Imports System.Data.SqlClient
Imports System.Data
Imports System.Data.OleDb
Public Class Form1
Dim odCnn As OleDbConnection'定义一个连接,用于打开数据库,以便事先取出表名
Dim odApter As OleDbDataAdapter'定义一个桥接器,介于内存中DataSet表和数据库之间,任何改变都在内存中进行,先不做实质性动作,直到需要确定了,才回发给数据库做实质性改动。
Dim dataPath As String'数据库的路径,含文件名
Dim passWord As String’数据库密码
Dim cnnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data source="‘用于连接的字符串 引擎Dim selectTabel As String'选定的要打开的表,确定后才能打开
Dim sqlStr As String’查询
Dim dataSet As DataSet‘内存中的虚拟的数据表,表的集合,有架构
Dim dataTable As DataTable’表,用于填充网格组件
Dim openFileDlg As OpenFileDialog‘代码创建的通用打开对话框
Dim dataGridView As DataGridView’用代码创建的网格
Dim CB As OleDbCommandBuilder‘能自动生成保存信息的工具,就是它在后台默默无闻地工作,才能够在确定之后自动完成保存任务:就是网友大为困惑的无法将DataGridView1中修改的内容保存数据库的问题。
Function dlg(ByVal index As Integer) As String’自定义函数,生成并调用打开对话框,获取数据库的路径
openFileDlg = New OpenFileDialog‘创建实例 它是隐式的,不用加载到窗体上
With openFileDlg’对一个对象进行格式化操作,用With方面,运行速度也快
.Title = "张志晨数据库程序V2012"‘对话框标题,个性化设置,可无。
.Filter = "Aaccess07-10数据库|*.accdb|access97-03数据库|*.mdb| 所有类型|*.*"’文件过滤器
.FilterIndex = index‘默认的要显示的文件类型
.ShowDialog()’显示打开对话框
Return .FileName‘此函数有返回值,用Return 返回值并结束函数程序运行
End With
End Function
'..........调用打开对话框,获取数据库路径
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = dlg(1)’调用打开对话框,获取数据库路径
dataPath = Label1.Text‘把路径给变量,方便使用
passWord = ""’设置密码,无则空
cnnStr = cnnStr & dataPath & ";JET OLEDB:Database Password=" & passWord‘构成完成的连接odCnn = New OleDbConnection(cnnStr)’创建连接器实例odCnn.Open()‘连接并在后台打开数据库
getTableName()’读取库的表名,并弹出窗体显示表的个数
End Sub
'.............................获取表名的函数........
Function getTableName()
' 获取数据表列表
'Type 有:"TABLE,VIEW,ACCESS TABLE,SYSTEM TABLE",
Dim dt As DataTable’创建一个临时用的表
Dim i As Integer‘一个临时用的计数器
dt = odCnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
New Object() {Nothing, Nothing, Nothing, "TABLE"})’获取所有的表信息,从中过滤出用户创建的表
'DataGridView2.DataSource = dt '.......显示表的所有信息
For i = 0 To dt.Rows.Count - 1 '记录数,也就是行数
ComboBox1.Items.Add(dt.Rows(i).Item("TABLE_NAME"))‘显示在列表框里
'显示字段名为 TABLE_NAME 列的行值 就是用户创建的表的名
Next
ComboBox1.Text = ComboBox1.Items(0) '设置第一个表为列表框的值,也就是显示第一个表
MsgBox("数据库中共有" & dt.Rows.Count & "个表")
End Function
'.....................填充网格 显示数据,以便用户观察使用.......
Function fillData()
Dim sql As String = "select * from " & selectTabel '建立查询 字符型
odApter = New OleDb.OleDbDataAdapter(sql, odCnn) '桥接器
dataSet = New DataSet '内存中的虚拟数据库实例
odApter.Fill(dataSet, "table") '上面的实例被填充
dataGridView.DataSource = dataSet.Tables("table")’填充
dataGridView.AutoResizeColumns()‘可自动生成需要的列
dataGridView.AutoResizeRows()’行自适应高度
dataGridView.AutoResizeColumns()’列自适应宽度
'获取字段名,并填充列表
'sqlFm.getField()可以获取指定的某一个表的字段,就是列名,列标题。
CB = New OleDb.OleDbCommandBuilder(odApter) '用于自动记录你对数据的更改,并形成保存方法备用
If CB Is Nothing Then‘如果上一行自动创建失败,就用下一行的代码人工创建
CB.DataAdapter = New OleDb.OleDbDataAdapter
odApter.DeleteCommand = CB.DataAdapter.DeleteCommand’删除数据
odApter.InsertCommand = CB.DataAdapter.InsertCommand‘插入数据
odApter.UpdateCommand = CB.DataAdapter.UpdateCommand’修改数据
End If
MsgBox("共有记录条数:" & dataSet.Tables("table").Rows.Count, vbOKOnly, "打开成功")
End Function
'创建一个网格
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
dataGridView = New DataGridView‘创建网格实例
Me.Controls.Add(dataGridView)’显示对象
With dataGridView‘定位网格,格式化
.Top = 60
.Left = 0
.Width = Me.Width - 20
.Height = Me.Height - 40 - 60
.Visible = True
End With
End Sub
'打开指定的表
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
selectTabel = ComboBox1.Text
fillData()’填充网格
End Sub
'....................保存修改.......................................
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
save_sub()‘调用下面的函数
End Sub
'保存数据
Function save_sub()
Dim temptb As DataTable’创建一个临时用的表
temptb = dataGridView.DataSource.GetChanges() '获取更改信息
If temptb IsNot Nothing Then '如果有更改
odApter.Update(dataGridView.DataSource) '就保存更改,在实质上是把网格中的数据回发给数据库
MsgBox("您的更改已经回发到数据库!", , "通用数据库程序")
Else
MsgBox("您没有更改任何数据!", , "通用数据库程序")
Exit Function
End If
End Function
End Class

access连接到mysql代码 access连接mysql数据库使用_数据库

'..............以上为自学成果,注满心血,但愿对网友有用..................................

2012.9.28增补:

‘条件查询(认为是对列进行筛选就行)
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim sr As New DataView
sr = dataSet.Tables("table").DefaultView
sr.RowFilter = ComboBox2.Text & "='" & TextBox1.Text & "'"
ListBox1.DataSource = sr
End Sub
’显示你当前正在操作(点击)的单元格:
Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
'Dim i = DataGridView1.CurrentRow.Cells(4).Value '当前行的第5列的数据
'ar = DataGridView1.CurrentRow.Index ’选中的行是第几行?
'Dim i = DataGridView1.Rows(ar).Cells(3).Value()’由i决定的行的数据,可用循环
Dim i = DataGridView1.SelectedCells.Item(1).RowIndex
MsgBox(i)
End Sub