SQL Server ADO.Net从sql脚本中检索错误信息

时间:2013-11-14 19:12:33

标签: c# sql-server error-handling

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

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

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

有谁知道如何在这些约束下做到这一点?如果没有简单的方法可以做到这一点,你能推荐一些替代方案吗? e.g。

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

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

  3. 等。等等。?真的在这里敲我的头......

  4. 谢谢大家。

1 个答案:

答案 0 :(得分:0)

存储过程与你想要实现的(我觉得)没什么关系。即使您在存储过程中有错误处理,您仍然会发送无效数据以处理错误。似乎,你需要的是“在DB调用之前”验证。

您可以采取的措施是在很大程度上利用Ado.net。具体而言 - 使用DataTables。您可以加载架构,它将在您的Sql表的形状中创建DataTable。检查DataTable Column对象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完全编写自己的数据验证逻辑。

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

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