vb.net - 为什么我的连接表明它是打开的,但是当我尝试运行它时,错误告诉我连接已关闭?
问题描述
为什么我的连接表明它是打开的,但是当我尝试运行它时,错误告诉我连接已关闭?这是我的代码...
Public Class clsBookDA
Private Shared dcnBooks As New OleDbConnection("Provider=Microsoft.Jet.OLDEB.4.0;DataSource=C:\temp\books.mdb")
Private Shared books As New ArrayList()
Private Shared aBook As clsBook
Private Shared aBookID, anAuthor, aTitle As String
Private Shared aPurchasePrice, aSalePrice As Decimal
Private Shared anInventory As Integer
Public Shared Sub Initialize()
dcnBooks.Open()
End Sub
Public Shared Sub Terminate()
dcnBooks.Close()
dcnBooks.Dispose()
End Sub
Public Shared Function GetAll() As ArrayList
Dim dapBooks As New OleDbDataAdapter()
Dim dtbBooks As New DataTable()
Dim drwBook As DataRow
dapBooks = New OleDbDataAdapter("Select * From Books", dcnBooks)
dapBooks.Fill(dtbBooks)
books.Clear()
For Each drwBook In dtbBooks.Rows
aBookID = drwBook("BookID")
anAuthor = drwBook("Author")
aTitle = drwBook("Title")
aPurchasePrice = drwBook("PurchasePrice")
aSalePrice = drwBook("SalePrice")
anInventory = drwBook("Inventory")
Dim aBook As New clsBook(aBookID, anAuthor, aTitle, aPurchasePrice, aSalePrice, anInventory)
books.Add(aBook)
Next
Return books
End Function
Public Shared Sub Add(ByVal aBook As clsBook)
Dim dapBooks As New OleDbDataAdapter()
Dim sqlQuery As String = "INSERT INTO Books " & " VALUES('" & aBook.BookID & "','" & aBook.BookAU & "','" & aBook.BookTI & "','" & _
aBook.BookPP & "','" & aBook.BookSP & "','" & aBook.BookINV & "')"
dapBooks.UpdateCommand = New OleDbCommand(sqlQuery, dcnBooks)
dapBooks.UpdateCommand.ExecuteNonQuery()<--- **i have a problem on this line. Keeps on telling that the connection is close.**
End Sub
Public Shared Sub Update(ByVal aBook As clsBook)
Dim dapBooks As New OleDbDataAdapter()
Dim sqlQuery As String = "UPDATE Books" & "SET Author='" & aBook.BookAU & "', Title = '" & aBook.BookTI & "', PurchasePrice = '" & _
aBook.BookPP & "', SalePrice = '" & aBook.BookSP & "', Inventory = '" & aBook.BookINV & "'" & "WHERE BookId = '" & aBook.BookID & "'"
dapBooks.UpdateCommand = New OleDbCommand(sqlQuery, dcnBooks)
dapBooks.UpdateCommand.ExecuteNonQuery()
End Sub
Public Shared Sub Delete(ByVal aBook As clsBook)
Dim dapBooks As New OleDbDataAdapter()
Dim sqlQuery As String = "DELETE FROM Books WHERE BookId = '" & aBook.BookID & "'"
dapBooks.UpdateCommand = New OleDbCommand(sqlQuery, dcnBooks)
dapBooks.UpdateCommand.ExecuteNonQuery()
End Sub
End Class
先感谢您。
解决方案
您不想在需要之前打开连接。它们应尽快关闭和处置。Using...End Using
块处理这个。连接确实超时。
始终使用参数来避免 Sql 注入并使编写 sql 语句更容易。检查您的数据库以获取正确的列名和数据类型。在 Access 中,将参数添加到参数集合中的顺序与它们在 sql 语句中出现的顺序相同,这一点很重要。其他提供者可以按名称匹配参数。
我认为您的问题之一是您将数字值放在单引号中。数字没有单引号。单引号表示一个字符串。
通常库存和销售成本在另一个表中维护。存货估价可能取决于 LIFO、FIFO 等,并且商店的价格会随着通货膨胀、供应商和购买数量等因素而变化。
Public Class Book
Public Property ID As Integer
Public Property Author As String
Public Property Title As String
Public Property Price As Decimal
Public Sub New()
End Sub
Public Sub New(BookID As Integer, BookAuthor As String, BookTitle As String, BookPrice As Decimal)
ID = BookID
Author = BookAuthor
Title = BookTitle
Price = BookPrice
End Sub
End Class
Public Class AccessBooksData
Private Shared cnStr As String = "Provider=Microsoft.Jet.OLDEB.4.0;DataSource=C:\temp\books.mdb"
Public Shared Function GetAllBooks() As List(Of Book)
Dim books As New List(Of Book)
Dim dt As New DataTable
Using cn As New OleDbConnection(cnStr),
cmd As New OleDbCommand("Select * Form Books", cn)
dt.Load(cmd.ExecuteReader)
End Using
For Each drwBook As DataRow In dt.Rows
books.Add(New Book(CInt(drwBook("BookID")), CStr(drwBook("Title")), CStr(drwBook("Author")), CDec(drwBook("SalePrice"))))
Next
Return books
End Function
Public Shared Sub Add(ByVal bk As Book)
'I am assuming that ID is an auto-increment field as Primary Key
'Therefore you would not insert a value for that column
Dim sqlQuery As String = "INSERT INTO Books ([Author], [Title], [SalePrice]) VALUES (@Author, @Title, @Price);"
Using cn As New OleDbConnection(cnStr),
cmd As New OleDbCommand(sqlQuery, cn)
With cmd.Parameters
.Add("@Author", OleDbType.VarChar).Value = bk.Author
.Add("@Title", OleDbType.VarChar).Value = bk.Title
.Add("@Price", OleDbType.Decimal).Value = bk.Price
End With
cn.Open()
cmd.ExecuteNonQuery()
End Using
End Sub
Public Shared Sub Update(ByVal aBook As Book)
Dim sqlQuery As String = "UPDATE Books SET Author= @Author, Title = @Title, SalePrice = @Price, WHERE BookId = @ID;"
Using cn As New OleDbConnection(cnStr),
cmd As New OleDbCommand(sqlQuery, cn)
With cmd.Parameters
.Add("@Author", OleDbType.VarChar).Value = aBook.Author
.Add("@Title", OleDbType.VarChar).Value = aBook.Title
.Add("@SalePrice", OleDbType.Decimal).Value = aBook.Price
.Add("@ID", OleDbType.Integer).Value = aBook.ID
End With
cn.Open()
cmd.ExecuteNonQuery()
End Using
End Sub
Public Shared Sub Delete(ByVal aBook As Book)
Using cn As New OleDbConnection(cnStr),
cmd As New OleDbCommand("DELETE FROM Books WHERE BookId = @ID;", cn)
cmd.Parameters.Add("@ID", OleDbType.Integer).Value = aBook.ID
cn.Open()
cmd.ExecuteNonQuery()
End Using
End Sub
End Class
推荐阅读
- python - Python在图例中绘制未对齐的标签和颜色
- android - 数据库输出到 EditText
- ios - Xcode iOS 错误 nw_connection_receive_internal_block_invoke
- c# - 在 VS c# 中添加新项目 UserControl Form 后出错
- kubernetes - 使用 istio 为服务设置指标的指南
- django - 通过 user_id 从数据库中过滤结果
- websocket - 返回 Django 石墨烯订阅中订阅事件的初始数据
- go - 用于公共和私有路由中间件的 httprouter 和 negroni
- r - 特定列的 R 中每个分组变量的gather()
- clojure - 通过顺序调用 main 函数然后在它们之间进行通信来运行两个 clojure 代码