CLR 无法从 COM 上下文 0x1b2518 转换为 COM 上下文 0x1b2688,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。息。 我这个程序运行时有时也会有这个错误,不知道是什么原因?
DataRow[] drs = ds.Tables["分等因子得分表"].Select("编号=" + bianhao); foreach ( DataRow dr in drs) { dr[objname] = fenzhi; }
foreach中是只读操作,可以这样赋值么?
//cmd.CommandText = "update 分等因子得分表 set " + objname + "=" + fenzhi + " where 编号=" + bianhao; //cmd.ExecuteNonQuery(); //程序是可以运行的。并且正确。 DataRow[] drs = ds.Tables["分等因子得分表"].Select("编号=" + bianhao); foreach ( DataRow dr in drs) { dr[objname] = fenzhi; } //程序是不可以运行的。
DataRow[] drs = ds.ds.Tables["分等因子得分表"].Select(条件);
然后再去修改drs里面的值
foreach(DataRow dr in drs)
{
dr["defen"] = fenzhi
}
foreach ( DataRow dr in drs)
{
dr[objname] = fenzhi;
}
改为这样后可以运行在更新时出现这样的错误。
DataTable“分等因子得分表”中缺少 SourceColumn“源表名称”的 DataColumn“源表名称”。
OleDbCommand cmd = con.CreateCommand();
//从数据表中得到数据.
//将数据表存入DataSet中
//将数据库填充到缓存中
ds.Tables.Clear();
ad.SelectCommand = new OleDbCommand("SELECT * FROM 分等因子得分表", con);
ad.MissingSchemaAction = MissingSchemaAction.AddWithKey;
ad.Fill(ds, "分等因子得分表");
ad.SelectCommand = new OleDbCommand("SELECT * FROM 分等因子数据表", con);
ad.Fill(ds, "分等因子数据表");
ad.SelectCommand = new OleDbCommand("SELECT * FROM 分等作物规则库", con);
ad.Fill(ds, "分等作物规则库");
ad.SelectCommand = new OleDbCommand("SELECT * FROM 计算表", con);
ad.Fill(ds, "计算表");
OleDbCommandBuilder objcmdBuilder = new OleDbCommandBuilder(ad);
ad.UpdateCommand = objcmdBuilder.GetUpdateCommand();
ad.InsertCommand = objcmdBuilder.GetInsertCommand();
ad.DeleteCommand = objcmdBuilder.GetDeleteCommand();
int max = ds.Tables["分等作物规则库"].Rows.Count;
progressBar1.Minimum = 0;
progressBar1.Maximum = max;
progressBar1.BackColor = Color.Green;
progressBar1.Visible = true;
lblProgress.Visible = true;
foreach(DataRow drgz in ds.Tables["分等作物规则库"].Select("1>0"))
{
string zwname = drgz["作物名称"].ToString();
int fenzhi = Convert.ToInt16(drgz["分值"]);
foreach (DataRow drjs in ds.Tables["计算表"].Select("是否计算=1"))
{
string oldname = drjs["源字段名称"].ToString();
string objname = drjs["目标表字段"].ToString();
string gzz = drgz[oldname].ToString();
if (gzz != "")
{
foreach (DataRow drsj in ds.Tables["分等因子数据表"].Select("作物名称= '" + zwname + "' and " + oldname + " = '" + gzz+"'"))
{
int bianhao = Convert.ToInt32(drsj["编号"]);
//cmd.CommandText = "update 分等因子得分表 set " + objname + "=" + fenzhi + " where 编号=" + bianhao;
//cmd.ExecuteNonQuery();
DataRow[] drs = ds.Tables["分等因子得分表"].Select("编号=" + bianhao);
foreach ( DataRow dr in drs)
{
dr[objname] = fenzhi;
}
} } }
progressBar1.Value++;
lblProgress.Text = Convert.ToString(progressBar1.Value * 100 / max) + "%";
Application.DoEvents();
}
ad.Update(ds,"分等因子得分表");
textBox1.Text = "已更新记录";
if (progressBar1.Value == max)
{
MessageBox.Show("已完成更新!", "完成提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
DataRow[] drs = ds.Tables["分等因子得分表"].Select("编号=" + bianhao);
foreach ( DataRow dr in drs)
{
dr[objname] = fenzhi;
}
//cmd.ExecuteNonQuery();
//程序是可以运行的。并且正确。
DataRow[] drs = ds.Tables["分等因子得分表"].Select("编号=" + bianhao);
foreach ( DataRow dr in drs)
{
dr[objname] = fenzhi;
}
//程序是不可以运行的。