WinForm應用程序中實現自動更新功能
編寫人:左丘文
2015-4-20
近來在給一客戶實施ECM系統,但他們使用功能並不是我們ECM制造版提供的標准功能,他們要求對系統作一些定制功能,為了避免因程序的bug而帶來頻繁讓用戶更新程序的不良影響,就想給ECM增加一個winform自動更新功能,今天在這里,我想與大家一起分享代碼,在此做個小結,以供參考。有興趣的同學,可以一同探討與學習一下,否則就略過吧。
1、 首先我們在這里先分析一下其它程序猿的一些基本情況:
相信有許多程序猿都喜歡用Winform做開發吧?!因為Winform相對Webform而言,優點是,功能更強大,編程更方便.但是它的缺點,就是軟件的安裝及維護是相當麻煩地,要實現軟件更新,需要到客戶端一台一台地升級。
長期以來,廣大程序猿為到底是使用Client/Server,還是使用Browser/Server結構爭論不休,在這些爭論當中,C/S結構的程序可維護性差,布置困難,升級不方便,維護成本高就是一個相當重要的因素。有很多企業用戶就是因為這個原因而放棄使用C/S。然而當一個應用必須要使用C/S結構才能很好的實現其功能的時候,我們該如何解決客戶端的部署與自動升級問題?部署很簡單,只要點擊安裝程序即可,難的在於每當有新版本發布時,能夠實現自動升級。現在好了,我們的目標很簡單,我們希望開發一個與具體應用無關的能夠復用的自動升級系統。下面我為大家提供了一套可復用的用C#實現在線升級。這里分為本地在線升級,也可以利用webservice 在線通過互聯網與軟件開商的服務器在線升級。
2、 實現軟件自動在線升級的原理:
1) 寫三個程序,一個是主程序;兩個是升級程序;所有升級任務都由升級程序完成
原本只需要一個升級程序,但在這里,由於我們另外還涉及到了,在線與軟件供應商服務器更新功能,因此我們這里用到了一個主程序兩個升級程序。
2) 很多人實行的原理是將現有版本與最新版本作比較,發現最新的則提示用戶是否升級,當然也有人用其它屬性比較的,例如:文件大小或者更新日期。我們這里主要利用FileUtil的兩個屬性SHA1File與MD5File來判斷,與服務器之間是否存在版本差異,存在就更新。
3) 我們的程序,剛開始初始版本是我一同事利用了三天時間,大致寫了一個框架出來,我是在他的基礎上,對其進行了完善,如增加了對文件流的壓縮與解壓縮功能,方便進行網絡的傳輸,增加了通過webservices的在線更新功能。並將程序做到通用功能,並嵌套到了我們的ECM系統中。
3、 軟件更新操作界面:
1) 啟動我們的主程序ECM
2) 系統會從數據庫中檢查是否有新版本,點點【否】會直接進入系統,點【是】系統會進入到更新介面:
先擇需要更新的內容,點擊更新,系統會自動更新相關程序。
3) 與軟件供應商服務器在線更新介面:
操作類似於在線本地更新一樣。
具體就需要各位好好的自已去調試了。
4、 更新程序的代碼:
1) 我們的更新程序是以文件流的形式存放在數據庫中,因此我們首先需要為系統數據庫增加相關的表,用於存儲更新文件。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[SysUpdate](
[ID] [ int] IDENTITY( 1, 1) NOT NULL,
[FileName] [varchar]( 250) NULL,
[FileVersion] [varchar]( 50) NULL,
[FilePath] [varchar]( 250) NULL,
[FileData] [varbinary](max) NULL,
[FileSize] [varchar]( 250) NULL,
[FileDate] [varchar]( 250) NULL,
[FileType] [varchar]( 50) NULL,
[FilesHash] [varchar](max) NULL,
[FilesMD5] [varchar](max) NULL,
[UpdateBit] [bit] NULL,
[RegBit] [bit] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
--建立插入SP
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[Insert_UpdateFile] @filename varchar( 250),@fileversion varchar( 50),@filepath varchar( 250),@filesize varchar( 250),@filedate varchar( 250),@filetype varchar( 50),@fileshash varchar( 250),@filesmd5 varchar( 250),@file varbinary(Max)
as
insert into SysUpdate ([FileName],[FileVersion],[FilePath],[FileSize],[FileDate],[FileType],[UpdateBit],[RegBit],[FilesHash],[FilesMD5],[FileData])
select @filename,@fileversion,@filepath,@filesize,@filedate,@filetype, 1, 0,@fileshash,@filesmd5,@file
2) 整體程序框架圖如下:
3) 上傳功能代碼:

{
public partial class frmSysUpdateUp : Form
{
private string updateUrl = string.Empty;
private string tempUpdatePath = string.Empty;
WinBase.Common W1 = new WinBase.Common();
public frmSysUpdateUp()
{
InitializeComponent();
}
private void frmSysUpdateUp_Load( object sender, EventArgs e)
{
// 數據庫SysUpdate表 顯示需要更新內容
dgvList.ColumnCount = 9;
dgvList.AutoGenerateColumns = false;
DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxColumn newColumn2 = new DataGridViewCheckBoxColumn();
dgvList.Columns.Insert( 0, newColumn);
dgvList.Columns.Insert( 10, newColumn1);
dgvList.Columns.Insert( 11, newColumn2);
this.SetdgvListHeadText();
string strSQL41 = " SELECT * FROM SysUpdate order by ID; ";
DataSet ds = W1.DS(strSQL41, " Sys ");
dgvList.DataSource = ds.Tables[ 0].DefaultView;
this.DataBinding();
dgvList.Columns[ 0].Frozen = true;
dgvList.Columns[ 1].Frozen = true;
dgvList.Columns[ 2].Frozen = true;
dgvList.Columns[ 3].Frozen = true;
// dgvList.Columns[4].Frozen = true;
}
private void SetdgvListHeadText()
{
dgvList.Columns[ 0].HeaderText = " 選擇 ";
dgvList.Columns[ 0].Width = 50;
dgvList.Columns[ 1].HeaderText = " ID ";
dgvList.Columns[ 1].Width = 20;
dgvList.Columns[ 1].ReadOnly = true;
dgvList.Columns[ 2].HeaderText = " 組件名 ";
dgvList.Columns[ 2].Width = 120;
dgvList.Columns[ 2].ReadOnly = true;
dgvList.Columns[ 3].HeaderText = " 版本號 ";
dgvList.Columns[ 3].Width = 80;
dgvList.Columns[ 3].ReadOnly = true;
dgvList.Columns[ 4].HeaderText = " 大小 ";
dgvList.Columns[ 4].Width = 100;
dgvList.Columns[ 4].ReadOnly = true;
dgvList.Columns[ 5].HeaderText = " 創建日期 ";
dgvList.Columns[ 5].Width = 150;
dgvList.Columns[ 5].ReadOnly = true;
dgvList.Columns[ 6].HeaderText = " 哈希值 ";
dgvList.Columns[ 6].Width = 250;
dgvList.Columns[ 6].ReadOnly = true;
dgvList.Columns[ 7].HeaderText = " MD5值 ";
dgvList.Columns[ 7].Width = 250;
dgvList.Columns[ 7].ReadOnly = true;
dgvList.Columns[ 8].HeaderText = " 目錄 ";
dgvList.Columns[ 8].Width = 80;
dgvList.Columns[ 8].ReadOnly = true;
dgvList.Columns[ 9].HeaderText = " 文件類型 ";
dgvList.Columns[ 9].Width = 80;
dgvList.Columns[ 9].ReadOnly = true;
dgvList.Columns[ 10].HeaderText = " 是否更新 ";
dgvList.Columns[ 10].Width = 80;
// dgvList.Columns[10].ReadOnly = true;
dgvList.Columns[ 11].HeaderText = " 是否需要注冊 ";
dgvList.Columns[ 11].Width = 110;
// dgvList.Columns[11].ReadOnly = true;
}
private string Byte2String( byte[] arrByte)
{
StringBuilder sb = new StringBuilder();
foreach ( byte b in arrByte)
{
sb.Append(b > 15 ? Convert.ToString(b, 16) : ' 0 ' + Convert.ToString(b, 16));
}
return sb.ToString();
}
private void DataBinding()
{
// ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
dgvList.Columns[ 0].DataPropertyName = " Check1 ";
dgvList.Columns[ 1].DataPropertyName = " ID ";
dgvList.Columns[ 2].DataPropertyName = " FileName ";
dgvList.Columns[ 3].DataPropertyName = " FileVersion ";
dgvList.Columns[ 4].DataPropertyName = " FileSize ";
dgvList.Columns[ 5].DataPropertyName = " FileDate ";
dgvList.Columns[ 6].DataPropertyName = " FilesHash ";
dgvList.Columns[ 7].DataPropertyName = " FilesMD5 ";
dgvList.Columns[ 8].DataPropertyName = " FilePath ";
dgvList.Columns[ 9].DataPropertyName = " FileType ";
dgvList.Columns[ 10].DataPropertyName = " UpdateBit ";
dgvList.Columns[ 11].DataPropertyName = " RegBit ";
}
private void ListDate()
{
string strSQL41 = " SELECT * FROM SysUpdate order by ID ; ";
DataSet ds = W1.DS(strSQL41, " Sys ");
dgvList.DataSource = ds.Tables[ 0].DefaultView;
this.DataBinding();
}
private void btnUpload_Click( object sender, EventArgs e)
{
txtFileText.Text = "";
openFileDialog1.InitialDirectory = " d:\\ ";
openFileDialog1.Filter = " 文件(*.*)|*.* ";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
txtFileText.Text = openFileDialog1.FileName;
// 文件名稱
String S = System.IO.Path.GetFileName(openFileDialog1.FileName);
// 文件格式
// String FileType = System.IO.Path.GetExtension(openFileDialog1.FileName);
string SHA1 = "";
string md5 = "";
SHA1 = FileUtil.SHA1File(txtFileText.Text.ToString()); // 這個消息摘要可以用來驗證數據的完整性
md5 = FileUtil.MD5File(txtFileText.Text.ToString());
try
{
if (FileUtil.IsInUse(txtFileText.Text.ToString()))
{
MessageBox.Show( " 文件已經使用中,無法上傳! ", " 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (FileUtil.FileIsReadOnly(txtFileText.Text.ToString()))
{
FileUtil.SetFileReadonly(txtFileText.Text.ToString(), false);
}
FileStream fs = new FileStream(txtFileText.Text.ToString(), FileMode.Open);
int streamLength = ( int)fs.Length; // 獲取文件流的長度。
byte[] image = new byte[streamLength]; // 聲明字節數組,用於保存圖片文件
fs.Read(image, 0, streamLength); // 把圖片文件轉換成為字節數組保存
fs.Close();
// 文件版本號
FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(txtFileText.Text.ToString());
FileInfo file = new FileInfo(txtFileText.Text.ToString());
// byte[] args0 = Common.SharpZip.CompressB(image);
byte[] args0 = Common.SharpZip.ICGzipCompress(image);
// 創建文件流,path參數是文件路徑
string strSQL2 = " exec Insert_UpdateFile ' " + S + " ',' " + fileVersion.FileVersion + " ','',' " + file.Length + " ',' " + file.CreationTime + " ',' " + file.Extension + " ',' " + SHA1 + " ',' " + md5 + " ',0x " + Byte2String(args0) + "";
// string strSQL2 = "exec Insert_UpdateFile '" + S + "','" + fileVersion.FileVersion + "','','" + file.Length + "','" + file.CreationTime + "','" + file.Extension + "','" + SHA1 + "','" + md5 + "',0x" + Byte2String(image) + "";
int k = W1.DC(strSQL2, " Sys ");
if (k> 0)
{
MessageBox.Show( " 成功! ", " 成功提示! ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show( " 失敗! ", " 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch
{
MessageBox.Show( " 文件插入數據庫失敗!文件可能正在占用!! ", " 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
ListDate();
}
}
private void dgvList_CellClick( object sender, DataGridViewCellEventArgs e)
{
// ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
txtID.Text = dgvList[ 1, e.RowIndex].Value.ToString();
txtFilePath.Text = dgvList[ 8, e.RowIndex].Value.ToString();
chkUpdateBit.Checked = Convert.ToBoolean(dgvList[ 10, e.RowIndex].Value);
chkRegBit.Checked = Convert.ToBoolean(dgvList[ 11, e.RowIndex].Value);
}
private void btnCancel_Click( object sender, EventArgs e)
{
this.Close();
}
private void btnSave_Click( object sender, EventArgs e)
{
string strSQL2 = " Update SysUpdate set FilePath=' " + txtFilePath.Text + " ',UpdateBit=' " + Convert.ToBoolean(chkUpdateBit.Checked) + " ',RegBit=' " + Convert.ToBoolean(chkRegBit.Checked) + " ' where ID=' " + txtID.Text + " '; ";
int k = W1.DC(strSQL2, " Sys ");
if (k > 0)
{
MessageBox.Show( " 更新成功! ", " 成功提示! ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show( " 更新失敗! ", " 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
ListDate();
}
private void btnDel_Click( object sender, EventArgs e)
{
string strSQL2 = " DELETE SysUpdate Where ID=' " + txtID.Text + " '; ";
int k = W1.DC(strSQL2, " Sys ");
if (k > 0)
{
MessageBox.Show( " 刪除成功! ", " 成功提示! ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show( " 刪除失敗! ", " 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
ListDate();
}
private void dgvList_DataBindingComplete( object sender, DataGridViewBindingCompleteEventArgs e)
{
for ( int i = 0; i < this.dgvList.Rows.Count; )
{
this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue( " config.xml ", " Color ", " IMColor "))); ; // pParentWin.globalcolor2;
i += 2;
}
}
/// <summary>
/// 序列化
/// </summary>
/// <param name="data"> 要序列化的對象 </param>
/// <returns> 返回存放序列化后的數據緩沖區 </returns>
public static byte[] Serialize( object data)
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream rems = new MemoryStream();
formatter.Serialize(rems, data);
return rems.GetBuffer();
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="data"> 數據緩沖區 </param>
/// <returns> 對象 </returns>
public static object Deserialize( byte[] data)
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream rems = new MemoryStream(data);
data = null;
return formatter.Deserialize(rems);
}
}
}
4) 本地在線更新功能代碼:

{
public partial class frmLocalUpdate :Form
{
private string updateUrl = string.Empty;
private string tempUpdatePath = string.Empty;
WinBase.Common W1 = new WinBase.Common();
// private ECM.frmMain pParentWin = null;
bool isRun = false;
bool isUpdate = false;
string mainAppExe = "";
// public frmLocalUpdate(ECM.frmMain WinMain)
public frmLocalUpdate()
{
InitializeComponent();
// pParentWin = WinMain;
}
private void FrmSysUpdate_Load( object sender, EventArgs e)
{
// 數據庫SysUpdate表 顯示需要更新內容
dgvList.ColumnCount = 10;
dgvList.AutoGenerateColumns = false;
DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxColumn newColumn2 = new DataGridViewCheckBoxColumn();
dgvList.Columns.Insert( 0, newColumn);
dgvList.Columns.Insert( 11, newColumn1);
dgvList.Columns.Insert( 12, newColumn2);
this.SetdgvListHeadText();
string strSQL41 = " SELECT * FROM SysUpdate order by ID ; ";
DataSet ds = W1.DS(strSQL41, " Sys ");
dgvList.DataSource = ds.Tables[ 0].DefaultView;
this.DataBinding();
dgvList.Columns[ 0].Frozen = true;
dgvList.Columns[ 1].Frozen = true;
dgvList.Columns[ 2].Frozen = true;
dgvList.Columns[ 3].Frozen = true;
// dgvList.Columns[4].Frozen = true;
DataCheck();
}
private void SetdgvListHeadText()
{
dgvList.Columns[ 0].HeaderText = " 選擇 ";
dgvList.Columns[ 0].Width = 50;
dgvList.Columns[ 1].HeaderText = " ID ";
dgvList.Columns[ 1].Width = 20;
dgvList.Columns[ 1].ReadOnly = true;
dgvList.Columns[ 2].HeaderText = " 組件名 ";
dgvList.Columns[ 2].Width = 120;
dgvList.Columns[ 2].ReadOnly = true;
dgvList.Columns[ 3].HeaderText = " 服務器版本號 ";
dgvList.Columns[ 3].Width = 120;
dgvList.Columns[ 3].ReadOnly = true;
dgvList.Columns[ 4].HeaderText = " 本地版本號 ";
dgvList.Columns[ 4].Width = 120;
dgvList.Columns[ 4].ReadOnly = true;
dgvList.Columns[ 5].HeaderText = " 大小 ";
dgvList.Columns[ 5].Width = 100;
dgvList.Columns[ 5].ReadOnly = true;
dgvList.Columns[ 6].HeaderText = " 創建日期 ";
dgvList.Columns[ 6].Width = 150;
dgvList.Columns[ 6].ReadOnly = true;
dgvList.Columns[ 7].HeaderText = " 哈希值 ";
dgvList.Columns[ 7].Width = 250;
dgvList.Columns[ 7].ReadOnly = true;
dgvList.Columns[ 8].HeaderText = " MD5值 ";
dgvList.Columns[ 8].Width = 250;
dgvList.Columns[ 8].ReadOnly = true;
dgvList.Columns[ 9].HeaderText = " 目錄 ";
dgvList.Columns[ 9].Width = 80;
dgvList.Columns[ 9].ReadOnly = true;
dgvList.Columns[ 10].HeaderText = " 文件類型 ";
dgvList.Columns[ 10].Width = 80;
dgvList.Columns[ 10].ReadOnly = true;
dgvList.Columns[ 11].HeaderText = " 是否更新 ";
dgvList.Columns[ 11].Width = 80;
// dgvList.Columns[10].ReadOnly = true;
dgvList.Columns[ 12].HeaderText = " 是否需要注冊 ";
dgvList.Columns[ 12].Width = 110;
// dgvList.Columns[11].ReadOnly = true;
}
private void DataBinding()
{
// ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
dgvList.Columns[ 0].DataPropertyName = " Check1 ";
dgvList.Columns[ 1].DataPropertyName = " ID ";
dgvList.Columns[ 2].DataPropertyName = " FileName ";
dgvList.Columns[ 3].DataPropertyName = " FileVersion ";
dgvList.Columns[ 5].DataPropertyName = " FileSize ";
dgvList.Columns[ 6].DataPropertyName = " FileDate ";
dgvList.Columns[ 7].DataPropertyName = " FilesHash ";
dgvList.Columns[ 8].DataPropertyName = " FilesMD5 ";
dgvList.Columns[ 9].DataPropertyName = " FilePath ";
dgvList.Columns[ 10].DataPropertyName = " FileType ";
dgvList.Columns[ 11].DataPropertyName = " UpdateBit ";
dgvList.Columns[ 12].DataPropertyName = " RegBit ";
}
private void btnCancel_Click( object sender, EventArgs e)
{
this.Close();
// Application.ExitThread();
// Application.Exit();
}
private void DataCheck()
{
// 檢查是否更新文件
if (dgvList.Rows.Count != 0)
{
for ( int i = 0; i < dgvList.Rows.Count; i++)
{
string fileName = "";
string strg = "";
fileName = dgvList.Rows[i].Cells[ 2].Value.ToString();
strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息
if (dgvList.Rows[i].Cells[ 9].Value.ToString() != "")
{
strg += " \\ " + dgvList.Rows[i].Cells[ 9].Value.ToString(); // 添加路徑信息
}
strg += " \\ " + fileName; // 添加文件名稱
// 檢查文件是否存在
// 文件版本號
// FileInfo file = new FileInfo(strg);
if (FileUtil.IsExistFile(strg))
{
if ((FileUtil.MD5File(strg).ToString()) == (dgvList.Rows[i].Cells[ 8].Value.ToString()))
{
dgvList.Rows[i].Cells[ 0].Value = false;
}
else
{
dgvList.Rows[i].Cells[ 0].Value = true;
}
FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(strg);
dgvList.Rows[i].Cells[ 4].Value = fileVersion.FileVersion;
}
else
{
dgvList.Rows[i].Cells[ 0].Value = true;
dgvList.Rows[i].Cells[ 4].Value = " 文件不存在 ";
}
}
}
}
private delegate void SetProgressVlue( int value);
private void SetValue( int value) // 執行2次,第一次IF,第2次ELSE
{
if ( this.InvokeRequired) // 是否處於控件線程外
{
SetProgressVlue d = new SetProgressVlue(SetValue); // 創建一個SetProgressVlue的委托實例d,並將SetVlue賦值
object arg = value; // 給參數的值
this.Invoke(d, arg); // 將該值傳遞給D
}
else
{
this.pbDownFile.Value += value;
}
}
private void btnNext_Click( object sender, EventArgs e)
{
if (dgvList.Rows.Count == 0)
{
MessageBox.Show( " 沒有可用的更新! ", " 自動更新 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
for ( int i = 0; i < dgvList.Rows.Count; i++)
{
if (dgvList.Rows[i].Cells[ 0].Value == null) // 第一次都是null
{
dgvList.Rows[i].Cells[ 0].Value = false;
}
if ((dgvList.Rows[i].Cells[ 0].Value.ToString()) == " True ")
{
isUpdate = true;
}
}
if (isUpdate== false)
{
MessageBox.Show( " 沒有可用的更新! ", " 自動更新 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
this.pbDownFile.Value = 0;
string strSQL41 = " SELECT * FROM SysUpdate where UpdateBit=1 order by ID; ";
DataSet ds = W1.DS(strSQL41, " Sys ");
// 檢查目錄對應文件MD5是否一樣,
// 如果一樣表示已經更新無需更新
if (ds.Tables[ 0].Rows.Count >= 1)
{
pbDownFile.Maximum = ds.Tables[ 0].Rows.Count;
for ( int i = 0; i < ds.Tables[ 0].Rows.Count; i++)
{
SetValue( 1);
string fileName = "";
string strg = "";
fileName = ds.Tables[ 0].Rows[i][ " FileName "].ToString();
strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息
if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() != "")
{
strg += " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
}
strg += " \\ " + fileName; // 添加文件名稱
// 檢查文件是否存在
if (FileUtil.IsExistFile(strg))
{
if ((FileUtil.MD5File(strg).ToString()) == (ds.Tables[ 0].Rows[i][ " FilesMD5 "].ToString()))
{
}
else
{
CloseMainExe();
// 刪除當前文件
FileUtil.DeleteFile(strg);
byte[] MyData2 = new byte[ 0];
MyData2 = ( byte[])ds.Tables[ 0].Rows[i][ " FileData "];
byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2); // 解壓
// MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2)); // 解壓
FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Write(args0, 0, args0.Length);
fs.Close();
// 是否注冊
if (ds.Tables[ 0].Rows[i][ " RegBit "].ToString() == " True ")
{
Process p = new Process();
p.StartInfo.FileName = " Regsvr32.exe ";
p.StartInfo.Arguments = " /s " + strg; //
}
}
}
else
{
string DirectoryStrg = Application.StartupPath.ToString(); // 得到應用程序路徑信息
if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() != "")
{
DirectoryStrg += " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
}
if (DirectoryUtil.IsExistDirectory(DirectoryStrg))
{
}
else
{
DirectoryUtil.CreateDirectory(DirectoryStrg);
}
byte[] MyData2 = new byte[ 0];
MyData2 = ( byte[])ds.Tables[ 0].Rows[i][ " FileData "];
byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);
// MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2)); // 解壓
FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Write(args0, 0, args0.Length);
fs.Close();
if (ds.Tables[ 0].Rows[i][ " RegBit "].ToString() == " True ")
{
Process p = new Process();
p.StartInfo.FileName = " Regsvr32.exe ";
p.StartInfo.Arguments = " /s " + strg; //
}
}
}
DataCheck();
panel2.Location = panel1.Location;
panel2.Size = panel1.Size;
panel1.Visible = false;
panel2.Visible = true;
btnNext.Visible = false;
StarMainExe();
Application.Exit();
}
}
private void CloseMainExe()
{
try
{
string localXmlFile = Application.StartupPath + " \\UpdateList.xml ";
isRun = W1.LoadXmlFileValue( " UpdateList.xml ", " Application ", " AllowStart ").ToLower() == " true " ? true : isRun;
mainAppExe = W1.LoadXmlFileValue( " UpdateList.xml ", " Application ", " AppName ");
Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace( " .exe ", ""));
for ( int i = 0; i < processesByName.Length; i++)
{
Process p = processesByName[i];
for ( int j = 0; j < p.Threads.Count; j++)
{
p.Threads[j].Dispose();
}
p.Kill();
if (i == processesByName.Length - 1) Thread.Sleep( 550);
}
}
catch
{
MessageBox.Show( " 關閉運行中的進程發生錯誤,請聯系管理員! ", " 系統提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
// finally
// {
// this.Close();
// this.Dispose();
// // Application.ExitThread();
// // Application.Exit();
// }
}
private void StarMainExe()
{
try
{
string localXmlFile = Application.StartupPath + " \\UpdateList.xml ";
isRun = false;
mainAppExe = W1.LoadXmlFileValue( " UpdateList.xml ", " Application ", " AppName ");
Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace( " .exe ", ""));
for ( int i = 0; i < processesByName.Length; i++)
{
if (processesByName[i].ToString().ToLower() == mainAppExe.ToString().ToLower())
{
isRun = true;
break;
}
}
if ( false == this.isRun) Process.Start(mainAppExe);
}
catch
{
MessageBox.Show( " 重啟主程序發生錯誤,請聯系管理員! ", " 系統提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
this.Close();
this.Dispose();
// Application.ExitThread();
// Application.Exit();
}
}
private void dgvList_DataBindingComplete( object sender, DataGridViewBindingCompleteEventArgs e)
{
for ( int i = 0; i < this.dgvList.Rows.Count; )
{
this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue( " config.xml ", " Color ", " IMColor "))); ; // pParentWin.globalcolor2;
i += 2;
}
}
private void btnRefresh_Click( object sender, EventArgs e)
{
string strSQL41 = " SELECT * FROM SysUpdate order by ID ; ";
DataSet ds = W1.DS(strSQL41, " Sys ");
dgvList.DataSource = ds.Tables[ 0].DefaultView;
this.DataBinding();
DataCheck();
}
private SysUpdate.frmSysUpdateUp frmsysupdateup = null;
private void OpenUpload()
{
if (FindFormName( " frmSysUpdateUp ") == null)
{
frmsysupdateup = new SysUpdate.frmSysUpdateUp(); ;
frmsysupdateup.Show();
frmsysupdateup.Focus();
}
else
{
Form f = FindFormName( " frmSysUpdateUp ") as Form;
f.Focus();
}
}
/// <summary> 在OpenForms中查找已經打開的窗口 </summary>
/// <param name="text"> 傳入的窗口名稱 </param>
/// <returns> 返回的窗口 </returns>
private Form FindFormName( string name)
{
foreach (Form form in Application.OpenForms)
// 窗口名稱
if (form.Name == name)
return form;
return null;
}
private void frmLocalUpdate_KeyPress( object sender, KeyPressEventArgs e)
{
if ((Control.ModifierKeys & Keys.Control) == Keys.Control && e.KeyChar== 19)
{
OpenUpload();
}
}
// protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
// {
// if ((keyData & Keys.Alt) == Keys.Alt) // 檢測到alt
// {
// if ((keyData & Keys.Control) == Keys.Control)
// {
// System.Windows.Forms.SendKeys.Send("^%");
// return true;
// }
// }
// return base.ProcessCmdKey(ref msg, keyData);
// }
}
}
5) 通過webservice在線更新功能代碼:

{
public partial class frmOnlineUpdate : Form
{
private string updateUrl = string.Empty;
private string tempUpdatePath = string.Empty;
WinBase.Common W1 = new WinBase.Common();
DataSet ds1 = new DataSet();
bool isRun = false;
bool isUpdate = false;
string mainAppExe = "";
public frmOnlineUpdate()
{
InitializeComponent();
}
private void frmOnlineUpdate_Load( object sender, EventArgs e)
{
// 數據庫SysUpdate表 顯示需要更新內容
dgvList.ColumnCount = 10;
dgvList.AutoGenerateColumns = false;
DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxColumn newColumn2 = new DataGridViewCheckBoxColumn();
dgvList.Columns.Insert( 0, newColumn);
dgvList.Columns.Insert( 11, newColumn1);
dgvList.Columns.Insert( 12, newColumn2);
this.SetdgvListHeadText();
string localXmlFile = Application.StartupPath + " \\UpdateList.xml ";
txtAddress.Text = W1.LoadXmlFileValue( " UpdateList.xml ", " Updater ", " Url ");
Down();
dgvList.DataSource = ds1.Tables[ 0].DefaultView;
this.DataBinding();
dgvList.Columns[ 0].Frozen = true;
dgvList.Columns[ 1].Frozen = true;
dgvList.Columns[ 2].Frozen = true;
dgvList.Columns[ 3].Frozen = true;
// dgvList.Columns[4].Frozen = true;
DataCheck();
}
private void Down()
{
string url = txtAddress.Text;
#region 從服務器獲取更新列表
object result = WebServicesHelper.InvokeWebService(url, " GetUpdateFile ", null);
byte[] tb = ( byte[])result;
object[] ob = Common.SharpZip.DecompressNew(tb);
DataTable[] tb2 = (DataTable[])ob;
for ( int i = 0; i < tb2.Length; i++)
{
ds1.Tables.Add(tb2[i]);
}
#endregion
}
private void SetdgvListHeadText()
{
dgvList.Columns[ 0].HeaderText = " 選擇 ";
dgvList.Columns[ 0].Width = 50;
dgvList.Columns[ 1].HeaderText = " ID ";
dgvList.Columns[ 1].Width = 20;
dgvList.Columns[ 1].ReadOnly = true;
dgvList.Columns[ 2].HeaderText = " 組件名 ";
dgvList.Columns[ 2].Width = 120;
dgvList.Columns[ 2].ReadOnly = true;
dgvList.Columns[ 3].HeaderText = " 服務器版本號 ";
dgvList.Columns[ 3].Width = 120;
dgvList.Columns[ 3].ReadOnly = true;
dgvList.Columns[ 4].HeaderText = " 本地版本號 ";
dgvList.Columns[ 4].Width = 120;
dgvList.Columns[ 4].ReadOnly = true;
dgvList.Columns[ 5].HeaderText = " 大小 ";
dgvList.Columns[ 5].Width = 100;
dgvList.Columns[ 5].ReadOnly = true;
dgvList.Columns[ 6].HeaderText = " 創建日期 ";
dgvList.Columns[ 6].Width = 150;
dgvList.Columns[ 6].ReadOnly = true;
dgvList.Columns[ 7].HeaderText = " 哈希值 ";
dgvList.Columns[ 7].Width = 250;
dgvList.Columns[ 7].ReadOnly = true;
dgvList.Columns[ 8].HeaderText = " MD5值 ";
dgvList.Columns[ 8].Width = 250;
dgvList.Columns[ 8].ReadOnly = true;
dgvList.Columns[ 9].HeaderText = " 目錄 ";
dgvList.Columns[ 9].Width = 80;
dgvList.Columns[ 9].ReadOnly = true;
dgvList.Columns[ 10].HeaderText = " 文件類型 ";
dgvList.Columns[ 10].Width = 80;
dgvList.Columns[ 10].ReadOnly = true;
dgvList.Columns[ 11].HeaderText = " 是否更新 ";
dgvList.Columns[ 11].Width = 80;
// dgvList.Columns[10].ReadOnly = true;
dgvList.Columns[ 12].HeaderText = " 是否需要注冊 ";
dgvList.Columns[ 12].Width = 110;
// dgvList.Columns[11].ReadOnly = true;
}
private void DataBinding()
{
// ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
dgvList.Columns[ 0].DataPropertyName = " Check1 ";
dgvList.Columns[ 1].DataPropertyName = " ID ";
dgvList.Columns[ 2].DataPropertyName = " FileName ";
dgvList.Columns[ 3].DataPropertyName = " FileVersion ";
dgvList.Columns[ 5].DataPropertyName = " FileSize ";
dgvList.Columns[ 6].DataPropertyName = " FileDate ";
dgvList.Columns[ 7].DataPropertyName = " FilesHash ";
dgvList.Columns[ 8].DataPropertyName = " FilesMD5 ";
dgvList.Columns[ 9].DataPropertyName = " FilePath ";
dgvList.Columns[ 10].DataPropertyName = " FileType ";
dgvList.Columns[ 11].DataPropertyName = " UpdateBit ";
dgvList.Columns[ 12].DataPropertyName = " RegBit ";
}
private void btnCancel_Click( object sender, EventArgs e)
{
this.Close();
// Application.ExitThread();
// Application.Exit();
}
private void DataCheck()
{
// 檢查是否更新文件
if (dgvList.Rows.Count != 0)
{
for ( int i = 0; i < dgvList.Rows.Count; i++)
{
string fileName = "";
string strg = "";
fileName = dgvList.Rows[i].Cells[ 2].Value.ToString();
strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息
if (dgvList.Rows[i].Cells[ 9].Value.ToString() != "")
{
strg += " \\ " + dgvList.Rows[i].Cells[ 9].Value.ToString(); // 添加路徑信息
}
strg += " \\ " + fileName; // 添加文件名稱
// 檢查文件是否存在
// 文件版本號
// FileInfo file = new FileInfo(strg);
if (FileUtil.IsExistFile(strg))
{
if ((FileUtil.MD5File(strg).ToString()) == (dgvList.Rows[i].Cells[ 8].Value.ToString()))
{
dgvList.Rows[i].Cells[ 0].Value = false;
}
else
{
dgvList.Rows[i].Cells[ 0].Value = true;
}
FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(strg);
dgvList.Rows[i].Cells[ 4].Value = fileVersion.FileVersion;
}
else
{
dgvList.Rows[i].Cells[ 0].Value = true;
dgvList.Rows[i].Cells[ 4].Value = " 文件不存在 ";
}
}
}
}
private delegate void SetProgressVlue( int value);
private void SetValue( int value) // 執行2次,第一次IF,第2次ELSE
{
if ( this.InvokeRequired) // 是否處於控件線程外
{
SetProgressVlue d = new SetProgressVlue(SetValue); // 創建一個SetProgressVlue的委托實例d,並將SetVlue賦值
object arg = value; // 給參數的值
this.Invoke(d, arg); // 將該值傳遞給D
}
else
{
this.pbDownFile.Value += value;
}
}
private void btnNext_Click( object sender, EventArgs e)
{
if (dgvList.Rows.Count == 0)
{
MessageBox.Show( " 沒有可用的更新! ", " 自動更新 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
for ( int i = 0; i < dgvList.Rows.Count; i++)
{
if (dgvList.Rows[i].Cells[ 0].Value == null) // 第一次都是null
{
dgvList.Rows[i].Cells[ 0].Value = false;
}
if ((dgvList.Rows[i].Cells[ 0].Value.ToString()) == " True ")
{
isUpdate = true;
}
}
if (isUpdate== false)
{
MessageBox.Show( " 沒有可用的更新! ", " 自動更新 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
this.pbDownFile.Value = 0;
string strSQL41 = " SELECT * FROM SysUpdate where UpdateBit=1 order by ID; ";
DataSet ds = W1.DS(strSQL41, " Sys ");
// 檢查目錄對應文件MD5是否一樣,
// 如果一樣表示已經更新無需更新
if (ds.Tables[ 0].Rows.Count >= 1)
{
pbDownFile.Maximum = ds.Tables[ 0].Rows.Count;
for ( int i = 0; i < ds.Tables[ 0].Rows.Count; i++)
{
SetValue( 1);
string fileName = "";
string strg = "";
fileName = ds.Tables[ 0].Rows[i][ " FileName "].ToString();
strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息
if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() != "")
{
strg += " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
}
strg += " \\ " + fileName; // 添加文件名稱
// 檢查文件是否存在
if (FileUtil.IsExistFile(strg))
{
if ((FileUtil.MD5File(strg).ToString()) == (ds.Tables[ 0].Rows[i][ " FilesMD5 "].ToString()))
{
}
else
{
CloseMainExe();
// 刪除當前文件
FileUtil.DeleteFile(strg);
byte[] MyData2 = new byte[ 0];
MyData2 = ( byte[])ds.Tables[ 0].Rows[i][ " FileData "];
byte[] args0 = Common.SharpZip.DecompressB(MyData2); // 解壓
// MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2)); // 解壓
FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Write(args0, 0, args0.Length);
fs.Close();
// 是否注冊
if (ds.Tables[ 0].Rows[i][ " RegBit "].ToString() == " True ")
{
Process p = new Process();
p.StartInfo.FileName = " Regsvr32.exe ";
p.StartInfo.Arguments = " /s " + strg; //
}
}
}
else
{
string DirectoryStrg = Application.StartupPath.ToString(); // 得到應用程序路徑信息
if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() != "")
{
DirectoryStrg += " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
}
if (DirectoryUtil.IsExistDirectory(DirectoryStrg))
{
}
else
{
DirectoryUtil.CreateDirectory(DirectoryStrg);
}
byte[] MyData2 = new byte[ 0];
MyData2 = ( byte[])ds.Tables[ 0].Rows[i][ " FileData "];
byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);
// MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2)); // 解壓
FileStream fs = new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Write(args0, 0, args0.Length);
fs.Close();
if (ds.Tables[ 0].Rows[i][ " RegBit "].ToString() == " True ")
{
Process p = new Process();
p.StartInfo.FileName = " Regsvr32.exe ";
p.StartInfo.Arguments = " /s " + strg; //
}
}
}
DataCheck();
panel2.Location = panel1.Location;
panel2.Size = panel1.Size;
panel1.Visible = false;
panel2.Visible = true;
btnNext.Visible = false;
StarMainExe();
Application.Exit();
}
}
private void CloseMainExe()
{
try
{
string localXmlFile = Application.StartupPath + " \\UpdateList.xml ";
isRun = W1.LoadXmlFileValue( " UpdateList.xml ", " Application ", " AllowStart ").ToLower() == " true " ? true : isRun;
mainAppExe = W1.LoadXmlFileValue( " UpdateList.xml ", " Application ", " AppName ");
Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace( " .exe ", ""));
for ( int i = 0; i < processesByName.Length; i++)
{
Process p = processesByName[i];
for ( int j = 0; j < p.Threads.Count; j++)
{
p.Threads[j].Dispose();
}
p.Kill();
if (i == processesByName.Length - 1) Thread.Sleep( 550);
}
}
catch
{
MessageBox.Show( " 關閉運行中的進程發生錯誤,請聯系管理員! ", " 系統提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
// finally
// {
// this.Close();
// this.Dispose();
// // Application.ExitThread();
// // Application.Exit();
// }
}
private void StarMainExe()
{
try
{
string localXmlFile = Application.StartupPath + " \\UpdateList.xml ";
isRun = false;
mainAppExe = W1.LoadXmlFileValue( " UpdateList.xml ", " Application ", " AppName ");
Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace( " .exe ", ""));
for ( int i = 0; i < processesByName.Length; i++)
{
if (processesByName[i].ToString().ToLower() == mainAppExe.ToString().ToLower())
{
isRun = true;
break;
}
}
if ( true == this.isRun) Process.Start(mainAppExe);
}
catch
{
MessageBox.Show( " 重啟主程序發生錯誤,請聯系管理員! ", " 系統提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
this.Close();
this.Dispose();
// Application.ExitThread();
// Application.Exit();
}
}
private void dgvList_DataBindingComplete( object sender, DataGridViewBindingCompleteEventArgs e)
{
for ( int i = 0; i < this.dgvList.Rows.Count; )
{
this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue( " config.xml ", " Color ", " IMColor "))); ; // pParentWin.globalcolor2; // System.Drawing.Color.FromArgb(Convert.ToInt32(-2302756)); //
i += 2;
}
}
private void btnRefresh_Click( object sender, EventArgs e)
{
Down();
dgvList.DataSource = ds1.Tables[ 0].DefaultView;
this.DataBinding();
DataCheck();
}
}
}
6) 軟件商webserice代碼

{
/// <summary>
/// Summary description for Service1
/// </summary>
// [WebService(Namespace = " http://tempuri.org/ ")]
[WebService(Namespace = " http://localhost/sysupdate/SysUpdate.asmx/ ")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem( false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class HostService : System.Web.Services.WebService
{
WebBase W1 = new WebBase();
#region WebService Get Method
[WebMethod(Description = " 取得服務器上的相關更新資料DataSet ")]
public byte[] GetUpdateFile()
{
string strSQL = " SELECT * FROM SysUpdate where UpdateBit=1 order by ID; ";
DataSet ds = W1.DS(strSQL, " Sys ");
DataTable[] tb = new DataTable[ds.Tables.Count];
for ( int i = 0; i < ds.Tables.Count; i++)
{
tb[i] = ds.Tables[i];
}
return Common.SharpZip.Compress(tb);
}
#endregion
#region WebService Post Method
[WebMethod(Description = " 更新相關文件 ")]
public int UploadUpdateFile( byte[] result)
{
int id = 0;
byte[] tb = ( byte[])result;
object[] ob = Common.SharpZip.DecompressNew(tb);
DataTable[] tb2 = (DataTable[])ob;
DataSet ds1 = new DataSet();
for ( int i = 0; i < tb2.Length; i++)
{
ds1.Tables.Add(tb2[i]);
}
if (ds1.Tables[ 0].Rows.Count > 0)
{
for ( int i = 0; i < ds1.Tables[ 0].Rows.Count; i++)
{
string strSQL = " select * from SysUpdate where ID=' " + ds1.Tables[ 0].Rows[i][ 0].ToString() + " ' ";
DataSet ds10 = W1.DS(strSQL, " Sys ");
if (ds10.Tables[ 0].Rows.Count > 0) // 記錄已存在時
{
strSQL = " Delete from SysUpdate where ID=' " + ds1.Tables[ 0].Rows[i][ 0].ToString() + " '; Insert into SysUpdate values( ";
for ( int j = 0; j < ds1.Tables[ 0].Columns.Count - 1; j++)
{
if (ds1.Tables[ 0].Columns[j].DataType.ToString() == " System.Double " || ds1.Tables[ 0].Columns[j].DataType.ToString() == " System.Decimal ") // Double型的要特別處理,不能看成字符型
{
if (ds1.Tables[ 0].Rows[i][j].ToString() == "")
{
strSQL += " null " + " , ";
}
else
{
strSQL += ds1.Tables[ 0].Rows[i][j].ToString() + " , ";
}
}
else
{
strSQL += " ' " + ds1.Tables[ 0].Rows[i][j].ToString() + " ', ";
}
}
strSQL += " ' " + ds1.Tables[ 0].Rows[i][ds1.Tables[ 0].Columns.Count - 1].ToString() + " ') ";
try
{
W1.DC(strSQL, " Sys ");
id++;
}
catch
{
return id = - 1;
}
}
else
{
strSQL = " Insert into SysUpdate values( ";
for ( int j = 0; j < ds1.Tables[ 0].Columns.Count - 1; j++)
{
if (ds1.Tables[ 0].Columns[j].DataType.ToString() == " System.Double " || ds1.Tables[ 0].Columns[j].DataType.ToString() == " System.Decimal ") // Double型的要特別處理,不能看成字符型
{
if (ds1.Tables[ 0].Rows[i][j].ToString() == "")
{
strSQL += " null " + " , ";
}
else
{
strSQL += ds1.Tables[ 0].Rows[i][j].ToString() + " , ";
}
}
else
{
strSQL += " ' " + ds1.Tables[ 0].Rows[i][j].ToString() + " ', ";
}
}
strSQL += " ' " + ds1.Tables[ 0].Rows[i][ds1.Tables[ 0].Columns.Count - 1].ToString() + " ') ";
try
{
W1.DC(strSQL, " Sys ");
id++;
}
catch
{
return id = - 1;
}
}
}
}
return id;
}
#endregion
private void InitializeComponent()
{
}
}
}
7) 更新配置文件:UpdateList.xml

<Configs>
<Updater>
<Url>http: // 218.X.X.2/sysupdate/HostService.asmx</Url> // 升級文件所在服務器端的網址
</Updater>
<Application>
<AllowStart> true</AllowStart> // 允許重新啟動應用程序
<AppName>ECM.exe</AppName> // 啟動的應用程序名
</Application>
</Configs>
8) ECM系統Login時檢查是否有更新檔功能代碼:

{
string strSQL41 = " SELECT * FROM SysUpdate where UpdateBit=1 order by ID; ";
DataSet ds = W1.DS(strSQL41, " Sys ");
// 檢查目錄對應文件MD5是否一樣,
// 如果一樣表示已經更新無需更新
if (ds.Tables[ 0].Rows.Count >= 1)
{
for ( int i = 0; i < ds.Tables[ 0].Rows.Count; i++)
{
string fileName = "";
string strg = "";
fileName = ds.Tables[ 0].Rows[i][ " FileName "].ToString();
strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息
if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() != "")
{
strg += " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
}
strg += " \\ " + fileName; // 添加文件名稱
// 檢查文件是否存在
if (SysUpdate.FileUtil.IsExistFile(strg))
{
if ((SysUpdate.FileUtil.MD5File(strg).ToString()) == (ds.Tables[ 0].Rows[i][ " FilesMD5 "].ToString()))
{
}
else
{
isUpdate = true;
}
}
else
{
isUpdate = true;
}
}
}
if (isUpdate)
{
if (MessageBox.Show( " 服務器存在更新版本,是否更新為最新版 ", " 系統提示 ", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
{
System.Diagnostics.Process.Start( " SysUpdate.exe ");
}
}
}
5、 有關更多的技術分享,大家可以加入我們的技術群,進行源碼的分享。
歡迎加入技術分享群:238916811