如果用户每天登录数据库表,我需要编写一个写入的函数。
每当用户登录我的网站时,我需要我的功能来触发并获取他的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
它不会向我的数据库写任何东西。我究竟做错了什么?这会写出我想要的正确数据吗?
答案 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语句中使用。