0

我得到一个作为异常错误的 catch exp,其中说数据源是无效类型,它必须是 IListSource、IEnumerable 或 IDataSource 类型。

当我尝试通过gridview向数据库添加新记录时出现此错误,因此我将数据库中的数据很好地获取到此gridview中,因此我不明白当数据库不可用时我得到一个catch exp作为异常。@thesli_number OleDbType.VarChar Value = thenumber 是数据库中的数字类型。

 'Add new record to DB
Protected Sub AddNewTask(ByVal sender As Object, ByVal e As EventArgs)
    Dim thecat As String = DirectCast(GridView1.FooterRow.FindControl("txttestcat"), TextBox).Text
    Dim theinfo As String = DirectCast(GridView1.FooterRow.FindControl("txttestinfo"), TextBox).Text
    Dim thenumber As String = DirectCast(GridView1.FooterRow.FindControl("txttestnumber"), TextBox).Text

    Dim strSQL As String = ""
    strSQL = "" & _
    "INSERT INTO [TableTest] " & _
    "([test_cat], [test_info], [test_number])" & _
    "VALUES (@thesli_cat, @thesli_info, @thesli_number)"

    Using conn As New OleDbConnection(ConfigurationManager.ConnectionStrings("MyConnStr").ConnectionString)
        Try
            conn.Open()
            Dim cmd As New OleDbCommand(strSQL, conn)
            cmd.CommandType = CommandType.Text
            cmd.Parameters.Add("@thesli_cat", OleDbType.VarChar).Value = thecat
            cmd.Parameters.Add("@thesli_info", OleDbType.VarChar).Value = theinfo
            cmd.Parameters.Add("@thesli_number", OleDbType.VarChar).Value = thenumber
            GridView1.DataSource = cmd
            GridView1.DataBind()
            'MsgBox("Row(s) Added !! ")
        Catch exp As OleDbException
            If True Then
                MsgBox("Error trying to add current record. " & vbCrLf & "Error: " & exp.Message & "Database Error", MsgBoxStyle.OkOnly, MsgBoxStyle.Critical)
            End If
        Catch exp As Exception
            If True Then
                MsgBox("Error the Database can be unavailable atm. " & vbCrLf & "Error: " & exp.Message & "Database Error", MsgBoxStyle.OkOnly, MsgBoxStyle.Information)
            End If
        End Try
    End Using
End Sub

编辑……………………编辑………………………………………………………………………………………………………………………………编辑.....编辑

好的,我现在可以将数据添加到 gridview,我可以删除一条记录,也可以添加一条新记录。但是我不能让更新事件工作,你能看到这个新代码有什么问题吗!?

    'Update record
Protected Sub UpdateTask(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs)
    Dim theid = Convert.ToInt32(DirectCast(GridView1.FooterRow.FindControl("lbltestid"), Label).Text)
    Dim thecat As String = DirectCast(GridView1.FooterRow.FindControl("lbltestcat"), Label).Text
    Dim theinfo As String = DirectCast(GridView1.FooterRow.FindControl("lbltestinfo"), Label).Text
    Dim thenumber As String = DirectCast(GridView1.FooterRow.FindControl("lbltestnumber"), Label).Text

    Dim strSQL As String = ""
    strSQL = "" & _
    "UPDATE [TableTest] " & _
    "SET [test_cat] = @thesli_cat, [test_info] = @thesli_info, [test_number] = @thesli_number " & _
    "WHERE [test_id] = @thesli_id"

    Using conn As New OleDbConnection(ConfigurationManager.ConnectionStrings("MyConnStr").ConnectionString)
        Try
            conn.Open()
            Dim cmd As New OleDbCommand(strSQL, conn)
            cmd.CommandType = CommandType.Text
            cmd.Parameters.Add("@thesli_id", OleDbType.Integer).Value = theid
            cmd.Parameters.Add("@thesli_cat", OleDbType.VarChar).Value = thecat
            cmd.Parameters.Add("@thesli_info", OleDbType.VarChar).Value = theinfo
            cmd.Parameters.Add("@thesli_number", OleDbType.Integer).Value = thenumber
            cmd.ExecuteNonQuery()
            'MsgBox("Row(s) Updated !! ")
            GridView1.EditIndex = -1
            GetRecords()
        Catch exp As OleDbException
            If True Then
                MsgBox("Error trying to add current record. " & vbCrLf & "Error: " & exp.Message & "Database Error", MsgBoxStyle.OkOnly, MsgBoxStyle.Critical)
            End If
        Catch exp As Exception
            If True Then
                MsgBox("Error the Database can be unavailable atm. " & vbCrLf & "Error: " & exp.Message & "Database Error", MsgBoxStyle.OkOnly, MsgBoxStyle.Information)
            End If
        End Try
    End Using
End Sub
4

1 回答 1

0

如果您的原始问题的答案在我上面的评论中得到了回答(在下面的引号中发布),那么您应该将此问题标记为已回答,然后发布一个全新的问题,以便您获得更准确的回复。这个问题不再适用于您的实际问题。

我的回答在您的评论中解决了您最初的问题:

该示例(参考您上面评论中的链接)没有直接将 OleDbCommand分配给 DataSource,因为它不能。如果您查看示例,作者将 cmd 变量传递给 GetData 函数 GetData(cmd),该函数很可能会执行存储过程并返回 DataSource 支持的类型(例如 IListSource、IEnumerable 或 IDataSource)。

于 2012-09-20T14:35:49.070 回答