0

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

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

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

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

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

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

  3. 等等等等?真的在这里撞到我的头......

感谢大家。

4

1 回答 1

0

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

您可以做的就是在很大程度上利用 Ado.net 来改善您的情况。具体使用DataTables。您可以加载模式,它将创建您DataTable的 Sql 表的形状。检查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.

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

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

于 2013-11-14T20:06:41.833 回答