0

我正在创建一个用户记录“滴答声”的小型服务。我遇到了一些问题,我的用户应该不能每天登录一次以上。这是我用于该检查的 SQL:

using (SqlCommand cmd = new SqlCommand())
                    {
                        cmd.Connection = conn;
                        cmd.CommandText = "SELECT * FROM TickLog WHERE Username = @username AND DATEPART(year, Inserted) = DATEPART(year, @date) AND DATEPART(month, Inserted) = DATEPART(month, @date) AND DATEPART(day, Inserted) = DATEPART(day, @date)";
                        cmd.Parameters.AddWithValue("@username", username);
                        cmd.Parameters.AddWithValue("@date", DateTime.Now);

                        int affectedRows = cmd.ExecuteNonQuery();

                        if (affectedRows > 0)
                            throw new Exception("allready registered");
                    }

表的结构很简单:

  • 标识,整数
  • 用户名,字符串
  • 已插入,日期
4

2 回答 2

2

ExecuteNonQuery()返回受 UPDATE、INSERT 或 DELETE 影响的行数。由于您只是在进行选择,因此它将始终返回 0 个受影响的行。尝试使用ExecuteReader()并检查返回结果是否有任何值。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx http://msdn.microsoft.com/en-us/library/9kcbe65k.aspx

或者,您可以将查询更改为SELECT COUNT(*)...并使用ExecuteScalar(),这将返回找到的行数(Object您可以将其转换为int)。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

于 2013-03-21T13:07:12.357 回答
1

这有效,并且性能略好:

using (var cmd = new SqlCommand())
{
    cmd.CommandText = @"CASE
        WHEN EXISTS (
            SELECT
                *
            FROM
                TickLog TL
            WHERE
                TL.Username = @username
                AND TL.Inserted BETWEEN @date AND DATEADD(DAY, 1, DATEADD(MILLISECOND, -3, @date))
            ) THEN 1
        ELSE 0
    END";

    cmd.Parameters.AddWithValue("@username", username);
    cmd.Parameters.AddWithValue("@date", DateTime.Date);

    var exists = cmd.ExecuteScalar();

    if (exists != 0)
    {
        throw new Exception("already registered");
    }
}

解释:

  • EXISTS是最好的选择,您不需要从数据库中获取整个记录。
  • TL.Inserted应该是一个索引列,但是当你使用时DATEPART你不会使用任何索引。

有关使用 -3 毫秒的原因,请参阅StackOverflow 答案和博客文章。

于 2013-03-21T13:36:16.873 回答