【发布时间】:2017-10-02 08:23:41
【问题描述】:
这是存储过程
CREATE PROCEDURE [Proc_DeleteSpecificRow]
@p_Id int
,@p_subId int
,@p_col1 varchar(50) = NULL
,@p_col2 varchar(50) = NULL
,@p_col3 varchar(50) = NULL
AS
BEGIN
if(@p_col2 is not null AND @p_col3 is not null)
Delete from TestTable where Id= @p_Id AND SubId= @p_subId
AND col2= @p_col2 AND col3= @p_col3
当我在 SQL Server 管理工作室中使用以下值运行此存储过程时,它运行良好:
- ID=1
- SubId = 4
- col1 = empty/null(我认为这可以解决问题!下面会详细介绍)
- col2 = A
- col3 = X
具有上述值的行被删除。如果我将 col2 和 col3 留空,并且只为 col1 提供一个值,也会发生同样的情况。它按预期工作。
现在,如果我使用 c# 代码中的等效数据/值调用此存储过程,它就不起作用。没有例外,它只是什么都不做。 我的猜测是,它与 NULL 值有关。这就是我将参数传递给 IDbCommand 的方式:
- ID 为 DbType.Int16
- SubID 为 DbType.Int16
- col1 作为 DbType.String
- col2 作为 DbType.String
- col3 作为 DbType.String
重要提示:它与调用本身的内容无关,其他过程可以正常工作。
编辑(代码):
[DataAccessorMethod(SupportedInterfacesFlags = AccessorInterfaces.IDataModifier)]
public void DeleteSpecificRow(int id, int subId, string col1, string col2, string col3, string connectionString)
{
try
{
using (var scope = new TransactionScope(TransactionScopeOption.Required, Constants.TxOptions))
{
using (IDbConnection conn = new SqlConnection(connectionString))
{
IDbCommand cmd = MyHelper.GetCommand(conn, Constants.PROC_DELETESPECIFICROW, CommandType.StoredProcedure);
MySqlHelper.AddParameter(cmd, "p_Id", DbType.Int16, id);
MySqlHelper.AddParameter(cmd, "p_SubId" ,DbType.Int16, subId);
MySqlHelper.AddParameter(cmd, "p_col1", DbType.String, col1);
MySqlHelper.AddParameter(cmd, "p_col2", DbType.String, col2);
MySqlHelper.AddParameter(cmd, "p_col3", DbType.String, col3);
conn.Open();
cmd.ExecuteNonQuery();
scope.Complete();
}
}
}
catch (SqlException sqlex)
{
...}
}
【问题讨论】:
-
我认为你也应该添加 C# 代码。
-
好吧,我做了,但问题在文中描述。
-
我看到你的参数
@p_Id在 SP 中是uniqueidentifier,但在 C# 代码中是int -
这只是我第一个版本的错字,我会编辑它
标签: c# sql-server