我有一个带有 DataGridView 和一个按钮的表单。他们正在与 Access (.mdb
) 数据库进行交互。单击按钮时,我希望它更新表中的数据。
我收到以下错误:
<块引用>“OleDbConnection”类型的值无法转换为 'SqlConnection'。
我的代码:
Imports System.Data.OleDb
Imports System.Data.SqlClient
Public Class Form1
Public conn As New OleDbConnection
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim DS As New DataSet
Dim DT As New DataTable
DS.Tables.Add(DT)
Dim objConn As String = "Provider=Microsoft.JET.OLEDB.4.0; Data Source = Swiftest.mdb"
conn.ConnectionString = objConn
Dim objDA As New OleDb.OleDbDataAdapter("SELECT * FROM tblOptions", conn)
objDA.Fill(DT)
DataGridView1.DataSource = DT.DefaultView
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim SqlQuery As String = "'UPDATE tblOptions Set fldShow = '1' WHERE fldID = '13'"
conn.Open()
Dim com As New SqlCommand(SqlQuery, conn)
End Sub
End Class
感谢阅读
答案 0 :(得分:0)
几个可用的数据库对象是 ADO.net 有 .Dispose
方法。如果对象具有 dispose 方法,则它可能正在使用非托管资源(.net 框架之外的资源)。这些对象需要释放这些资源,它们在 dispose 方法中执行此操作。幸运的是,.net 语言提供了 Using...End Using
块,即使出现错误也能保证调用 .Dispose
。
鉴于此,在使用它们的 Sub
或 Function
中创建您的数据库对象,以便它们可以包含在 Using
块中。请注意连接 Using
行末尾的逗号。这表明下一行的对象(命令)包含在同一个 Using
块中。
在您的 Form.Load
事件中,您从未使用过适配器或数据集。只需加载数据表。
在最后可能的时刻打开连接,直接在 .Execute...
之前,并立即用 End Using
关闭。在您的 Button1.Click
事件中,您打开一个连接,从不执行任何操作,也从不关闭它。
在您的更新命令中,您将文字提供为 String
。通常,ID 字段是 Integer
。检查数据库中字段的数据类型。如果您想提供不是文字的值,请使用参数。
Private connStr As String = "Provider=Microsoft.JET.OLEDB.4.0; Data Source = Swiftest.mdb"
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim DT As New DataTable
Using conn As New OleDbConnection(connStr),
cmd As New OleDbCommand("SELECT * FROM tblOptions", conn)
conn.Open()
Using reader = cmd.ExecuteReader
DT.Load(reader)
End Using
End Using
DataGridView1.DataSource = DT.DefaultView
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Using conn As New OleDbConnection(connStr),
cmd As New OleDbCommand("UPDATE tblOptions Set fldShow = '1' WHERE fldID = '13'", conn)
conn.Open()
cmd.ExecuteNonQuery()
End Using
End Sub