找到使用计数签到的方法

Posted

技术标签:

【中文标题】找到使用计数签到的方法【英文标题】:find the way to check in with count 【发布时间】:2019-08-09 14:13:00 【问题描述】:

您能帮我解决我的问题吗?我正在使用SQL Server数据库,它是一个体操程序,我想在客户来健身房时签到,我有两种方式提供第一种是每月方式,第二种是每天,第一个我没有问题,我使用此代码进行签入;

using (SqlCommand com = new SqlCommand("select count(*)from enddate where ID=@ID and startdate <=@C1 and endDate >=@C2", con))
                

                    com.Parameters.AddWithValue("@ID", ID.Text);
                    com.Parameters.AddWithValue("@C1", DateTime.Now);
                    com.Parameters.AddWithValue("@C2", DateTime.Now);

                    int count = (int)com.ExecuteScalar();
                    if (count > 0)
                    
                        using (SqlCommand com1 = new SqlCommand("INSERT INTO [checkin] (ID,time,username) VALUES (@ID,@time,@username)", con))
                        
                            com1.Parameters.AddWithValue("@ID", ID.Text);

                            com1.Parameters.AddWithValue("@time", txttime.Text);

                            com1.Parameters.AddWithValue("@username", txtusername.Text);
                            com1.ExecuteNonQuery();
                        
                        MetroFramework.MetroMessageBox.Show(this, "Check In Sucssesfuly ................... ", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
                    else
                    
                        MetroFramework.MetroMessageBox.Show(this, "this ID Expired .....................", "Message", MessageBoxButtons.OK, MessageBoxIcon.Warning);


                    
                    con.Close();
                

我想在此代码中添加第二个条件(每日报价)我有 enddate 表,例如 ;

| ID | Startdate | month | day | enddate |          offer       |
| 1  | 20-3-2019 |   3   |null |20-6-2019|( summer ) monthly    |
| 2  | 20-3-2019 | null  | 5   |20-3-2019|( student )  daily    |

在这种情况下,第一个可以随时来3个月,第二个ID他只能来5次。

我的签到表;

| ID |   Time   | username |
| 1  | 21-3-2019| test     |
| 1  | 25-3-2019| test     |
| 2  | 27-3-2019| test 2   | 

我可以数出他来健身房的次数,但我不知道如何将其添加到我的代码中

【问题讨论】:

一些提示:避免使用块嵌套SqlCommand - 将每一个视为该命令的范围,并尝试尽快完成每一个。您可能想阅读can we stop using AddWithValue。如果 con 是您的 SqlConnection,并且也在 using 块中,那么您不需要关闭它,因为它会在退出块时被隐式 Dispose 关闭。 @Richardissimo thx 我阅读了您的链接,我会尝试这样做:) @ahmed 你能告诉我们或解释一下你如何计算健身房的访问量吗? @ThorinOakenshield 签到表 @ahmed 可能会创建一个程序,在该程序中您将对不同的报价类型有不同的行为?比如:首先检查用户的报价类型,然后根据它计算访问次数? 【参考方案1】:

我认为您可能需要重新考虑解决问题的方法。如果我是你,我会:

    使用 ID.text 获取 enddate 表中的记录,我假设这是您的客户报价表。这样你就有了这个客户 ID 的 STARTDATE、ENDDATE、Offer 和其他信息。 如果 ENDDATE 为空且 Offer = 每天,则 ENDDATE = DATE(Datetime.Now) 使用 ID.text 计算签入表中的记录。因此,您可以使用以下语句获得总访问次数。

SELECT COUNT(*) From checkin WHERE Time &gt;= STARTDATE and (Time &lt;= ENDDATE)

    您现在有访问次数,您可以设置条件来检查客户是否已用完优惠“天” 5。

花了一点时间后,我尝试用 C# 完成你的整个逻辑:

var goodForVisit = false;
int visitedCount;
int offerDayCount;
var endDate = DateTime.MinValue;
DateTime startDate = DateTime.MinValue;

using (SqlCommand com = new SqlCommand("select * from [enddate] where ID=@ID", con))

    com.Parameters.AddWithValue("@ID", ID.Text);
    using (SqlDataReader reader = com.ExecuteReader())
    
        if (reader.Read())
        
            //get information from enddate table
            var offer = “”;
            if(reader[“offer”] != null)
                  offer = reader["offer"].ToString();
            if (reader[“day”] != null)
                  offerDayCount = (int)reader["day"];
            startDate = (DateTime)reader["Startdate"];
            if (reader["enddate"] != null)
                endDate = (DateTime)reader["enddate"];


            if (reader["enddate"] == null && offer == "dayly")
            
                endDate = DateTime.Now.Date;
            

            //count the visit from checkin table
            using (var com2 = new SqlCommand("SELECT COUNT(*) as count From checkin WHERE Time >= @STARTDATE and (Time <= @ENDDATE)"))
            
                com.Parameters.AddWithValue("@STARTDATE", startDate);
                com.Parameters.AddWithValue("@ENDDATE", endDate);

                using (SqlDataReader reader2 = com2.ExecuteReader())
                
                    if (reader2.Read())
                    
                        visitedCount = (int)reader2["count"];
                        if (offer == "dayly" && visitedCount < offerDayCount)
                            goodForVisit = true;

                        if (offer == "monthly" && DateTime.Now >= startDate && DateTime.Now <= endDate)
                            goodForVisit = true;
                    
                
            
        
    


if (goodForVisit)

    using (SqlCommand com1 = new SqlCommand("INSERT INTO [checkin] (ID,time,username) VALUES (@ID,@time,@username)", con))
    
        com1.Parameters.AddWithValue("@ID", ID.Text);

        com1.Parameters.AddWithValue("@time", txttime.Text);

        com1.Parameters.AddWithValue("@username", txtusername.Text);
        com1.ExecuteNonQuery();
    
    MetroFramework.MetroMessageBox.Show(this, "Check In Sucssesfuly ................... ", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);

else

    MetroFramework.MetroMessageBox.Show(this, "this ID Expired .....................", "Message", MessageBoxButtons.OK, MessageBoxIcon.Warning);

【讨论】:

好吧,我明白那场比赛(如果我将在我的代码中声明) 我尝试用 C# 编写逻辑,如果有任何错误或困惑,请告诉我。 1- 看兄弟,我有很多名称可供报价,而不仅仅是每天和每月,例如(3 个月,夏季,学生)2-'如果(读者 [“enddate”]!= null)'可以是' if (reader["enddate"] == "startdate")' ????? @ahmed ,您可以使用我的代码来扩展您的解决方案,因为大多数变量都已到位。 Read[“enddate”] == startdate 语句实际上取决于您如何将数据插入 enddate 表。总之,您的问题更有可能是软件架构问题,并且超出了您最初问题的范围 offerDayCount = (int)reader["day"];给我错误指定的演员表无效

以上是关于找到使用计数签到的方法的主要内容,如果未能解决你的问题,请参考以下文章

加速框架“签到”功能

这个开源项目有点意思,利用Github Actions实现贴吧自动签到!

微信扫二维码签到的流程和操作步骤?

如何为端点上的不同请求设置单独的计数器指标?

会议怎么实现二维码签到,最好是微信公众平台上的功能

使用 SwiftUI 设置 TabBar 项徽章计数