奇怪的.NET存储过程行为

时间:2014-08-25 14:31:50

标签: c# sql stored-procedures ado.net sqlcommand

我有一个存储过程,我通过.NET中的SqlCommand调用。它是开箱即用的实现,我有各种代码访问其他似乎工作正常的存储过程。但是,由于某种原因,我不断从存储过程中收到错误,因为它认为传入的参数之一是NULL,即使我传递了一个值。我在执行代码时在数据库上运行了跟踪,我可以看到传递的值,所以我不确定从这里开始。希望有人可以对我失踪的内容有所了解。这是.NET代码:

    private void InsertAuditRecord(int recipientId, EventType eventType, string jsonProperties)
    {
        using (SqlConnection cn = new SqlConnection(_connectionString))
        {
            cn.Open();
            using (SqlCommand cmd = new SqlCommand("usp_Ual__InsUalLog", cn))
            {
                cmd.Parameters.AddWithValue("@EventTimeStamp", DateTime.Now);
                cmd.Parameters.AddWithValue("@AccountId", _accountId);
                cmd.Parameters.AddWithValue("@UserName", this.SystemLogin);
                cmd.Parameters.AddWithValue("@UserNameEffective", this.SystemLogin);
                cmd.Parameters.AddWithValue("@SessionId", this.SessionId);
                cmd.Parameters.AddWithValue("@UalUserActivityLogEventTypeId", (int)eventType);
                cmd.Parameters.AddWithValue("@EntityTitle", AUDIT_ENTITYTITLE_RECIPIENT);
                cmd.Parameters.AddWithValue("@EntityId", recipientId);
                cmd.Parameters.AddWithValue("@Properties", jsonProperties);

                cmd.Parameters.Add("@UalUserActivityLogId", System.Data.SqlDbType.Int);
                cmd.Parameters["@UalUserActivityLogId"].Direction = System.Data.ParameterDirection.Output;

                cmd.ExecuteNonQuery();
            }
        }
    }

这是我在执行此代码时在数据库上运行的跟踪中获得的输出:

 declare @p12 int
 set @p12=NULL
 exec sp_executesql N'usp_Ual__InsUalLog',N'@EventTimeStamp datetime,@AccountId int,@UserName nvarchar(5),@UserNameEffective nvarchar(5),@SessionId int,@UalUserActivityLogEventTypeId int,@EntityTitle nvarchar(12),@EntityId int,@Properties nvarchar(143),@UalUserActivityLogId int output',@EventTimeStamp='2014-08-25 09:35:41.613',@AccountId=10010,@UserName=N'hydra',@UserNameEffective=N'hydra',@SessionId=1957,@UalUserActivityLogEventTypeId=22,@EntityTitle=N'recipient_id',@EntityId=79,@Properties=N'{"ClientUniqueRecipientId":"opt_sms_6174358864","ContactPointAddress":"6174358864","GroupId":"4","ShortCode":"12345","EventCode":"sam-weather"}',@UalUserActivityLogId=@p12 output
 select @p12

即使存在传递给跟踪的值,存储过程也会认为@AccountId的值为NULL。有没有人想过为什么会这样?

1 个答案:

答案 0 :(得分:0)

我弄明白了这个问题。因为我在指定输出参数,所以我需要将SqlCommand上的CommandType设置为Stored Procedure:

    private void InsertAuditRecord(int recipientId, EventType eventType, string jsonProperties)
    {
        using (SqlConnection cn = new SqlConnection(_connectionString))
        {
            cn.Open();
            using (SqlCommand cmd = new SqlCommand("usp_Ual__InsUalLog"))
            {
                cmd.Connection = cn;
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("@EventTimeStamp", DateTime.Now);
                cmd.Parameters.AddWithValue("@AccountId", _accountId);
                cmd.Parameters.AddWithValue("@UserName", this.SystemLogin);
                cmd.Parameters.AddWithValue("@UserNameEffective", this.SystemLogin);
                cmd.Parameters.AddWithValue("@SessionId", this.SessionId);
                cmd.Parameters.AddWithValue("@UalUserActivityLogEventTypeId", (int)eventType);
                cmd.Parameters.AddWithValue("@EntityTitle", AUDIT_ENTITYTITLE_RECIPIENT);
                cmd.Parameters.AddWithValue("@EntityId", recipientId.ToString());
                cmd.Parameters.AddWithValue("@Properties", jsonProperties);

                cmd.Parameters.Add(new SqlParameter("@UalUserActivityLogId", System.Data.SqlDbType.Int)
                { 
                    Direction = ParameterDirection.Output
                });

                cmd.ExecuteNonQuery();
            }
        }
    }

一旦我这样做,代码执行得很好。 叹息这总是小事。