c# - 如何测试C#代码与Sql Server存储过程的同步

标签 c# sql-server testing stored-procedures

为了在 SQL Server 和 C# 之间进行交互,我使用了 SqlCommand对象、参数和存储过程。

我的问题是,在我执行它之前,我不知道它是否仍与数据库同步。

例如,如果我有以下存储过程:

create procedure psSync
(
    @Argument VARCHAR(50)
)
--do stuff

我将在我的代码中:

String myArgument="20131110"
SqlCommand sqlcmd = new SqlCommand { CommandType = CommandType.StoredProcedure, CommandText = "psSync"};
sqlCommand.Parameters.AddWithValue("@Argument", myArgument);
//execute sql command

这里一切都很好。

但是如果我将我的过程更改为

create procedure psSync
(
    --Desync!
    @Argument Datetime
)
--do stuff

并且忘记将 myArgument 更改为 datetime,它会崩溃,而且我经常会发现这个错误为时已晚。

我首先尝试运行单元测试,使用开始事务和回滚在我的开发数据库中执行存储过程,但我不喜欢它:

  • 需要很长时间
  • 它可能在产品中运行错误
  • 它将数据库配置存储在测试dll中

所以我的问题是:

如何快速、高效、安全地测试 C# 代码和 SqlServer 代码(SqlCommand->Stored Procedure)之间的所有 sql 链接?

最佳答案

只是好奇,为什么要添加那种模式验证? 更改过程参数不会那样发生,对吧。进行修改的人必须意识到这也需要更改代码。

但是如果您有任何情况并且确实需要这样做,您必须想出您自己的框架或 API 集,您可以在任何实际调用数据库过程之前从 C# 代码调用它们。到目前为止,我还没有看到这些类型的验证,因为它会增加很多开销,具体取决于它是针对一个或两个过程还是跨所有数据库调用实现的。

您可以编写 SQL API,它将向您返回 DB 所有/选定的过程以及当前的模式定义。检查此查询。 sys.parameters 表中还有其他有用的信息。

SELECT  OBJECT_NAME(ssp.object_id) objectName
        ,ssp.name ParameterName
        ,sst.name ParameterDataType
        ,ssp.max_length
        ,ssp.precision
        ,ssp.scale
FROM sys.parameters  ssp
JOIN sys.types sst
    ON ssp.system_type_id=sst.system_type_id
WHERE OBJECT_NAME(ssp.object_id) = 'pr_test1'

示例结果将是这样的。

但请记住,如果您没有想出正确的频率或何时获取此信息,异步问题仍然可能发生。您能做的最好的事情就是在对象调用之前获取此信息。而且您知道一直这样做的开销是多少。

enter image description here

关于c# - 如何测试C#代码与Sql Server存储过程的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19322684/

相关文章:

c# - 如何将大型 JSON 对象直接序列化为 HttpResponseMessage 流?

c# - 如何在 C# ASP.NET 后面的代码中将背景图像设置为::在选择器之前

c# - 解析字符串 - 有比检查每一行更有效的方法吗?

c# - ASP.net C# GridView 到 html 表不工作

c# - 如何通过 C# ASP.net 在 SQL Server 中的文本框中存储日期

mysql - 划分count(*)条sql语句得到比率

c# - 是否有任何附加组件/扩展可以让我在 Visual Studio 中使用 F12 存储过程?

c - 是否有用于在 Apache C 模块上运行单元测试的框架?

iphone - 在设备上运行 OCUnit 应用程序测试套件时偶尔会出错

在 Linux 中使用 wine 的 .Net Framework