C# 奇怪的.NET存储过程行为

C# 奇怪的.NET存储过程行为,c#,sql,stored-procedures,ado.net,sqlcommand,C#,Sql,Stored Procedures,Ado.net,Sqlcommand,我有一个通过.NET中的SqlCommand调用的存储过程。这是一个非常现成的实现,我有各种各样的代码来访问其他似乎工作正常的存储过程。然而,出于某种原因,我一直从存储过程中得到一个错误,因为它认为传入的一个参数为NULL,即使我正在向它传递一个值。我在执行代码时对数据库进行了跟踪,我可以看到传递的值,因此我不确定从这里转到哪里。希望有人能让我明白我错过了什么。以下是.NET代码: private void InsertAuditRecord(int recipientId, Event

我有一个通过.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,即使有一个值被传递到跟踪中。有人知道为什么会发生这种情况吗?

我找到了问题所在。因为我指定了一个输出参数,所以需要将SqlCommand上的CommandType设置为存储过程:

    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();
            }
        }
    }

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

您是否尝试过显式地为每个参数指定数据类型,以查看这是否有效果?参数是否按照存储过程中定义的顺序添加?为了清楚起见,您可能需要对参数进行反向定义,例如:
usp_u Ual__\u insallo@EventTimeStamp=@EventTimeStamp,@AccountId=@AccountId,…
yes-它们是按照定义的顺序添加的。我没有尝试显式指定该值,但我始终使用.AddWithValue(),没有任何问题。但是我会尝试指定该参数的值,看看是否有帮助。只是通过指定数据类型来尝试-不走运。它仍然认为@AccountId值为空