2013-10-18 29 views
1

我似乎這段代碼運行時得到一個OleDb的例外是未處理的,我真的不能明白爲什麼...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

請說明你的要求。錯誤發生在哪裏?什麼是異常消息說?你已經發布了一段代碼,沒有任何真正的解釋,或者你試圖解決它。 – Kami

+0

嗨它當我嘗試調試代碼我得到的錯誤,它運行1錯誤說:這是一個OleDb異常未處理。類型「System.Data.OleDb.OleDbException」的未處理的異常在System.Data.dll中發生 其它信息:沒有用於一個或多個必需參數給定值。我已經掃描了代碼並檢查了代碼 – James

+0

上的客戶名字段的MDB的表和字段名稱。Visual Studio通常會自動停止在導致錯誤的行。你知道哪條線可能導致問題。代碼中有十多個實例可能導致此問題。看到這篇文章時 - http://www.codeproject.com/Articles/79508/Mastering-Debugging-in-Visual-Studio-2010-A-Beginn - 關於如何在Visual Studio調試的基本指南。如果可以,請確定該行和錯誤消息。 – Kami

回答

0

沒有錯誤的確切位置是很難找出問題的根源所在源自。

然而,鑑於該錯誤消息似乎像一個或一個以上的語句包含不再提供參數。以下代碼

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 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 
+0

我Kami,這沒有任何區別的代碼,我上傳了Visual Studio標識錯誤的屏幕截圖:https://skydrive.live.com/redir?resid=64360DBD4BB0A8FC!118&authkey=!AFbaCt086KzcY5c&v=3 – James

+0

@ user2893909該屏幕截圖似乎在代碼的不同部分顯示錯誤。你能否確認連接字符串是否有效;並且該表存在。此外,如果您單擊異常框中的「查看詳細信息」,它將爲您提供有關錯誤實際情況的更多信息。 – Kami

+0

是的表格存在我已經檢查了代碼的名稱,查看detials的Screensnap:https://skydrive.live.com/redir?resid=64360DBD4BB0A8FC!119&authkey=!AJNteqTsaQG97AY&v=3,論壇建議開啓實時聊天,通過論壇交談會不會與你一起工作?感謝James – James

0

右鍵改變if語句的東西,我看到你的這行代碼,這將導致該錯誤:

DELETE FROMCustomerNames WHERE CustomerName = @CustomerName 

它應該是這樣的:

DELETE FROM CustomerNames WHERE CustomerName = @CustomerName 

沒有從和CustomerNames

+0

在我的答案上看到評論。問題似乎是在表單加載。 – Kami

+0

@kami在獲取他們的數據庫並嘗試自己運行查詢後找出它。看到我的其他答案。 – Steve

+0

我已經解決了這個問題,它是代碼中的一行,無法匹配表格上的描述,感謝您的幫助,Steve和Kami – James

0

在SQL之間沒有空格:

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

您引用了一個不存在的列。 Access認爲你在詢問一個參數,而你並不是這樣,所以你得到了你提到的錯誤。試試這個:

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

這是一個壞主意,名字字段和表,或與此有關的任何其他對象,具有相同的名稱。這帶有經驗,但你必須相信我。

+0

Hey @Steve謝謝您的回覆,我很欣賞支持,當然也相信指導給出。我已經修改了代碼的兩個部分,但仍然出現錯誤。任何其他想法?如果它有助於參考,我已將項目上傳到skydrive?再次感謝James – James

+0

我知道這是在天空驅動。我如何找到問題並使用我發佈的代碼進行修復。仔細檢查你的字段名稱(都在select和** ORDER BY **中。 – Steve