0

我一直在尝试将解决方案应用于用户在其系统上需要的某些功能。

一个用户要求我在他们的系统上实现一个锁定系统。他们有多个用户可能需要访问该站点,但用户希望他们能够独立锁定网站中的记录,以便他们添加注释然后解锁,以便其他用户能够这样做相同。

我的网页上有一个简单命名为 btnLock 的按钮,我在我的数据库中添加了一个名为 LockedBy 的附加列,并具有以下存储过程...

ALTER PROCEDURE LockWeeklyTest
(     
   @AgendaID BIGINT,     
   @LockingUser VARCHAR(20) 
) 
AS
BEGIN    
    SET NOCOUNT ON      
    UPDATE        
        WeeklyAgenda     
    SET        
        LockedBy = @LockingUser 
    WHERE
        AgendaID = @AgendaID    
    AND 
        LockedBy IS NULL      
END

我有一个名为 Weekly Class 的课程,并有以下代码......

   Public Shared Sub LockWeeklyAgenda(ByVal WeeklyClass As WeeklyClass)

    Using dbConnection As New SqlConnection(ConfigurationManager.AppSettings("dbConnection"))
        dbConnection.Open()

        Dim dbTrans As SqlTransaction
        dbTrans = dbConnection.BeginTransaction()

        Using dbCommand As SqlCommand = dbConnection.CreateCommand

            With dbCommand
                .Transaction = dbTrans
                .CommandType = CommandType.StoredProcedure
                .CommandText = "LockWeeklyTest"

                'Add Parameters for Update
                .Parameters.AddWithValue("@AgendaID", WeeklyClass.AgendaID)
                .Parameters.AddWithValue("@LockingUser", WeeklyClass.LockedBy)


                dbCommand.ExecuteNonQuery()

            End With
        End Using 'dbCommand
        dbTrans.Commit()
    End Using

End Sub

我在想下面的 butlock 代码会用用户名填充我的 Loggedby 字段,但事实并非如此。

 Protected Sub btnLock_Click(sender As Object, e As System.EventArgs) Handles btnLock.Click


    Dim lock As New WeeklyClass
    If lock.LockedBy = "Null" Then
        lock.LockedBy = System.Environment.UserName
        'lock.AgendaID = AgendaID
    End If

    ' save to the database using the Class DAL
    WeeklyClassDAL.LockWeeklyAgenda(lock)


End Sub

我知道存储过程的工作原理就像我用以下语句作为示例测试过的那样......

EXEC LockWeeklyTest 11, 'Betty' 

我确定它与 btnlock_click 有关,但我不是 100% 确定这是什么。任何帮助都是非常重要的。

4

2 回答 2

1

你的问题是这一行:

If lock.LockedBy = "Null" Then

“Null”实际上是一个包含单词 Null 的字符串。你追求的是:

If String.IsNullOrEmpty(lock.LockedBy) Then

这样,如果它实际上为 null 或为空,您的 LockedBy 将被设置。目前,它仅在 LockedBy 已经等于字符串值“Null”时才设置 LockedBy,它不会在声明后直接设置。考虑到 LockedBy 在您声明 WeeklyClass 后总是直接为空,这个逻辑真的有必要吗?

于 2012-07-17T11:17:42.487 回答
0

AgendaID 看起来不太对劲:

在按钮单击事件期间,该值已被注释掉,但仍传递到数据层的“LockWeeklyAgenda”方法内的存储过程。

它也没有在存储过程本身中定义为可为空的参数,因此发送的值将取决于 WeeklyClass 类的构造函数。

您能否还展示一下 WeeklyClass 代码的外观?

于 2012-07-17T11:39:33.487 回答