我想做一个进度条,实时显示进度,自己做的只有在结束时进度条立刻变满,执行时还是假死状态,下面代码的作用是将表A的内容复制到表B中,窗体只有一个,进度条控件就放在主窗体上using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OracleClient;
using System.Data.OleDb;
using System.IO;
using System.Threading;namespace WindowsFormsApplication5
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
private void SleepT() //关于进度条的代码都是网上的,大家帮我看看怎么改
{
for (int i = 0; i < 500; i++)
{
System.Threading.Thread.Sleep(100);//没什么意思,单纯的执行延时
SetTextMessage(100 * i / 500);
}
} private delegate void SetPos(int ipos);
private void SetTextMessage(int ipos)
{
if (this.InvokeRequired)
{
SetPos setpos = new SetPos(SetTextMessage);
this.Invoke(setpos, new object[] { ipos });
}
else
{
//this.progress.Text = ipos.ToString() + "/100";
this.progressBar1.Value = Convert.ToInt32(ipos);
}
} private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
} private void btnOK_Click(object sender, EventArgs e)
{
Thread fThread = new Thread(new ThreadStart(SleepT));//开辟一个新的线程
fThread.Start();
string souConStr = "Data Source=" + txtSouDB.Text + ";User ID=" + txtSouUser.Text + ";Password=" + txtSouPwd.Text + ";";
string tarConStr = "Data Source=" + txtTarDB.Text + ";User ID=" + txtTarUser.Text + ";Password=" + txtTarPwd.Text + ";";
if (txtSouTbl.Text.Trim() == "" )
{
CommFun.ShowError("不能为空", "复制");
return;
}
DBOracle dboraCons = new DBOracle(souConStr);
DBOracle dboraSDE = new DBOracle(tarConStr);
if (dboraCons.Conn == null)
{
CommFun.ShowError("无法连接源数据库", "警告");
return;
}
else if(dboraSDE.Conn==null)
{
CommFun.ShowError("无法连接目标数据库", "警告");
return;
}
try
{
string sqlstr = string.Format("select * from {0}", txtSouTbl.Text); //获取表A的数据
OracleCommand cmd = new OracleCommand(sqlstr, dboraCons.Conn);
OracleDataReader reader = cmd.ExecuteReader(); sqlstr = string.Format("select * from {0}", txtTarTbl.Text);
OracleDataAdapter adpter = new OracleDataAdapter(sqlstr, dboraSDE.Conn);
OracleCommandBuilder cmdBuilder = new OracleCommandBuilder(adpter);
DataSet ds = new DataSet();
adpter.Fill(ds);
DataTable dt = ds.Tables[0];
int oid = 0,count = 0;
while (reader.Read())
{
DataRow dr = dt.NewRow();
foreach (DataColumn dc in dt.Columns)
{
if (dc.ColumnName.ToUpper() == "OBJECTID")
{
dr["OBJECTID"] = oid++;
}
else if (dc.DataType.FullName.ToUpper()=="SYSTEM.BYTE[]" && reader[dc.ColumnName]!=DBNull.Value)
{
//Byte[] image = (Byte[])reader[dc.ColumnName]; //存取图片,效率贼低囧
//dr[dc.ColumnName] = image;
}
else
{
dr[dc.ColumnName] = reader[dc.ColumnName];
}
}
dt.Rows.Add(dr);
count++; //计数器每到一百update一次,不知道这样会快还是慢
if (count == 100)
{
adpter.Update(dt);
count = 0;
}
}
adpter.Update(dt);
reader.Close();
cmd.Dispose();
}
finally
{
dboraCons.CloseDB();
dboraSDE.CloseDB();
MessageBox.Show("数据传输完成!");
}
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OracleClient;
using System.Data.OleDb;
using System.IO;
using System.Threading;namespace WindowsFormsApplication5
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
private void SleepT() //关于进度条的代码都是网上的,大家帮我看看怎么改
{
for (int i = 0; i < 500; i++)
{
System.Threading.Thread.Sleep(100);//没什么意思,单纯的执行延时
SetTextMessage(100 * i / 500);
}
} private delegate void SetPos(int ipos);
private void SetTextMessage(int ipos)
{
if (this.InvokeRequired)
{
SetPos setpos = new SetPos(SetTextMessage);
this.Invoke(setpos, new object[] { ipos });
}
else
{
//this.progress.Text = ipos.ToString() + "/100";
this.progressBar1.Value = Convert.ToInt32(ipos);
}
} private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
} private void btnOK_Click(object sender, EventArgs e)
{
Thread fThread = new Thread(new ThreadStart(SleepT));//开辟一个新的线程
fThread.Start();
string souConStr = "Data Source=" + txtSouDB.Text + ";User ID=" + txtSouUser.Text + ";Password=" + txtSouPwd.Text + ";";
string tarConStr = "Data Source=" + txtTarDB.Text + ";User ID=" + txtTarUser.Text + ";Password=" + txtTarPwd.Text + ";";
if (txtSouTbl.Text.Trim() == "" )
{
CommFun.ShowError("不能为空", "复制");
return;
}
DBOracle dboraCons = new DBOracle(souConStr);
DBOracle dboraSDE = new DBOracle(tarConStr);
if (dboraCons.Conn == null)
{
CommFun.ShowError("无法连接源数据库", "警告");
return;
}
else if(dboraSDE.Conn==null)
{
CommFun.ShowError("无法连接目标数据库", "警告");
return;
}
try
{
string sqlstr = string.Format("select * from {0}", txtSouTbl.Text); //获取表A的数据
OracleCommand cmd = new OracleCommand(sqlstr, dboraCons.Conn);
OracleDataReader reader = cmd.ExecuteReader(); sqlstr = string.Format("select * from {0}", txtTarTbl.Text);
OracleDataAdapter adpter = new OracleDataAdapter(sqlstr, dboraSDE.Conn);
OracleCommandBuilder cmdBuilder = new OracleCommandBuilder(adpter);
DataSet ds = new DataSet();
adpter.Fill(ds);
DataTable dt = ds.Tables[0];
int oid = 0,count = 0;
while (reader.Read())
{
DataRow dr = dt.NewRow();
foreach (DataColumn dc in dt.Columns)
{
if (dc.ColumnName.ToUpper() == "OBJECTID")
{
dr["OBJECTID"] = oid++;
}
else if (dc.DataType.FullName.ToUpper()=="SYSTEM.BYTE[]" && reader[dc.ColumnName]!=DBNull.Value)
{
//Byte[] image = (Byte[])reader[dc.ColumnName]; //存取图片,效率贼低囧
//dr[dc.ColumnName] = image;
}
else
{
dr[dc.ColumnName] = reader[dc.ColumnName];
}
}
dt.Rows.Add(dr);
count++; //计数器每到一百update一次,不知道这样会快还是慢
if (count == 100)
{
adpter.Update(dt);
count = 0;
}
}
adpter.Update(dt);
reader.Close();
cmd.Dispose();
}
finally
{
dboraCons.CloseDB();
dboraSDE.CloseDB();
MessageBox.Show("数据传输完成!");
}
}
}
}
解决方案 »
- 关于webbrowser自动点击
- Server Error in '/' Application.
- 调用更新数据库记录的存储过程,但数据库记录却不更新(40分)
- 如何獲得動態產生的控件的值
- <font color=\"red\">一个显示繁忙信息窗体和背后线程处理 委托等的问题</font>
- C#题,请赐教
- 求WinForm下,窗体上的控件随窗体缩放而自动缩放的控件
- 郁闷打印问题,请高手指教-----非常郁闷
- 怎样才能让SqlCommand可以接受SQL Server的GO语句?
- 敢问高手:邮件服务器之间如何通讯?
- 数据库 job 的修改。。15分钟执行一次。怎么写
- VB中的 READ = Space$(50) 用C# 怎么写?
{
for (int i = 0; i < 500; i++)
{
Application.DoEvents(); System.Threading.Thread.Sleep(100);//没什么意思,单纯的执行延时
SetTextMessage(100 * i / 500);
}
}
{
progressBar1.Value = 0;
progressBar1.Maximum = 100;
//假设个例子,模拟效果
new Thread((ThreadStart)delegate
{
int i = 100;
while (i-->0)
{
Thread.Sleep(10);//暂停一下,要有个效果嘛。
//invoke同步ui线程更新ProgressBar
this.Invoke((EventHandler)delegate { progressBar1.Value++; });
}
Thread.Sleep(10);
this.Invoke((EventHandler)delegate { MessageBox.Show("Demo run over"); });
}).Start();
}