C# 表中的会话太多,无法生成新会话

C# 表中的会话太多,无法生成新会话,c#,sql-server,C#,Sql Server,我编写了一个简单的函数,在登录时生成一个会话变量,并将其存储在sql数据库的会话表中。它在99%的时间内都能正常工作,但偶尔会出现会话表被填满的情况,因为登录页面会重定向到主页,就像正确登录一样,但是不会创建会话,web应用程序中的任何页面上都不会显示用户数据 通过Sql Server Mgmt Studio直接访问会话表并手动删除该用户名下的所有现有会话似乎可以在短期内纠正问题,但是我想知道问题的原因,以及如何修改代码以防止将来出现问题 任何关于如何改进我的方法的建设性建议都是欢迎的 谢谢 这

我编写了一个简单的函数,在登录时生成一个会话变量,并将其存储在sql数据库的会话表中。它在99%的时间内都能正常工作,但偶尔会出现会话表被填满的情况,因为登录页面会重定向到主页,就像正确登录一样,但是不会创建会话,web应用程序中的任何页面上都不会显示用户数据

通过Sql Server Mgmt Studio直接访问会话表并手动删除该用户名下的所有现有会话似乎可以在短期内纠正问题,但是我想知道问题的原因,以及如何修改代码以防止将来出现问题

任何关于如何改进我的方法的建设性建议都是欢迎的

谢谢

这是我的简历:

以下是插入会话ID的存储过程:

CREATE PROCEDURE [dbo].[spInsertSessionId]
    @username       VARCHAR(200)    =   NULL    ,
    @UserId         VARCHAR(200)    =   NULL    ,
    @createdate     VARCHAR(200)    =   NULL    ,
    @SessionId      VARCHAR(200)    =   NULL

AS
BEGIN
SELECT 
    @UserId     =   user_id
FROM dbo.users
    WHERE
        username    =   @username

INSERT INTO dbo.session
(
    UserId          ,
    CreateDate      ,
    SessionId
)
VALUES 
(
    @userid         ,
    @createdate     ,
    @SessionId
)

DELETE FROM dbo.session 
        WHERE UserId = @UserId
            AND SessionId NOT IN 
            (
            SELECT TOP(5) SessionId FROM dbo.session 
                WHERE UserId    =   @UserId
                ORDER BY CreateDate DESC
            )
END

尝试将应用程序配置为使用
并使用aspnet\u regsql.exe配置数据库表,然后使用会话[“key”]集合存储数据。然后应用程序将管理会话本身。如果您对此不满意,您可以随时编写自定义会话提供程序。

根据提供的信息,我猜想问题出在spInsertSessionId过程中。插入会话后,删除“旧”会话,只保留CreateDate DESC排序的前5个会话。但是,如果不使用具有此属性的datetime格式,则CreateDate列使用varchar,并且字符串的排序方式不保证与日期相同。在您的情况下,只需执行DateTime.Now.ToString(),这甚至取决于您的文化背景。所以,在某些情况下,您刚刚插入的会话可能不在您的条件排序的前5位,因此在创建后立即删除。即使不是这样,也不要使用varchar来存储日期

样本:

 declare @d1 varchar(max) = '10/21/2016 00:00:00';
 declare @d2 varchar(max) = '10/22/2015 00:00:00';
 select (case when @d1 > @d2 then 1 else 0 end)

这里d1明显晚于d2,但查询返回“0”。这些日期来自具有不变区域性的DateTime.ToString()。

您的数据库中的CreateDate类型是DateTime吗?一般来说,没有“填充”的数据库表-在某些边缘情况下,由于表()中记录的数量,您可能会遇到错误,但是有东西告诉我你不是那种情况…@Evk-No.CreateDate是VarChar类型。我使用varchar来消除c#datetime字符串和中datetime字段的允许条目之间的格式差异问题Sql@PrestonGuillot我可能说错了,说桌子“满了”。我完全不知道是什么导致了这个错误。
 declare @d1 varchar(max) = '10/21/2016 00:00:00';
 declare @d2 varchar(max) = '10/22/2015 00:00:00';
 select (case when @d1 > @d2 then 1 else 0 end)