2016-08-12 71 views
0
  1. 我認爲這是我在創建報表後關閉水晶報表時顯示的錯誤。如何解決此問題:從DBNull類型到字符串類型的轉換無效

    Private Sub Populate(id As Integer, perdate As Date, controlnum As String, establishmentname As String, fname As String, mname As String, lname As String, address As String, pertype As String, ornum As String, amntpd As String, datepd As Date) 
    
    Dim row As String() = New String() {id, perdate, controlnum, establishmentname, fname, mname, lname, address, pertype, ornum, amntpd, datepd} 
    
    DataGridView1.Rows.Add(row) 
    
    End Sub 
    

這是

Private Sub retrieve() 
    DataGridView1.Rows.Clear() 
    sql = "SELECT * FROM tblfsesmis" 


    Try 
     Using con 
      con.Open() 
      cmd = New MySqlCommand(sql, con) 
      adapter = New MySqlDataAdapter(cmd) 

      adapter.Fill(dt) 

      For Each row In dt.Rows 
       'It's in your Populate function that you want to check the DBNull values 
       Populate(row(0), row(1), row(2), row(3), row(4), row(5), row(6), row(7), row(8), row(9), row(10), row(11)) 
      Next 

      dt.Rows.Clear() 
      DataGridView1.Refresh() 
     End Using 'con Object will be disposed automatically 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

End Sub 

你能幫助我在從我的數據庫(MySQL數據庫)獲取數據到數據網格視圖代碼是如何來解決這個問題?請 !謝謝

+0

爲什麼不將數據表設置爲datagridview的數據源? DatagridView1.DataSource = dt並刪除對dt.rows.clear的調用 –

+0

我會在哪裏將'DatagridView1.DataSource = dt' – LecheDeCrema

+0

我只是將數據源設置爲像Noob提到的那樣。或者另一種選擇是選擇你的列並用'ISNULL'包圍它們並用一個空字符串替換它... – Codexer

回答

0

如果您的應用程序不支持字段的空值,那麼修改您的查詢,以便空值不能出現。

所以不是:SELECT * FROM tblfsesmis

使用SELECT Id, PerDate, IsNull(ControlNum, '') .... FROM tblfsesmis

IsNull將用您選擇的默認值替換空值。

另外,您可以在代碼上這可能是空的每個字段像

Dim result = If(Convert.IsDBNull(val), "", val)解決這個問題。

但是正如註釋中指出的那樣,您似乎並不需要將這些值轉換爲字符串。所以只需將數據表直接分配給數據源即可。

+0

調用本地函數'IsNull'時的參數計數不正確 – LecheDeCrema

+0

您正在使用哪個數據庫。這應該適用於SqlServer。 MySql和其他人使用IfNull – FloatingKiwi

+0

MySql數據庫sir – LecheDeCrema

0
Private Sub retrieve() 
sql = "SELECT * FROM tblfsesmis" 


Try 
    Using con 
     con.Open() 
     cmd = New MySqlCommand(sql, con) 
     adapter = New MySqlDataAdapter(cmd) 

     adapter.Fill(dt) 

     DataGridView1.DataSource = dt 
    End Using 'con Object will be disposed automatically 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 

結束子

+0

我試着放DataGridView1.DataSource = dt但它顯示與數據庫中的數據相同的行,但它是空的。爲什麼? – LecheDeCrema

+0

你是什麼意思「它顯示與數據庫中的數據相同的行,但它是空的。」?它是否顯示數據?你的數據庫是否包含數據? –

+0

它現在顯示,但在不同的列 – LecheDeCrema

0

使用DataRow.Field(Of T)擴展方法。
使用DataRow.Field(Of String)(columnIndex)如果值爲DbNull則將返回Nothing/null

Populate(row.Field(Of Integer)(0), row.Field(Of String)(1)) 

如果整數類型的列可以是NULL也一樣,然後用NullableGetValueOrDefault方法

Populate(row.Field(Of Integer?)(0).GetValueOrDefault(), row.Field(Of String)(1)) 

但作爲@ F0r3v3r-A-N00B建議 - 你可以使用DataTable作爲數據源的DataGridView

Private Sub retrieve() 
    Dim sql As String = "SELECT * FROM tblfsesmis" 

    Try 

     Using con As New MySqlConnection(yourConnectionString) 
      con.Open() 

      Using cmd As New MySqlCommand(sql, con) 
       Dim adapter As New MySqlDataAdapter(cmd) 
       Dim dt As New DataTable() 
       adapter.Fill(dt) 

       DataGridView1.DataSource = dt 
      End Using 

     End Using 

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

End Sub 

這樣DataGridView將自動更新。只需檢查DataGridView.AutoGenerateColumns = true(默認情況下爲真)

相關問題