【发布时间】: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