C# SQL Server ADO.Net从SQL脚本检索错误信息

C# SQL Server ADO.Net从SQL脚本检索错误信息,c#,sql-server,error-handling,C#,Sql Server,Error Handling,我正在做一个项目,我们必须查询一个旧的SQL Server 2000数据库(PeopleSoft,如果你必须知道的话)。查询返回一个结果集。如果我们使用的是更新的数据库,我会使用存储过程和错误处理(例如@ErrNo、@ErrMsg、Try/Catch)来获得我想要的 但是,我们使用的是SQLServer2000,不允许使用存储过程,因此只能使用动态SQL查询和脚本。我们目前正在使用ADO.Net(例如DbCommand和其上的执行方法)来获取我们的结果集 我想做的是在sql脚本中添加更多的错误处

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

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

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

有人知道在这些限制下怎么做吗?如果没有简单的方法,你能推荐一些替代方案吗?e、 g

  • 请DBA为我们创建一个专门的消息/日志表 在我们的脚本中,写入该表 在我们的代码中,阅读该表

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

  • 等等等等。?真是让我头疼


  • 谢谢大家。

    存储过程与您(我觉得)想要实现的目标没有多大关系。即使您在存储过程中有错误处理,您仍然需要发送无效数据来处理错误。看起来,您需要的是更好的“DB调用前”验证

    要改善您的情况,您可以做的是在很大程度上利用Ado.net。特别是-使用
    数据表
    。您可以加载模式,它将以Sql表的形式创建
    DataTable
    。检查
    数据表
    对象的属性

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

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

    而不是:

    "select * from customer where id = " + custId.ToString()
    
    你应该做:

    "select * from customer where id = @1"
    
    然后,在创建命令对象时,将添加一个参数。这对Sql Server性能有好处

    而对于您来说,
    DataTable
    将是防止向服务器发送错误代码的防线

    另一种方法是完全基于
    信息\u模式
    编写自己的数据验证逻辑

    另一种方法是进行真正严格的数据输入验证


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

    谢谢您的反馈,但我的情况不是这样。例如,我们有一项业务,当用户插入一行新数据时,它必须是当前有效的,而不是未来有效的。这不会在UI或DB中强制执行。因此,在导入/集成逻辑期间,我必须处理三种情况:1)获取刚刚插入的预期记录,2)未找到记录(意外错误情况),或3)行存在,但无效且不应返回。我需要区分后两种情况。这只是一个常见的例子。没问题-您需要创建业务层,在其中锁定事务中的记录。请求记录:如果没有找到记录-抛出
    RecordNotFoundException
    。检查记录是否有错误,如果有问题-抛出
    RecordInvalidException
    。为了确保这不是同时进行的,这里有一个技巧。您可以创建一个名为
    CriticalSectionLock
    的DB表。在那里,您可以添加一些行,例如
    CustomerRecLock
    。您将该记录锁定在事务中,直到您释放它,其他代码都不会访问记录验证逻辑