C# Sql server 2008跟踪用户是否每天登录

C# Sql server 2008跟踪用户是否每天登录,c#,sql,sql-server,C#,Sql,Sql Server,我需要编写一个函数,该函数将用户是否每天登录数据库表写入 每当一个用户登录到我的网站,我都需要我的函数启动并获取他的用户名和当前日期时间。如果用户在一天内登录两次,则必须再次启动该函数并编写新行。我需要的最终结果是一个包含每个登录名的数据库表,我可以每天对每个用户进行排序 这是我的函数,我在登录控件的LoggedIn事件中启动了它 CREATE PROCEDURE loginProc @UserId uniqueidentifier, @CurrentDateTime datet

我需要编写一个函数,该函数将用户是否每天登录数据库表写入

每当一个用户登录到我的网站,我都需要我的函数启动并获取他的用户名和当前日期时间。如果用户在一天内登录两次,则必须再次启动该函数并编写新行。我需要的最终结果是一个包含每个登录名的数据库表,我可以每天对每个用户进行排序

这是我的函数,我在登录控件的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
它不会向我的数据库写入任何内容。我做错了什么?这会写出我想要的正确数据吗

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(Insert/Update/Delete)语句


无需将当前时间戳作为参数传递,因为它可以在存储过程内部使用
GETDATE()
生成,并插入到日志表中您忘记了为参数赋值,并且在中,您编写的
@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
解释:
一,。删除了
@CurrentDateTime
参数,因为它不需要从应用程序端传递
二,。无需将当前日期和时间分配给变量,然后在insert语句中使用它,因为我们可以在insert语句中直接使用它作为
GETDATE()


三,。无需从
dbo.aspnet\u users
中找到
UserId
,然后将其分配给参数变量,并在insert语句中使用它。我们已经将
UserId
值作为参数
@UserId
从应用程序端传递过来,可以直接在insert语句中使用。

进行了哪些更改?为什么?
CREATE PROCEDURE loginProc
在顶部,当变量可以直接使用时,没有将
GETDATE()
放入变量中。@m hasan,当您在
@UserId
参数中有值时,从
dbo.aspnet\u Users
中选择
UserId
有什么用呢?很抱歉延迟,我在C#代码中调用过程时遇到了一些问题,花了一些时间来解决。然后我尝试了你的程序,效果非常好。谢谢你的帮助!我仍然有一个小问题,如果我使用一个已经登录过一次的用户登录(因此有一个已经在表中的用户ID),它将不会在表中添加另一条记录。我能做些什么来解决这个问题?为什么要从dbo.aspnet\u Users中选择UserId,其中@UserId=UserId?如果已经有UserId作为参数,为什么要从表中选择相同的值!?