使用c#在两个日期之间插入mysql数据

Posted

技术标签:

【中文标题】使用c#在两个日期之间插入mysql数据【英文标题】:Inserting mysql datas between 2 dates using c# 【发布时间】:2018-07-30 08:09:55 【问题描述】:
<asp:TextBox ID="txtstartdate" class="form-control" autocomplete="off" CssClass="datepicker1" runat="server"></asp:TextBox>

<asp:TextBox ID="txtenddate" class="form-control" autocomplete="off" CssClass="datepicker2" runat="server"></asp:TextBox>

<asp:TextBox id="txtreason" TextMode="multiline"  runat="server" />

<asp:Button ID="submit" CssClass="login" runat="server" Text="Submit" OnClick="Submit_click" />

使用 Submit_click 我想在 txtstartdate 和 txtenddate 上选择的 2 个日期之间将数据插入表中。 txtreason 应该对表格上的所有日期重复。

例如,如果在 txtstartdate 和 txtenddate 上选择日期 07/30/2018 和 08/04/2018 并输入“hello”作为 txtreason 的原因,我应该得到 07/30/2018 和 08/04/ 之间的所有日期数据表的 ldate 列中的 2018 和 hello 应该在每个单独的日期在 reason 列上重复 6 次。 如果您更改日期格式,下面的方法就像一个魅力。

protected void Submit_click(object sender, EventArgs e)

        DateTime startdate = Convert.ToDateTime(txtstartdate.Text);
        DateTime enddate = Convert.ToDateTime(txtenddate.Text);
        for (DateTime date = startdate; date <= enddate; date = date.AddDays(1))
        
            try
            
                string MyConString = "SERVER=localhost;DATABASE=mydb;UID=myid;PASSWORD=abc123;";
                mysqlConnection connection = new MySqlConnection(MyConString);
                string cmdText = "INSERT INTO approved(agentlogin ,leavetype ,date ,time, reason)VALUES ( @login, @type, @date, 'Full day', @reason)";
                MySqlCommand cmd = new MySqlCommand(cmdText, connection);
                cmd.Parameters.AddWithValue("@login", Label1.Text);
                cmd.Parameters.AddWithValue("@type", ddlleavetype.Text);
                cmd.Parameters.AddWithValue("@date", date);
                cmd.Parameters.AddWithValue("@reason", txtreason.Text);

                connection.Open();

                int result = cmd.ExecuteNonQuery();
                connection.Close();

                //lblError.Text = "Data Saved";

            
            catch (Exception)
            
                Console.Write("not entered");
                //lblError.Text = ex.Message;
            
        
    

【问题讨论】:

你的 MySQL 代码在哪里? 有可能吗? - 是的,可能,但我看到这里发生了很多危险且可以说是坏事,我不知道我会去哪里开始清理它。 @bradbury9 来解决 OP 提到的问题,你不需要知道表格是什么样子的。 @TimothyGroote OK,然后像 tsql 的递归 CTE + 插入。 你可以用一个insert命令插入多条记录,语法是insert into tableName (select that returns multiple rows)。这里的技巧是在select 部分中使用递归CTE,检查mysql CTE doc 以获取两个给定日期之间的记录,每天一个。顺便说一句,将其发布为评论而不是答案,因为这不是实际查询,只是一些指导。 【参考方案1】:

这就是为什么您应该使用模型,并使用正确的类型,而不是将所有内容都保留为 string

虽然不完美,但朝着正确方向迈出的一步应该是这样的: (请记住,我并没有解决每一个问题。还有大量需要改进的空间)

public class DateRangeModel

    public DateTime From get; set;
    public DateTime To   get; set;

    public IEnumerable<DateTime> DaysInRange 
        get
            for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1))
            
                yield date;
            
        
    

    public DateRangeModel(string from, string to)
    
        From = GetDate(from);
        To = GetDate(to);
    

    private static DateTime GetDate(string string_date)
    
        DateTime dateValue;
        if (DateTime.TryParse(string_date, out dateValue))
            return dateValue;
        else
            throw new Exception("Unable to convert '0' to a date.", string_date);

    


protected void Submit_click(object sender, EventArgs e)


    DateRangeModel dateRange = new DateRangeModel(txtstartdate.Text, txtenddate.Text);

    OleDbConnection scn = new OleDbConnection();
    scn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=/mysource;";

    foreach(var dt in dateRange.DaysInRange)
    
        OleDbCommand scmd = new OleDbCommand("Insert query", scn);
        scmd.CommandType = CommandType.Text;
        scmd.Parameters.Clear();
        scmd.Parameters.AddWithValue("@date1", dt);
        scmd.Parameters.AddWithValue("reason", txtreason);
        //etc (finish your insert stmt here).
      

【讨论】:

谢谢,但我怎样才能将值放入插入查询中? @PrakashKumar 这是一个不同的问题,您现在在问如何将插入到表中。您应该注意到我们只知道实际的表名和列名。 @bradbury9:当您更改代码时,请确保事先对其进行测试。您的编辑两次写入 To 但从未写入 From。 @BDL 感谢您的警告,请随时拒绝编辑或更正变量分配。【参考方案2】:

使用以下方法更改日期格式。希望这会有所帮助

protected void Submit_click(object sender, EventArgs e)

    DateTime startdate = Convert.ToDateTime(txtstartdate.Text);
    DateTime enddate = Convert.ToDateTime(txtenddate.Text);
    for (DateTime date = startdate; date <= enddate; date = date.AddDays(1))
    
        try
        
            var shtdate = date.ToShortDateString();
            string MyConString = "SERVER=localhost;DATABASE=mydb;UID=myid;PASSWORD=abc123;";
            MySqlConnection connection = new MySqlConnection(MyConString);
            string cmdText = "INSERT INTO approved(agentlogin ,leavetype ,date ,time, reason)VALUES ( @login, @type, @date, 'Full day', @reason)";
            MySqlCommand cmd = new MySqlCommand(cmdText, connection);
            cmd.Parameters.AddWithValue("@login", Label1.Text);
            cmd.Parameters.AddWithValue("@type", ddlleavetype.Text);
            cmd.Parameters.AddWithValue("@date", shtdate);
            cmd.Parameters.AddWithValue("@reason", txtreason.Text);

            connection.Open();

            int result = cmd.ExecuteNonQuery();
            connection.Close();

            //lblError.Text = "Data Saved";

        
        catch (Exception)
        
            Console.Write("not entered");
            //lblError.Text = ex.Message;
        
    

【讨论】:

以上是关于使用c#在两个日期之间插入mysql数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何提取两个日期之间的所有数据

如何在 MySQL 中的两个日期之间获取特定日期

MYSQL怎么查询两个时间之间的日期列表

SQL查询选择年份在两个日期之间的行

SQL语句如何判断一个日期在两个日期之间

将日期时间从 C# 插入到 SqlSrv