4

我想在 VB.NET 应用程序中使用以下 SQL 语句:

select * from information_schema.parameters
where specific_name='GetTaskEvents'

SELECT * 
FROM 
    INFORMATION_SCHEMA.ROUTINES 
WHERE 
    ROUTINE_NAME= 'GetTaskEvents'

我今天和 DBA 谈了这件事,他似乎不高兴,但没有给出理由。这样做是不好的做法吗?

我希望能够做这样的事情

public sub Delete()
'loop around about ten databases
'Call the delete function in each of the databases (check that the stored procedure exists first)
'Each database has different output parameters.  Deal with them differently e.g. if there is an email parameter, then email the person to say the record was deleted.
End Sub

这样做的原因是我可以对每个数据库一视同仁。

4

3 回答 3

4

如果您知道存储过程什么但不确定参数是什么 - 使用SqlCommandBuilder.DeriveParameters方法获取参数数量以及它们的类型和名称的更好方法。

更新这是 VB.NET 中的一个基本用法示例

Dim oCommand As New SqlCommand("SpName", oConnObject)
oCommand.CommandType = CommandType.StoredProcedure
SqlCommandBuilder.DeriveParameters(oCommand)

此时oCommand.Parameters集合将填充“SpName”的参数

于 2013-09-09T19:31:19.040 回答
1

最佳实践应该归结为您愿意让公司面临什么样的风险,以便获得所需的数据类型。风险/收益分析。

在这种情况下,我看到的风险是你让你的代码依赖于微软在幕后的系统表和模式。这些确实倾向于从版本到版本。因此,例如从 sql 2018 迁移到 2021 可能会破坏您的编译代码。 除了关于调用 procs 的评论中概述的风险之外,您不了解其影响。

因此,为了降低这种风险,您可以将代码放在存储过程中,以便您可以轻松更新它,而无需在系统架构发生更改时重新编译代码。还有其他方法可以减少已识别的其他风险,但这就是我分析“最佳实践”的方式。

于 2013-09-09T19:30:32.830 回答
0

使用命名空间 System.Data:

DbConnection + DbCommand + IDataReader(用于 SQL Server 的 SqlConnection + SqlCommand)

于 2013-09-09T19:35:23.163 回答