Sql 数据层的正确错误处理实践

Sql 数据层的正确错误处理实践,sql,vb.net,stored-procedures,Sql,Vb.net,Stored Procedures,在处理数据访问层时,在错误处理方面,检查哪些好的方面?例如,假设我有这个函数 Public Function UserExists(ByVal userName As String) As DataTable Dim dt As Object = Nothing Dim arSqlParameters(0) As SqlParameter arSqlParameters(0) = New SqlParameter("@UserName",

在处理数据访问层时,在错误处理方面,检查哪些好的方面?例如,假设我有这个函数

    Public Function UserExists(ByVal userName As String) As DataTable
        Dim dt As Object = Nothing
        Dim arSqlParameters(0) As SqlParameter
        arSqlParameters(0) = New SqlParameter("@UserName", SqlDbType.NVarChar, 50)
        arSqlParameters(0).value = userName
        dt = ABC.APP.DAL.DALHelper.ExecuteDatatable(ConnectionString, CommandType.StoredProcedure, "dbo.aspnet_sprGetUserByUsername", arSqlParameters)
        Return dt
    End Function
这似乎是非常懒惰和不安全的编码。在这种情况下,您将如何确保您的代码优雅地处理任何意外情况


我是vb.net的新手,我正在开发的应用程序没有错误处理,所以我想这是寻求建议的最佳地方。提前感谢:)

这可能对您有用


这可能对您有用


对于这样的话题,人们的观点可能会大相径庭,但以下是我的看法。只尝试处理与此领域相关的例外情况。这是一个模糊的陈述,但我的意思是,用户传递的字符串是否比数据库中的列包含更多字符。或者他们违反了其他商业规则

我不会在这里发现暗示数据库已关闭的错误。在代码中,您可以捕捉到可以处理的错误,并且您的应用程序需要它的数据库。声明一个更全局的异常处理程序,该处理程序记录问题,通知某人,无论什么。。。并为用户提供一个“优雅”的出口

我看不到在每个方法中发现数据库问题的任何价值。您只是在重复一个可能轰炸数据层任何部分的场景的代码。也就是说,如果您选择在该方法中捕获db错误(或其他常规错误),那么在抛出新异常时,至少将innerexception设置为捕获的异常。或者更好的办法是,记录你想要什么,然后只是“扔”,而不是“扔前”。它将保留原始堆栈跟踪


同样,你会有很多不同的想法,没有明确的对错,只有偏好

对于这样的话题,人们的观点可能会大相径庭,但以下是我的看法。只尝试处理与此领域相关的例外情况。这是一个模糊的陈述,但我的意思是,用户传递的字符串是否比数据库中的列包含更多字符。或者他们违反了其他商业规则

我不会在这里发现暗示数据库已关闭的错误。在代码中,您可以捕捉到可以处理的错误,并且您的应用程序需要它的数据库。声明一个更全局的异常处理程序,该处理程序记录问题,通知某人,无论什么。。。并为用户提供一个“优雅”的出口

我看不到在每个方法中发现数据库问题的任何价值。您只是在重复一个可能轰炸数据层任何部分的场景的代码。也就是说,如果您选择在该方法中捕获db错误(或其他常规错误),那么在抛出新异常时,至少将innerexception设置为捕获的异常。或者更好的办法是,记录你想要什么,然后只是“扔”,而不是“扔前”。它将保留原始堆栈跟踪


同样,你会有很多不同的想法,没有明确的对错,只有偏好

查看开源ORM解决方案的代码(,)将对您有所帮助


根据我有限的知识,我认为与连接、连接超时等相关的错误应该这样传递,因为DAL对此无能为力。应返回与验证相关的错误(如字段长度、数据类型)以及适当的详细信息。您可以提供验证方法(亚音速包含它)来验证字段值并返回相应的错误详细信息。

查看开源ORM解决方案的代码(,)将对您有所帮助


根据我有限的知识,我认为与连接、连接超时等相关的错误应该这样传递,因为DAL对此无能为力。应返回与验证相关的错误(如字段长度、数据类型)以及适当的详细信息。您可以提供验证方法(亚音速包含它)来验证字段值并返回适当的错误详细信息。

不确定为什么不将dt声明为数据表-什么是“dim dt as object=nothing”的动机

实际上,唯一可以合理失败的一行是“dt=ABC.APP.DAL…”调用

在这一行中,您可能会有一些错误:

  • 存储过程或参数 名字错了。这应该是 在设计时捕获(不是由 内置的检查机制,但 第一次尝试运行 代码)
  • 存储库中发生错误 程序存储过程使用延迟名称 分辨率,这可能导致运行时 如果(例如)对象发生错误 不存在于 存储过程被称为。同样,这是最重要的 在测试中可能会抬起它的头
  • 僵局。在这种情况下,你应该 捕获并重新提交该批。 这是一个介绍和一组链接 应用程序中SQL错误的处理 代码
  • 传递的参数是 无效(太长,数据类型错误, 等等)。这应该检查一下 在调用存储过程之前

不确定为什么不将dt声明为数据表-什么是“dim dt as object=nothing”的动机

实际上,唯一可以合理失败的一行是“dt=ABC.APP.DAL…”调用

在这一行中,您可能会有一些错误:

  • 存储过程或参数 名字错了。这应该是 在设计时捕获(不是由 内置的检查机制,但 第一次尝试运行 代码)
  • 存储库中发生错误 程序存储过程使用延迟名称 分辨率,这可能导致运行时 如果(例如)对象发生错误 不存在于 存储过程被称为。同样,这是最重要的 在测试中可能会抬起它的头
  • 僵局。在这种情况下,你应该 捕获并重新提交该批。 这是一个介绍和一组链接 应用程序中SQL错误的处理 代码
  • 传递的参数是 无效(太长,数据类型错误, 等等)。这应该检查一下 在调用存储过程之前
    • 我已经
      IF @@Error>0 
         SELECT 'Something bad happened'
      
      IF @Foo =42
              BEGIN
                  RAISERROR ( 'Paramater @foo can''t be 42',
                      16, -- Severity = Misc. User Error.
                      1 -- State. == ad hoc way of finding line of code that raised error
                     ) ;  
                  RETURN -1; --Just because some developers are looking for this by habit
              END