數(shù)日心血,無(wú)私奉獻(xiàn)!
1.解決了很多網(wǎng)友修改后datagridview1之后無(wú)法保存數(shù)據(jù)到數(shù)據(jù)庫(kù)的問(wèn)題!
先導(dǎo)入三個(gè)類,使后文寫代碼時(shí)簡(jiǎn)單,就是省去了包的路徑,可直接用類名
Imports System.Data.SqlClient
Imports System.Data
Imports System.Data.OleDb
Public Class Form1
Dim odCnn As OleDbConnection'定義一個(gè)連接,用于打開(kāi)數(shù)據(jù)庫(kù),以便事先取出表名
Dim odApter As OleDbDataAdapter'定義一個(gè)橋接器,介于內(nèi)存中DataSet表和數(shù)據(jù)庫(kù)之間,任何改變都在內(nèi)存中進(jìn)行,先不做實(shí)質(zhì)性動(dòng)作,直到需要確定了,才回發(fā)給數(shù)據(jù)庫(kù)做實(shí)質(zhì)性改動(dòng)。
Dim dataPath As String'數(shù)據(jù)庫(kù)的路徑,含文件名
Dim passWord As String’數(shù)據(jù)庫(kù)密碼
Dim cnnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data source="‘用于連接的字符串 引擎
Dim selectTabel As String'選定的要打開(kāi)的表,確定后才能打開(kāi)
Dim sqlStr As String’查詢
Dim dataSet As DataSet‘內(nèi)存中的虛擬的數(shù)據(jù)表,表的集合,有架構(gòu)
Dim dataTable As DataTable’表,用于填充網(wǎng)格組件
Dim openFileDlg As OpenFileDialog‘代碼創(chuàng)建的通用打開(kāi)對(duì)話框
Dim dataGridView As DataGridView’用代碼創(chuàng)建的網(wǎng)格
Dim CB As OleDbCommandBuilder‘能自動(dòng)生成保存信息的工具,就是它在后臺(tái)默默無(wú)聞地工作,才能夠在確定之后自動(dòng)完成保存任務(wù):就是網(wǎng)友大為困惑的無(wú)法將DataGridView1中修改的內(nèi)容保存數(shù)據(jù)庫(kù)的問(wèn)題。
Function dlg(ByVal index As Integer) As String’自定義函數(shù),生成并調(diào)用打開(kāi)對(duì)話框,獲取數(shù)據(jù)庫(kù)的路徑
openFileDlg = New OpenFileDialog‘創(chuàng)建實(shí)例 它是隱式的,不用加載到窗體上
With openFileDlg’對(duì)一個(gè)對(duì)象進(jìn)行格式化操作,用With方面,運(yùn)行速度也快
.Title = "張志晨數(shù)據(jù)庫(kù)程序V2012"‘對(duì)話框標(biāo)題,個(gè)性化設(shè)置,可無(wú)。
.Filter = "Aaccess07-10數(shù)據(jù)庫(kù)|*.accdb|access97-03數(shù)據(jù)庫(kù)|*.mdb| 所有類型|*.*"’文件過(guò)濾器
.FilterIndex = index‘默認(rèn)的要顯示的文件類型
.ShowDialog()’顯示打開(kāi)對(duì)話框
Return .FileName‘此函數(shù)有返回值,用Return 返回值并結(jié)束函數(shù)程序運(yùn)行
End With
End Function
'..........調(diào)用打開(kāi)對(duì)話框,獲取數(shù)據(jù)庫(kù)路徑
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = dlg(1)’調(diào)用打開(kāi)對(duì)話框,獲取數(shù)據(jù)庫(kù)路徑
dataPath = Label1.Text‘把路徑給變量,方便使用
passWord = ""’設(shè)置密碼,無(wú)則空
cnnStr = cnnStr & dataPath & ";JET OLEDB:Database Password=" & passWord‘構(gòu)成完成的連接
odCnn = New OleDbConnection(cnnStr)’創(chuàng)建連接器實(shí)例
odCnn.Open()‘連接并在后臺(tái)打開(kāi)數(shù)據(jù)庫(kù)
getTableName()’讀取庫(kù)的表名,并彈出窗體顯示表的個(gè)數(shù)
End Sub
'.............................獲取表名的函數(shù)........
Function getTableName()
' 獲取數(shù)據(jù)表列表
'Type 有:"TABLE,VIEW,ACCESS TABLE,SYSTEM TABLE",
Dim dt As DataTable’創(chuàng)建一個(gè)臨時(shí)用的表
Dim i As Integer‘一個(gè)臨時(shí)用的計(jì)數(shù)器
dt = odCnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
New Object() {Nothing, Nothing, Nothing, "TABLE"})’獲取所有的表信息,從中過(guò)濾出用戶創(chuàng)建的表
'DataGridView2.DataSource = dt '.......顯示表的所有信息
For i = 0 To dt.Rows.Count - 1 '記錄數(shù),也就是行數(shù)
ComboBox1.Items.Add(dt.Rows(i).Item("TABLE_NAME"))‘顯示在列表框里
'顯示字段名為 TABLE_NAME 列的行值 就是用戶創(chuàng)建的表的名
Next
ComboBox1.Text = ComboBox1.Items(0) '設(shè)置第一個(gè)表為列表框的值,也就是顯示第一個(gè)表
MsgBox("數(shù)據(jù)庫(kù)中共有" & dt.Rows.Count & "個(gè)表")
End Function
'.....................填充網(wǎng)格 顯示數(shù)據(jù),以便用戶觀察使用.......
Function fillData()
Dim sql As String = "select * from " & selectTabel '建立查詢 字符型
odApter = New OleDb.OleDbDataAdapter(sql, odCnn) '橋接器
dataSet = New DataSet '內(nèi)存中的虛擬數(shù)據(jù)庫(kù)實(shí)例
odApter.Fill(dataSet, "table") '上面的實(shí)例被填充
dataGridView.DataSource = dataSet.Tables("table")’填充
dataGridView.AutoResizeColumns()‘可自動(dòng)生成需要的列
dataGridView.AutoResizeRows()’行自適應(yīng)高度
dataGridView.AutoResizeColumns()’列自適應(yīng)寬度
'獲取字段名,并填充列表
'sqlFm.getField()可以獲取指定的某一個(gè)表的字段,就是列名,列標(biāo)題。
CB = New OleDb.OleDbCommandBuilder(odApter) '用于自動(dòng)記錄你對(duì)數(shù)據(jù)的更改,并形成保存方法備用
If CB Is Nothing Then‘如果上一行自動(dòng)創(chuàng)建失敗,就用下一行的代碼人工創(chuàng)建
CB.DataAdapter = New OleDb.OleDbDataAdapter
odApter.DeleteCommand = CB.DataAdapter.DeleteCommand’刪除數(shù)據(jù)
odApter.InsertCommand = CB.DataAdapter.InsertCommand‘插入數(shù)據(jù)
odApter.UpdateCommand = CB.DataAdapter.UpdateCommand’修改數(shù)據(jù)
End If
MsgBox("共有記錄條數(shù):" & dataSet.Tables("table").Rows.Count, vbOKOnly, "打開(kāi)成功")
End Function
'創(chuàng)建一個(gè)網(wǎng)格
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
dataGridView = New DataGridView‘創(chuàng)建網(wǎng)格實(shí)例
Me.Controls.Add(dataGridView)’顯示對(duì)象
With dataGridView‘定位網(wǎng)格,格式化
.Top = 60
.Left = 0
.Width = Me.Width - 20
.Height = Me.Height - 40 - 60
.Visible = True
End With
End Sub
'打開(kāi)指定的表
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
selectTabel = ComboBox1.Text
fillData()’填充網(wǎng)格
End Sub
'....................保存修改.......................................
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
save_sub()‘調(diào)用下面的函數(shù)
End Sub
'保存數(shù)據(jù)
Function save_sub()
Dim temptb As DataTable’創(chuàng)建一個(gè)臨時(shí)用的表
temptb = dataGridView.DataSource.GetChanges() '獲取更改信息
If temptb IsNot Nothing Then '如果有更改
odApter.Update(dataGridView.DataSource) '就保存更改,在實(shí)質(zhì)上是把網(wǎng)格中的數(shù)據(jù)回發(fā)給數(shù)據(jù)庫(kù)
MsgBox("您的更改已經(jīng)回發(fā)到數(shù)據(jù)庫(kù)!", , "通用數(shù)據(jù)庫(kù)程序")
Else
MsgBox("您沒(méi)有更改任何數(shù)據(jù)!", , "通用數(shù)據(jù)庫(kù)程序")
Exit Function
End If
End Function
End Class
'..............以上為自學(xué)成果,注滿心血,但愿對(duì)網(wǎng)友有用..................................
2012.9.28增補(bǔ):
‘條件查詢(認(rèn)為是對(duì)列進(jìn)行篩選就行)
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
’顯示你當(dāng)前正在操作(點(diǎn)擊)的單元格:
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 '當(dāng)前行的第5列的數(shù)據(jù)
'ar = DataGridView1.CurrentRow.Index ’選中的行是第幾行?
'Dim i = DataGridView1.Rows(ar).Cells(3).Value()’由i決定的行的數(shù)據(jù),可用循環(huán)
Dim i = DataGridView1.SelectedCells.Item(1).RowIndex
MsgBox(i)
End Sub
聯(lián)系客服