1

为了在 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 链接?

4

2 回答 2

0

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

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

您可以编写 SQL API,它将返回数据库所有/选定的过程以及当前的模式定义。检查这个查询。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'

示例结果将是这样的。

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

在此处输入图像描述

于 2013-10-11T16:46:50.770 回答
0

与环境的交互,例如:数据库、服务等是功能和集成测试的工作。这些测试很慢,而且数量应该最少。

如果单元测试需要很长时间,则它不是单元测试。单元测试可能会检查预期参数是否设置为 SqlCommand 并调用了执行方法。应该模拟数据库上下文。

此类单元测试的更正由更新存储过程的那个人负责。或者应该有一些数据库规范应该与单元测试同步。

于 2013-10-11T20:02:16.517 回答