2015-07-10 74 views
-1

当我运行VB凸出这条消息提示。[的Visual Basic 2010]从类型“DBNull的”转换到类型“串”是无效的

转换到类型“串”无效

Imports System.Data.OleDb 

Public Class frmBooks 
    Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data_ Source=G:\MINI PRIJECT ATI\LIBRARY SYSTEM.accdb;") 

    Dim cmd As New OleDbCommand 
    Dim selectedBookId As Integer 
    Dim selectedClassId As String 
    Dim selectedBookClass As String 
    Dim selectedBookName As String 
    Dim selectedISBN As String 
    Dim selectedPublisher As String 
    Dim selectedAuthor As String 
    Dim selectedPublishYear As String 
    Dim selectedEditn As Integer 
    Dim selectedBookPrice As String 
    Dim selectedAvailability As String 
    Dim selectedShelfNo As String 

    Private Sub ClearControls() 
     txtBookId.Text =String.Empty 
     txtClassId.Text = String.Empty 
     cmbBookclass.Text = String.Empty 
     txtBookname.Text = String.Empty 
     txtISBN.Text = String.Empty 
     txtPublisher.Text = String.Empty 
     txtAuthor.Text = String.Empty 
     txtPublishYear.Text = String.Empty 
     txtEditn.Text = String.Empty 
     txtBookprice.Text = String.Empty 
     cmbAvailability.Text = String.Empty 
     txtShelfNo.Text = String.Empty 

    End Sub 



    Private Sub frmBooks_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     'TODO: This line of code loads data into the 'LIBRARY_SYSTEMDataSet.LIBRARY__BOOK_Query' table. You can move, or remove it, as needed. 
     Me.LIBRARY__BOOK_QueryTableAdapter.Fill(Me.LIBRARY_SYSTEMDataSet.LIBRARY__BOOK_Query) 
     LoadGrid(selectedBookId, selectedClassId, selectedBookClass, selectedBookName, selectedISBN, selectedPublisher, selectedAuthor, selectedPublishYear, selectedEditn, selectedBookPrice, selectedAvailability, selectedShelfNo) 

    End Sub 

    Private Sub SetControlValues() 

     txtBookId.Text = selectedBookId 
     txtClassId.Text = selectedClassId 
     cmbBookclass.Text = selectedBookClass 
     txtBookname.Text = selectedBookName 
     txtISBN.Text = selectedISBN 
     txtPublisher.Text = selectedPublisher 
     txtAuthor.Text = selectedAuthor 
     txtPublishYear.Text = selectedPublishYear 
     txtEditn.Text = selectedEditn 
     txtBookprice.Text = selectedBookPrice 
     cmbAvailability.Text = selectedAvailability 
     txtShelfNo.Text = selectedShelfNo 

    End Sub 



    Private Sub EnableControls(isEnable As Boolean) 
     txtBookId.Enabled = isEnable 
     txtClassId.Enabled = isEnable 
     cmbBookclass.Enabled = isEnable 
     txtBookname.Enabled = isEnable 
     txtISBN.Enabled = isEnable 
     txtPublisher.Enabled = isEnable 
     txtAuthor.Enabled = isEnable 
     txtPublishYear.Enabled = isEnable 
     txtEditn.Enabled = isEnable 
     txtBookprice.Enabled = isEnable 
     cmbAvailability.Enabled = isEnable 
     txtShelfNo.Enabled = isEnable 
     btnSaved.Enabled = isEnable 
     btnSearch.Enabled = isEnable 


    End Sub 



    Private Sub dgvBooks_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles dgvBooks.SelectionChanged 

     Try 
      EnableControls(False) 
      If dgvBooks.SelectedCells.Count > 0 Then 
       Dim selectedRawIndex As Integer = dgvBooks.SelectedCells(0).RowIndex 
       Dim selectedRow As DataGridViewRow = dgvBooks.Rows(selectedRawIndex) 

       selectedBookId = selectedRow.Cells(colBookID.Name).Value 
       selectedClassId = selectedRow.Cells(colClassId.Name).Value 
       selectedBookClass = selectedRow.Cells(colBookClass.Name).Value 
       selectedBookName = selectedRow.Cells(colBookName.Name).Value 
       selectedISBN = selectedRow.Cells(colISBN.Name).Value 
       selectedAuthor = selectedRow.Cells(colAuthor.Name).Value 
       selectedPublishYear = selectedRow.Cells(colPublishYear.Name).Value 
       selectedBookPrice = selectedRow.Cells(colBookPrice.Name).Value 
       selectedAvailability = selectedRow.Cells(colAvailability.Name).Value 
       selectedShelfNo = selectedRow.Cells(colShelfNo.Name).Value 

       SetControlValues() 

      End If 
     Catch ex As Exception 
      MsgBox(ex.Message) 

     End Try 

    End Sub 


    Private Sub btnRefresh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefresh.Click 
     ClearControls() 
     LoadGrid() 
    End Sub 

    Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click 
     LoadGrid(txtBookId.Text, txtClassId.Text, cmbBookclass.Text, txtBookname.Text, txtISBN.Text, txtPublisher.Text, txtAuthor.Text, txtPublishYear.Text, txtEditn.Text, txtBookprice.Text, cmbAvailability.Text, txtShelfNo.Text) 

    End Sub 


    Private Sub btnSaved_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaved.Click 
     Dim ds As New DataSet 
     Dim da As New OleDbDataAdapter 
     Dim sqlStatement As String = "" 
     Dim statusMsg As String = "" 

     EnableControls(False) 
     Try 
      con.Open() 
      cmd.Connection = con 

      If selectedBookId = -1 Then 
       sqlStatement = " INSERT INTO LIBRARY_BOOK (Book ID,Book Class Id,Book Class,Book Name,ISBN -10,Publisher,Author,Publishing Year,Edition,Price,Shelf Number,Availability3) VALUES('" + txtBookId.Text + "','" + txtClassId.Text + "','" + cmbBookclass.Text + "','" + txtBookname.Text + "','" + txtISBN.Text + "','" + txtPublisher.Text + "','" + txtAuthor.Text + "','" + txtPublishYear.Text + "','" + txtEditn.Text + "','" + txtBookprice.Text + "','" + txtShelfNo.Text + "','" + cmbAvailability.Text + "')" 
       statusMsg = "A new book has added! " 
      ElseIf selectedBookId > -1 Then 
       sqlStatement = "UPDATE BOOK SET Book_ID='" + txtBookId.Text + "',Book Class_Id='" + txtClassId.Text + "',Book_Class='" + cmbBookclass.Text + "',Book_Name='" + txtBookname.Text + "',ISBN_-10='" + txtISBN.Text + "',Publisher='" + txtPublisher.Text + "',Author='" + txtAuthor.Text + "',Publishing_Year='" + txtPublishYear.Text + "',Edition='" + txtEditn.Text + "',Price='" + txtBookprice.Text + "',Shelf_Number='" + txtShelfNo.Text + "',Availability3='" + cmbAvailability.Text + "' WHERE = " + selectedBookId.ToString 
       statusMsg = "BOOK " + selectedBookName + " has updated!" 
      End If 

      If Not String.IsNullOrEmpty(sqlStatement) Then 
       cmd.CommandText = sqlStatement 
       cmd.ExecuteNonQuery() 
      End If 



     Catch ex As Exception 
      MsgBox(ex.Message) 
     Finally 
      con.Close() 

      LoadGrid() 
      MsgBox(statusMsg) 
     End Try 
    End Sub 






    Private Sub btnEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEdit.Click 
     EnableControls(True) 
    End Sub 

    Private Sub btnAddnw_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddnw.Click 
     EnableControls(True) 
     ClearControls() 
     txtBookId.Focus() 
     selectedBookId = -1 
    End Sub 

    Private Sub LoadGrid(Optional ByVal bookId As String = "", Optional ByVal classId As String = "", Optional ByVal bookClass As String = "", Optional ByVal bookName As String = "", Optional ByVal isbn As String = "", Optional ByVal publisher As String = "", Optional ByVal author As String = "", Optional ByVal publishingYear As String = "", Optional ByVal edition As String = "", Optional ByVal bookPrice As String = "", Optional ByVal shelfNo As String = "", Optional ByVal availability As String = "") 

     Dim ds As New DataSet 
     Dim da As New OleDbDataAdapter 
     Dim sqlStatement As String 

     Try 
      dgvBooks.AutoGenerateColumns = False 
      EnableControls(False) 
      con.Open() 

      cmd.Connection = con 
      sqlStatement = "SELECT * FROM LIBRARY_BOOK WHERE (Book ID LIKE '%" + bookId + "%') AND (Class ID LIKE '%" + classId + "%') AND (Book Class LIKE '%" + bookClass + "%') AND (Book Name LIKE '%" + bookName + "%') AND (ISBN LIKE '%" + isbn + "%') AND (Publisher LIKE '%" + publisher + "%')AND (Author LIKE '%" + author + "%') AND (Publish Year LIKE '%" + publishingYear + "%') AND (Edition LIKE '%" + edition + "%') AND (Price LIKE '%" + bookPrice + "%') AND (Shelf No LIKE '%" + shelfNo + "%') AND (Availability3 LIKE '%" + availability + "%')" 
      cmd.CommandText = sqlStatement 

      da = New OleDbDataAdapter(cmd) 
      da.Fill(ds, "LIBRARY BOOK") 

      If ds.Tables.Count > 0 AndAlso ds.Tables(0).Rows.Count > 0 Then 
       dgvBooks.DataSource = ds.Tables(0) 
      End If 
     Catch ex As Exception 
      MsgBox(ex.Message) 

     Finally 
      con.Close() 
     End Try 




    End Sub 


End Class 

回答

2

如果崩溃的负载情况下我会一个异常处理程序添加到负载形式发生的事情。然后用F10进行操作。 您应该能够识别导致异常的值。您可能必须初始化一些值,以便在查询返回空数据时它不会返回零。 例如,您可以将Dim bookname说成string =“”,稍后将数据分配给它。然后字符串是“”而不是什么。

编辑:

我建议你用选项编码严格的(添加选项严格上您的.vb文件 我碰到你的代码一些警告的顶部,因为你有没有明确规定了一些数据类型

要调试代码,改变负载功能,以这样的:。

 Try 
     Me.LIBRARY__BOOK_QueryTableAdapter.Fill(Me.LIBRARY_SYSTEMDataSet.LIBRARY__BOOK_Query) 
     LoadGrid(selectedBookId, selectedClassId, selectedBookClass, selectedBookName, selectedISBN, selectedPublisher, selectedAuthor, selectedPublishYear, selectedEditn, selectedBookPrice, selectedAvailability, selectedShelfNo) 

    Catch ex As Exception 
     MsgBox("load exception " & vbCrLf & ex.Message) 
    End Try 

您又将光标在“尝试”,然后按STRG + F10的前它会执行直到它到达断点。然后,您可以浏览代码并查看采取的每个步骤。所以你可以通过所有的变量赋值“F10”,直到发生异常。

但是我不能做更多,我没有你拥有的所有数据。但我认为你有一个很好的基础去继续,自己分析问题,并在最后成功:)

+0

谢谢你的快速。因为我刚接触VB,可以告诉我如何做到这一点。请编辑我的编码。 – CsJ

相关问题