0

我遇到了错误处理问题。通过VB程序,我想将重复键添加到SQL Server 2008 R2表中。我使用下面的代码:Visual Basic尝试捕获重复密钥未捕获

Public Shared Function AddCatPlanilla(ByVal CatPlanilla As CatPlanilla) As Boolean 
    Dim connection As SqlConnection = EnterpriseDB.GetConnection 
    Dim insertStatement As String _ = "INSERT [dbo].[CatPlanilla] " _ 
     & "([CodEmpr], [TipoCatalogo], [CodAsoc], [Descripcion], [DescripcionCorta]) " _ 
     & "VALUES (@CodEmpr, @TipoCatalogo, @CodAsoc, @Descripcion, @DescripcionCorta)" 
    Dim insertCommand As New SqlCommand(insertStatement, connection) 
    insertCommand.CommandType = CommandType.Text 
    insertCommand.Parameters.AddWithValue("@CodEmpr", CatPlanilla.m_CodEmpr) 
    insertCommand.Parameters.AddWithValue("@TipoCatalogo", CatPlanilla.m_TipoCatalogo) 
    insertCommand.Parameters.AddWithValue("@CodAsoc", CatPlanilla.m_CodAsoc) 
    insertCommand.Parameters.AddWithValue("@Descripcion", CatPlanilla.m_Descripcion) 
    insertCommand.Parameters.AddWithValue("@DescripcionCorta", CatPlanilla.m_DescripcionCorta) 

    Try 
     connection.Open() 
     Dim count As Integer = insertCommand.ExecuteNonQuery() 
     If count > 0 Then 
      Return True 
     Else 
      Return False 
     End If 
    Catch ex As SqlException 
     Throw ex 
    Finally 
     connection.Close() 
    End Try 
End Function 

当我要添加重复的键,的SQLException不捕获错误,并在屏幕上显示以下信息(停止程序):

System.Data.SqlClient.SqlException occurred 

Class=14 

ErrorCode=-2146232060 

HResult=-2146232060 

LineNumber=1 

Message=Cannot insert duplicate key row in object 'dbo.CatPlanilla' with unique index 
'IX_CatPlanilla'. The duplicate key value is (001, LT, Lima). 
The statement has been terminated. 

我不知道是什么原因造成的,或者这是SQL Server配置还是Visual Studio配置的问题。

我想强调程序不会跳转到CATCH部分。该计划停止在这一行:“DIM计数为整数= insertCommand.ExecuteNonQuery()” 什么遗憾,我无法发送图片,对不起

+3

您正在抛出异常 - 当您尝试重复键时想要发生什么? – andrewb

+0

我想程序去捕捉部分,但不是,程序停在行说:“Dim count As Integer = insertCommand.ExecuteNonQuery()” – user2705541

回答

1

您的问题是在这行代码

Catch ex As SqlException 
    Throw ex 

这段代码会捕获异常,然后立即重新抛出它。它基本上意味着代码对您的程序没有影响,除了重置堆栈跟踪之外。如果您确实想要捕捉程序并防止它崩溃,那么您需要删除Throw ex行。而是尝试显示一条消息

Catch ex As SqlException 
    MessageBox.Show(ex.Message) 
+0

感谢您的快速回答Jaredpar。我的问题是,程序在行中显示“Dim count As Integer = insertCommand.ExecuteNonQuery()”指向ExecutenonQuery。 (真遗憾,我不能发送图片,对不起)。切勿跳转到捕捉部分。 – user2705541

+0

@ user2705541为什么不将该代码移动到'try'块的主体中​​呢? – JaredPar