【问题标题】:Read datetime from Database and time change从数据库中读取日期时间并更改时间
【发布时间】:2017-12-20 15:24:05
【问题描述】:

谁能帮我解决这个问题,我想从查询列 ZPZ_Von 获取数据,输入我放入循环的新时间并在 datagridview 中打印,我目前遇到错误(System.InvalidOperationException:“此命令已经有一个与之关联的打开的 DataReader,必须先关闭它。").. 我能做什么?

这是我在按钮中的代码。

using (SqlConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["TestControl.Properties.Settings.DB"].ConnectionString))
        {
            boAPI4.Login login = new boAPI4.Login();
            string cS = login.GetConnectionString();
            DataAccess dA = new DataAccess(cS);
            int userID = dA.getLpeID(login.GetBoUserNr());
            PRAESENZZEIT q = new PRAESENZZEIT();

            q.ZPZ_LPE_ID = userID;
            if (db.State == ConnectionState.Closed)
                db.Open();
            string query = "SELECT zei.ZPZ_Von, zei.ZPZ_Bis, per.LPE_Nr, zei.ZPZ_LPE_ID, zei.ZPZ_Datum, SUM (zei.ZPZ_Std100) AS ZPZ_Std100" +
                           " FROM DB.dbo.Z_PRAESENZZEIT zei INNER JOIN DB.dbo.A_PERSONAL per ON zei.ZPZ_LPE_ID = per.LPE_ID" +
                            $" WHERE zei.ZPZ_Datum BETWEEN '{dtFromDate.Value}' AND '{dtToDate.Value}' AND zei.ZPZ_LPE_ID='{userID.ToString()}' GROUP BY per.LPE_Nr, zei.ZPZ_LPE_ID, zei.ZPZ_Datum, zei.ZPZ_Von, zei.ZPZ_Bis ORDER BY zei.ZPZ_Datum, per.LPE_Nr;";

            using (SqlCommand cmd = new SqlCommand(query, db))
            {
                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        var items = new List<PRAESENZZEIT>();
                        while (dr.Read())
                        {
                            PRAESENZZEIT pra = new PRAESENZZEIT();

                            pra.ZPZ_Von = Convert.ToDateTime(dr["ZPZ_Von"]);
                            if (pra.ZPZ_Von.TimeOfDay < new TimeSpan(8, 5, 0))
                                pra.ZPZ_Von = new DateTime(pra.ZPZ_Von.Year, pra.ZPZ_Von.Month, pra.ZPZ_Von.Day, 8, 0, 0);

                            // DateTime gehen = DateTime.Now;
                            pra.ZPZ_Bis = Convert.ToDateTime(dr["ZPZ_Bis"]);
                            pra.arbeitszeit = pra.ZPZ_Bis - pra.ZPZ_Von;
                        }
                        pRAESENZZEITBindingSource.DataSource = items;
                    }
                }
            }

这是我的班级 PRAESENZEIT

 public class PRAESENZZEIT
{
    public int LPE_Nr { get; set; }
    public DateTime ZPZ_Datum { get; set; }
    public double ZPZ_Std100 { get; set; }
    public int ZPZ_LPE_ID { get; set; }

    public DateTime ZPZ_Von { get; set; }
    public DateTime ZPZ_Bis { get; set; }
    public DateTime ZPZ_Std { get; set; }

    public int ZPZ_ID { get; set; }
    public int ZPZ_Jahr { get; set; }
    public int ZPZ_Monat { get; set; }
    public int ZPZ_Tag { get; set; }
    public DateTime ZPZ_ERFDAT { get; set; }
    public string ZPZ_ERFUSER { get; set; }
    public DateTime ZPZ_MUTDAT { get; set; }
    public string ZPZ_MUTUSER { get; set; }
    public TimeSpan arbeitszeit { get; set; }
}

这是数据库数据

谢谢大家的帮助

【问题讨论】:

  • 在您的while 循环中,您正在创建PRAESENZZEIT 的实例,操作一些日期并且对它们根本不做任何事情。是否要将更改的属性保存到数据库?最后一行db.Query 不会获取新时间的数据,因为您没有将其持久化到数据库中。
  • 我不想记录更改,只是在新时间(我在循环中提到的时间)读取数据网格时显示它们
  • 好的。你想在网格中显示arbeitszeit 值吗?你能在PRAESENZZEIT 类中创建一个属性来分配这个值(而不是一个变量)吗?
  • 我在class里面加了property,改了代码,现在看看怎么调用好吗?

标签: c# sql datagridview


【解决方案1】:

由于您不想将更改持久化到数据库中,您可以将创建的对象存储在 List 中,并将其用作数据源:

using(SqlCommand cmd = new SqlCommand(query, db))
{
    using(SqlDataAdapter da = new SqlDataAdapter(cmd))
    {
        using(SqlDataReader dr = cmd.ExecuteReader())
        {

            var items = new BindingList<PRAESENZZEIT>();

            while (dr.Read())
            {
                PRAESENZZEIT pra = new PRAESENZZEIT();

                pra.ZPZ_Von = Convert.ToDateTime(dr["ZPZ_Von"]);
                if (pra.ZPZ_Von.TimeOfDay < new TimeSpan(8, 5, 0))
                    pra.ZPZ_Von = new DateTime(pra.ZPZ_Von.Year, pra.ZPZ_Von.Month, pra.ZPZ_Von.Day, 8, 0, 0);

                // DateTime gehen = DateTime.Now;
                pra.ZPZ_Bis = Convert.ToDateTime(dr["ZPZ_Bis"]);
                pra.arbeitszeit = pra.ZPZ_Bis - pra.ZPZ_Von;
            }

            pRAESENZZEITBindingSource.DataSource = items;
        }
    }
}

您只需在您的类中添加一个新属性arbeitszeit 来存储pra.ZPZ_Bis - pra.ZPZ_Von 结果(如果您愿意的话)。

请注意,我为所有实现的对象添加了using 语句 IDisposable,就像你已经为 SqlConnection 做的那样。

【讨论】:

  • 谢谢你的帮助,可惜我还没有得到结果,现在点击按钮什么都没有
  • 嗯,尝试使用BindingList 而不是List。我编辑了答案。
猜你喜欢
  • 2012-10-21
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
相关资源
最近更新 更多