2015-07-10 72 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

相關問題