Sql server 2008 Track如果用户每天登录

时间:2014-05-01 07:28:20

标签: c# sql sql-server

如果用户每天登录数据库表,我需要编写一个写入的函数。

每当用户登录我的网站时,我需要我的功能来触发并获取他的UserId和当前日期时间。如果用户在一天内登录两次,则必须再次触发该功能并写入新行。我需要的最终结果是一个数据库表,每个登录我可以按用户每天排序。

这是我的功能,我在登录控件的LoggedIn事件中触发了

CREATE PROCEDURE loginProc
    @UserId uniqueidentifier,
    @CurrentDateTime datetime
AS
BEGIN
     SELECT GETDATE() AS CurrentDateTime

     SELECT UserId
       FROM dbo.aspnet_Users
      WHERE @UserId = UserId

     INSERT INTO dbo.UserLoginToday
            (UserId, UserLoginPerDay)
     VALUES (@UserId, @CurrentDateTime)
END

它不会向我的数据库写任何东西。我究竟做错了什么?这会写出我想要的正确数据吗?

2 个答案:

答案 0 :(得分:1)

CREATE PROCEDURE loginProc
   @UserId uniqueidentifier
AS
BEGIN
     INSERT INTO dbo.UserLoginToday
            (UserId, UserLoginPerDay)
     SELECT UserId, GETDATE()
       FROM dbo.aspnet_Users
      WHERE UserId = @UserId
END

您需要使用过程而不是函数,因为函数不允许使用DML(插入/更新/删除)语句。

无需将当前时间戳作为参数传递,因为这可以使用GETDATE()在存储过程中生成并插入到日志表中

答案 1 :(得分:0)

您忘记为参数指定值,并在 WHERE 条件中为您编写@UserId=UserId,该值应为UserId=@UserId。试试这个

CREATE PROCEDURE loginProc
    @UserId uniqueidentifier,
    @CurrentDateTime datetime
AS
BEGIN
     SELECT @CurrentDateTime = GETDATE() AS CurrentDateTime

     SELECT @UserId=UserId
       FROM dbo.aspnet_Users
      WHERE UserId = @UserId

     INSERT INTO dbo.UserLoginToday
            (UserId, UserLoginPerDay)
     VALUES (@UserId, @CurrentDateTime)
END

最佳解决方案是 -

CREATE PROCEDURE loginProc
    @UserId uniqueidentifier
AS
BEGIN
     INSERT INTO dbo.UserLoginToday
            (UserId, UserLoginPerDay)
     VALUES (@UserId, GETDATE())
END

<强>阐释:
1。删除了@CurrentDateTime参数,因为它不需要从应用程序端传递
2。无需为变量分配当前日期和时间,然后在insert语句中使用它,因为我们可以直接在insert语句中将其用作GETDATE()
3。无需从UserId中找到dbo.aspnet_users,然后将其分配给参数变量并在insert语句中使用它。我们已经从应用程序端传递了UserId值作为参数@UserId,可以直接在insert语句中使用。

相关问题