【问题标题】:SQL Server ADO.Net retrieve error information from sql scriptSQL Server ADO.Net 从 sql 脚本中检索错误信息
【发布时间】:2013-11-14 19:12:32
【问题描述】:

我正在处理一个项目,我们必须查询旧的 SQL Server 2000 数据库(如果您必须知道的话,是 PeopleSoft)。查询返回一个结果集。如果我们使用较新的数据库,我会使用存储过程和错误处理(例如@ErrNo、@ErrMsg、Try/Catch)来获得我想要的。

但是,我们使用的是 SQL Server 2000,并且不允许使用存储过程,因此我们只能使用动态 SQL 查询和脚本。我们目前正在使用 ADO.Net(例如其上的 DbCommand 和 Execute 方法)来获取我们的结果集。

我想做的是在我们的 sql 脚本中添加更多的错误处理/验证,并将消息返回给我们的 .Net 代码。 (例如输入值无效、未找到行等)

有谁知道如何在这些限制下做到这一点?如果没有简单的方法可以做到这一点,你能推荐一些替代方案吗?例如

  1. 要求 DBA 为我们创建一个专门的消息/日志记录表 在我们的脚本中,写入该表 在我们的代码中,读取该表

  2. 将我们的代码/脚本分解为多个步骤,并从我们的 .Net 代码中调用它(然后我们是否必须使用事务?)

  3. 等。 ETC。?真是把我的头撞到这里了……

谢谢大家。

【问题讨论】:

    标签: c# sql-server error-handling


    【解决方案1】:

    存储过程与(我觉得)您试图实现的目标几乎没有关系。即使您在存储过程中有错误处理,您仍然要发送无效数据来处理错误。似乎,您需要的是更好的“在数据库调用之前”验证。

    您可以做的就是在很大程度上利用 Ado.net 来改善您的情况。具体来说 - 使用DataTables。您可以加载架构,它会以您的 Sql 表的形式创建您的 DataTable。检查DataTableColumn对象http://msdn.microsoft.com/en-us/library/system.data.datacolumn_properties%28v=vs.90%29.aspx的属性

    如果您尝试先将无效数据插入此表,则会出错,您将能够创建特定的错误处理。

    此外,您可以(并且应该)将动态 sql 替换为参数化查询。这是推荐的方式,可以提高性能。

    代替:

    "select * from customer where id = " + custId.ToString()
    

    你应该这样做:

    "select * from customer where id = @1"
    

    然后,当您创建命令对象时,您将添加一个参数。这有利于 Sql Server 性能。

    对于您而言,DataTable 将成为防止向服务器发送错误代码的防线。

    另一种方法是完全基于INFORMATION_SCHEMA 编写您自己的数据验证逻辑。

    另一种方法是进行非常严格的数据输入验证。

    通常,系统同时具有输入验证和数据层验证。

    【讨论】:

    • 感谢您的反馈,但我的情况并非如此。例如,我们有一项业务,当用户插入新的数据行时,它必须在今天是活跃/有效的,而不是未来的日期。这在 UI 或 DB 中没有强制执行。因此,在我的导入/集成逻辑期间,我必须处理三种情况:1) 获取刚刚插入的预期记录,2) 未找到记录(意外错误情况),或 3) 行存在,但无效且不应该被退回。我需要区分后两种情况。这只是一个常见的例子。
    • 没问题 - 您需要创建业务层,将您的记录锁定在事务中。请求记录:如果你没有找到记录-抛出RecordNotFoundException。检查记录是否有错误,如果有问题 - 抛出 RecordInvalidException。并且为了确保这不是同时完成的,有一个技巧。您创建一个名为CriticalSectionLock 的数据库表。在那里,您可以添加一些行,例如CustomerRecLock。您在事务中锁定该记录,直到您释放它,没有其他代码将访问记录验证逻辑。基本上,您认为存储的 Proc 您需要 BLL
    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2020-04-06
    相关资源
    最近更新 更多