【问题标题】:OleDb Exception was unhandledOleDb 异常未处理
【发布时间】:2013-10-18 08:56:30
【问题描述】:

在运行此代码时,我似乎遇到了未处理的 OleDb 异常,我真的不明白为什么......

附上代码 谢谢! 詹姆斯

Module DataAccess
    Private Builder As New OleDb.OleDbConnectionStringBuilder With
        {
            .Provider = "Microsoft.ACE.OLEDB.12.0",
            .DataSource = IO.Path.Combine(Application.StartupPath, "Database1.accdb")
        }
    ''' <summary>
    ''' Used to remove the current item selected in the txtFirstName text box.
    ''' </summary>
    ''' <param name="Name"></param>
    ''' <remarks></remarks>
    Public Sub RemmoveFemale(ByVal Name As String)
        Using cn As New OleDb.OleDbConnection With
                {
                    .ConnectionString = Builder.ConnectionString
                }
            Using cmd As New OleDb.OleDbCommand With {.Connection = cn}
                cmd.CommandText =
                    <SQL>
                        DELETE FROMCustomerNames WHERE CustomerName = @CustomerName
                    </SQL>.Value

                cmd.Parameters.Add(New OleDb.OleDbParameter With {.DbType = DbType.String, .ParameterName = "@CustomerName", .Value = Name})

                cn.Open()
                Dim Affected As Int32 = cmd.ExecuteNonQuery

            End Using
        End Using
    End Sub
    ''' <summary>
    ''' Called in Form1 on FormClosing event to update the database table if
    ''' needed.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <remarks></remarks>
    Public Sub UpdateFemaleNames(ByVal sender As AutoCompleteStringCollection)
        Dim NewNames As New List(Of String)

        Using cn As New OleDb.OleDbConnection With
                {
                    .ConnectionString = Builder.ConnectionString
                }
            Using cmd As New OleDb.OleDbCommand With {.Connection = cn}
                cmd.CommandText =
                    <SQL>
                        SELECT CustomerName
                        FROM CustomerNames
                        WHERE CustomerName = @CustomerName
                    </SQL>.Value

                cmd.Parameters.Add(New OleDb.OleDbParameter With {.DbType = DbType.String, .ParameterName = "@CustomerName"})

                cn.Open()

                For x As Int32 = 0 To sender.Count - 1
                    cmd.Parameters("@CustomerName").Value = sender.Item(x)
                    Dim Result As String = CStr(cmd.ExecuteScalar)
                    If String.IsNullOrWhiteSpace(Result) Then
                        NewNames.Add(sender.Item(x))
                    End If
                Next

                If NewNames.Count > 0 Then
                    cmd.CommandText =
                        <SQL>
                                INSERT INTO CustomerNames (CustomerName,Gender) VALUES (@CustomerNamee,@Gender)
                            </SQL>.Value

                    cmd.Parameters.Add(New OleDb.OleDbParameter With {.DbType = DbType.String, .ParameterName = "@Gender", .Value = "Female"})

                    For Each Item In NewNames
                        cmd.Parameters("@CustomerName").Value = Item
                        cmd.ExecuteReader()
                    Next

                End If

            End Using
        End Using
    End Sub
    ''' <summary>
    ''' Used in Form1 DataGridView1 for learning purposes only
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function AllFemaleNames() As DataTable
        Dim dt As New DataTable
        Using cn As New OleDb.OleDbConnection With
                {
                    .ConnectionString = Builder.ConnectionString
                }
            Using cmd As New OleDb.OleDbCommand With {.Connection = cn}
                cmd.CommandText =
                    <SQL>
                        SELECT Identifier, CustomerName
                        FROM CustomerNames
                        WHERE Gender = 'Female'
                        ORDER BY CustomerName;
                    </SQL>.Value

                cn.Open()

                dt.Load(cmd.ExecuteReader)

            End Using
        End Using

        Return dt
    End Function
    ''' <summary>
    ''' Load only female first names into the auto complete source
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function LoadFemaleNames() As AutoCompleteStringCollection
        Dim TheNameList As New AutoCompleteStringCollection


        Using cn As New OleDb.OleDbConnection With
                {
                    .ConnectionString = Builder.ConnectionString
                }
            Using cmd As New OleDb.OleDbCommand With {.Connection = cn}
                cmd.CommandText =
                    <SQL>
                        SELECT CustomerName
                        FROM CustomerNames
                        WHERE Gender = 'Female'
                        ORDER BY CustomerName;
                    </SQL>.Value

                cn.Open()
                Dim Reader As OleDb.OleDbDataReader = cmd.ExecuteReader

                If Reader.HasRows Then
                    While Reader.Read
                        TheNameList.Add(Reader.GetString(0))
                    End While

                    Reader.Close()

                End If

            End Using
        End Using

        Return TheNameList

    End Function

End Module








Module StringExtensions
    <Runtime.CompilerServices.Extension()> _
    Public Function ProperCase(ByVal sender As String) As String
        Dim TI As System.Globalization.TextInfo = New System.Globalization.CultureInfo("en-US", False).TextInfo
        Return TI.ToTitleCase(sender.ToLower)
    End Function
End Module







''' <summary>
''' Simple demo for auto complete adding items that are not in the list when pressing ENTER in TextBox1.
''' </summary>
''' <remarks></remarks>
Public Class Form1
    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        UpdateFemaleNames(txtFirstName.AutoCompleteCustomSource)
    End Sub
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        txtFirstName.AutoCompleteMode = AutoCompleteMode.SuggestAppend
        txtFirstName.AutoCompleteSource = AutoCompleteSource.CustomSource
        txtFirstName.AutoCompleteCustomSource = LoadFemaleNames()
        ' The next two lines are for demo purposes only to see what is in the list for the TextBox with First names
        DataGridView1.DataSource = AllFemaleNames()
        DataGridView1.Columns("CustomerName").AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
    End Sub
    Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles txtFirstName.KeyDown
        If e.KeyCode = Keys.Enter Then
            If Not String.IsNullOrWhiteSpace(txtFirstName.Text) Then
                If Not txtFirstName.AutoCompleteCustomSource.Contains(txtFirstName.Text.ToLower) Then
                    txtFirstName.AutoCompleteCustomSource.Add(txtFirstName.Text.ProperCase)
                End If

                txtFirstName.Text = txtFirstName.Text.ProperCase

                e.SuppressKeyPress = True

            End If
        End If
    End Sub
    Private Sub cmdRemoveName_Click(sender As Object, e As EventArgs) Handles cmdRemoveName.Click
        If Not String.IsNullOrWhiteSpace(txtFirstName.Text) Then
            Dim CurrentName As String = txtFirstName.Text.Trim.ProperCase
            If My.Dialogs.Question(String.Format("Remove '{0}'", CurrentName)) Then
                RemmoveFemale(CurrentName)
                txtFirstName.AutoCompleteCustomSource.Remove(txtFirstName.Text)
                txtFirstName.Text = ""
            End If
        End If
    End Sub
End Class

【问题讨论】:

  • 请澄清您的要求。错误发生在哪里?异常消息说什么?您发布了一堵代码墙,但没有对正在发生的事情或您尝试解决的问题进行任何真正的解释。
  • 您好,当我尝试调试代码时出现错误,它运行时出现 1 个错误,说明:未处理 OleDb 异常。 System.Data.dll 中发生“System.Data.OleDb.OleDbException”类型的未处理异常附加信息:没有为一个或多个必需参数提供值。我已经扫描了代码并对照代码上的 CustomerName 字段检查了 MDB 的表和字段名称
  • Visual Studio 通常会自动停在导致错误的行。你知道哪条线路可能导致问题。您的代码中有十几个可能导致此问题的实例。有关如何在 Visual Studio 中进行调试的基本指南,请参阅文章 - codeproject.com/Articles/79508/…。如果可以,请确定行和错误消息。
  • 嗨,Kami。所有错误对话框给我的是{“没有为一个或多个必需参数提供值。”},我真的看不到它在代码中的位置,当我遇到它之前它通常会识别代码中的位置错误是,所以我可以解决它。如果我将文件上传到 skydrive 会有帮助吗?
  • 文件位于:skydrive.live.com/… - 命名为 Project1

标签: vb.net oledb


【解决方案1】:

如果没有确切的错误位置,就很难确定问题的根源。

但是,鉴于错误消息,您的一个或多个语句似乎包含未提供的参数。以下代码

If NewNames.Count > 0 Then
    cmd.CommandText =
        <SQL>
             INSERT INTO CustomerNames (CustomerName,Gender) VALUES (@CustomerNamee,@Gender)
        </SQL>.Value

    cmd.Parameters.Add(New OleDb.OleDbParameter With {.DbType = DbType.String, .ParameterName = "@Gender", .Value = "Female"})

    For Each Item In NewNames
        cmd.Parameters("@CustomerName").Value = Item
        cmd.ExecuteReader()
    Next

End If

客户参数的名称拼写为@CustomerNamee。调整这些或将 if 语句更改为类似

If NewNames.Count > 0 Then
    cmd.CommandText =
        <SQL>
             INSERT INTO CustomerNames (CustomerName,Gender) VALUES (@CustomerName,@Gender)
        </SQL>.Value

    For Each Item In NewNames
        cmd.Parameters("@CustomerName").Value = Item
        cmd.Parameters("@Gender").Value = "Female";
        cmd.ExecuteReader()
    Next
End If

【讨论】:

  • 我 Kami,这对代码没有任何影响,我已经上传了 Visual Studio 识别错误的屏幕截图,:skydrive.live.com/…
  • @user2893909 该屏幕截图似乎表明代码的不同部分存在错误。你能确认连接字符串是否有效吗?并且该表存在。此外,如果您单击异常框中的“查看详细信息”,它将为您提供有关实际错误的更多信息。
  • 是的,该表存在我已经根据代码检查了名称,查看详细信息的屏幕截图:skydrive.live.com/…,论坛建议打开实时聊天,而不是通过论坛进行对话,这对您有用吗?谢谢詹姆斯
  • @user2893909 您是否尝试过直接针对数据库运行查询?
  • 我不知道该怎么做?我使用 Microsoft Access 作为 B/E
【解决方案2】:

从一开始,我就在您的代码中看到了这一行,这会导致该错误:

DELETE FROMCustomerNames WHERE CustomerName = @CustomerName

应该是这样的:

DELETE FROM CustomerNames WHERE CustomerName = @CustomerName

FROM 和 CustomerNames 之间没有空格

【讨论】:

  • 请参阅我的答案中的 cmets。问题似乎出在表单加载上。
  • @kami 在获取他们的数据库并尝试自己运行查询后想通了。请参阅我的其他答案。
  • 我已经解决了这个问题,这是代码中的一行,错过了与桌子上的描述匹配的问题,感谢您的帮助,Steve 和 Kami
【解决方案3】:

在您的 SQL 中:

SELECT CustomerName
FROM CustomerNames
WHERE Gender = 'Female'
ORDER BY CustomerName;

您引用了一个不存在的列。 Access 认为您正在要求一个参数,而您不是,因此您会收到您提到的错误。试试这个:

SELECT CustomerNames
FROM CustomerNames
WHERE Gender = 'Female'
ORDER BY CustomerNames;

用相同的名称命名字段和表或任何其他对象是个坏主意。这是有经验的,但你必须相信我。

【讨论】:

  • 嘿@Steve 感谢您的回复,我感谢您的支持,当然也相信所提供的指导。我已经修改了代码的两个部分,但仍然出现错误。还有其他想法吗?如果它有助于参考,我已将项目上传到 skydrive 上?再次感谢詹姆斯
  • 我知道它在天空驱动器上。那就是我如何发现问题并使用我发布的代码修复它。仔细检查您的字段名称(在选择和 ORDER BY 中。
猜你喜欢
  • 2013-10-30
  • 2013-05-26
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多