存储过程不通过C#插入

时间:2014-04-07 06:07:59

标签: c# asp.net sql stored-procedures insert

我的存储过程在我的SQL EXEC查询中正常工作。它插入到我的数据库中,但是当我从C#调用它时它不会抛出错误。发生了什么。

我的C#代码:

        con.Open();
        transaction = con.BeginTransaction();
        cmd = new SqlCommand("InsertIndent", con, transaction);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@IP_No", SqlDbType.VarChar, 15);
        cmd.Parameters["@IP_No"].Value = indent.IP_No;

        cmd.Parameters.Add("@Stat", SqlDbType.VarChar, 1);
        cmd.Parameters["@Stat"].Value = indent.Status;

        cmd.Parameters.Add("@Reference_No", SqlDbType.VarChar, 15);
        cmd.Parameters["@Reference_No"].Value = indent.Reference_No;

        cmd.Parameters.Add("@Remarks", SqlDbType.VarChar, 30);
        cmd.Parameters["@Remarks"].Value = indent.Remarks;

        cmd.Parameters.Add("@Update_Time", SqlDbType.DateTime);
        cmd.Parameters["@Update_Time"].Value = indent.Update_Time;

        cmd.Parameters.Add("@User_Id", SqlDbType.VarChar, 15);
        cmd.Parameters["@User_Id"].Value = indent.User_Id;

        cmd.Parameters.Add("@Log_Id", SqlDbType.BigInt);
        cmd.Parameters["@Log_Id"].Value = indent.Log_Id;

        cmd.Parameters.Add("@Shift_Id", SqlDbType.Int);
        cmd.Parameters["@Shift_Id"].Value = indent.Shift_Id;

        result = cmd.ExecuteNonQuery().ToString();
        log.Debug("connection.cs : inside addNewIndent,for IpNo " + indent.IP_No);
        con.Close();

追踪时的价值观 The values

我的存储过程:

[InsertIndent]
(
@IP_No varchar(15),        
@Stat varchar(1),      
@Reference_No varchar(15),
@Remarks varchar(30),   
@Update_Time DATETIME,
@User_Id varchar(15),
@Log_Id bigint,
@Shift_Id int
)
AS
BEGIN
DECLARE @Indent_No varchar(20)
set @Indent_No= (SELECT TOP 1 In_Id from Id_Generation WITH(NOLOCK))

INSERT INTO IP_Indent(IP_No,Indent_No,Status,Reference_No,Remarks,User_Id,Log_Id,Shift_Id,Update_Time)
VALUES(@IP_No,@Indent_No,@Stat,@Reference_No,@Remarks,@User_Id,@Log_Id,@Shift_Id,@Update_Time)

Update Id_Generation set In_Id=In_Id+1;

END

1 个答案:

答案 0 :(得分:3)

由于您已启动了一项交易,因此在关闭连接之前您还需要commit it,否则更改将被回滚。

另一方面,为什么不为该Id_Generation计数器列使用IDENTITY?就目前情况而言,如果两个并发呼叫者呼叫您的触发器,他们可能会使用相同的Id_Generation值。

另请注意,SqlConnectionSqlCommand都是Disposable - 例如将它们包装在using语句中将确保尽快释放资源。