我想在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
这样做的原因是我可以对待每个数据库。
答案 0 :(得分:4)
如果您知道存储过程是但不确定参数是什么 - 使用SqlCommandBuilder.DeriveParameters方法获取参数数量以及类型和名称的更好方法
UPDATE 这是VB.NET中的基本用法示例
Dim oCommand As New SqlCommand("SpName", oConnObject)
oCommand.CommandType = CommandType.StoredProcedure
SqlCommandBuilder.DeriveParameters(oCommand)
此时oCommand.Parameters
集合将是带有“SpName”
答案 1 :(得分:1)
最佳做法应归结为您愿意将公司暴露给哪种风险,以便获得所需的数据类型。风险/收益分析。
在这种情况下,我看到的风险是你的代码依赖于幕后系统表和模式的微软。这些确实会随着版本的变化而变化。因此,从SQL 2018到2021的迁移可能会破坏您的编译代码。 除了关于调用procs的评论中概述的风险之外,你还不了解其影响。
因此,为了降低风险,您可以将代码放在存储过程中,这样您就可以轻松更新它,而无需在系统架构发生变化时重新编译代码。还有其他方法可以减少所确定的其他风险,但这就是我分析“最佳实践”的方法。
答案 2 :(得分:0)
使用命名空间System.Data:
DbConnection + DbCommand + IDataReader(SQL Server的SqlConnection + SqlCommand)