You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
648 lines
22 KiB
648 lines
22 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Data.SqlClient;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using ManagementSystem.Utility;
|
|
|
|
namespace ExportDataToFile
|
|
{
|
|
public partial class Form1 : Form
|
|
{
|
|
//參數設定
|
|
int intExportIndex = -1;
|
|
SqlConnection sqlSourceConn = new SqlConnection();
|
|
SqlConnection sqlTargetConn = new SqlConnection();
|
|
public Form1()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void btnSourceConnTest_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
string strCheck = CheckSource();
|
|
//查詢來源資料庫中的資料表
|
|
string strIP = txtSourceIP.Text.Trim();
|
|
string strDBName = txtSourceDBName.Text.Trim();
|
|
string strID = txtSourceID.Text.Trim();
|
|
string strPWD = txtSourcePWD.Text.Trim();
|
|
|
|
if (strCheck == "")
|
|
{
|
|
if (cbSourceClass.Enabled)
|
|
{
|
|
LockSourceForm();
|
|
|
|
switch (cbSourceClass.SelectedItem.ToString().Trim())
|
|
{
|
|
case "MS-SQL":
|
|
sqlSourceConn = MSSQLUtility.GetConn(strIP, strDBName, strID, strPWD);
|
|
ShowMSSQLSourceTables(sqlSourceConn);
|
|
Application.DoEvents();
|
|
break;
|
|
case "MySQL":
|
|
|
|
break;
|
|
case "Oracle":
|
|
|
|
break;
|
|
case "PostgreSQL":
|
|
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
UnLockSourceForm();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(strCheck);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void btnTargetConnTest_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
string strCheck = CheckTarget();
|
|
//查詢目標資料庫中的資料表
|
|
string strIP = txtTargetIP.Text.Trim();
|
|
string strDBName = txtTargetDBName.Text.Trim();
|
|
string strID = txtTargetID.Text.Trim();
|
|
string strPWD = txtTargetPWD.Text.Trim();
|
|
|
|
if (strCheck == "")
|
|
{
|
|
if (cbTargetClass.Enabled)
|
|
{
|
|
switch (cbTargetClass.SelectedItem.ToString().Trim())
|
|
{
|
|
case "MS-SQL":
|
|
sqlTargetConn = MSSQLUtility.GetConn(strIP, strDBName, strID, strPWD);
|
|
ShowMSSQLTargetTableList(sqlTargetConn);
|
|
Application.DoEvents();
|
|
|
|
break;
|
|
case "MySQL":
|
|
|
|
break;
|
|
case "Oracle":
|
|
|
|
break;
|
|
case "PostgreSQL":
|
|
|
|
break;
|
|
}
|
|
|
|
LockTargetForm();
|
|
}
|
|
else
|
|
{
|
|
UnLockTargetForm();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(strCheck);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void dgvExportList_CellEndEdit(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
//try
|
|
//{
|
|
// dgvExportList.Rows[e.RowIndex].Cells["clExport"].Value = true;
|
|
//}
|
|
//catch (Exception ex)
|
|
//{
|
|
// ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
//}
|
|
}
|
|
|
|
private void dgvExportList_CellClick(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
LocatedTarget(e.RowIndex);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void dgvExportList_CellContentClick(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var senderGrid = (DataGridView)sender;
|
|
|
|
if (e.RowIndex >= 0)
|
|
{
|
|
//清除該列資料
|
|
if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn)
|
|
{
|
|
CleanExpRow(dgvExportList, e.RowIndex);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void txtWhere_Leave(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
dgvExportList.Rows[intExportIndex].Cells["clWhere"].Value = txtWhere.Text.Trim();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
private void cbTargetTable_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (cbTargetTable.SelectedValue != null && intExportIndex != -1)
|
|
{
|
|
|
|
//重新修改DataGridView的ComboBox的內容
|
|
switch (cbTargetClass.SelectedItem.ToString().Trim())
|
|
{
|
|
case "MS-SQL":
|
|
ShowMSSQLTargetColumnList(sqlTargetConn, cbTargetTable.SelectedValue.ToString());
|
|
break;
|
|
case "MySQL":
|
|
|
|
break;
|
|
case "Oracle":
|
|
|
|
break;
|
|
case "PostgreSQL":
|
|
|
|
break;
|
|
}
|
|
Application.DoEvents();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void dgvColumnMapping_CellContentClick(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var senderGrid = (DataGridView)sender;
|
|
//觸發清除事件
|
|
if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0)
|
|
{
|
|
senderGrid.Rows[e.RowIndex].Cells["clExpColumn"].Value = false;
|
|
((DataGridViewComboBoxCell)senderGrid.Rows[e.RowIndex].Cells["clTargetColumn"]).Value = null;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void dgvColumnMapping_CellEndEdit(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (cbTargetTable.Enabled)
|
|
{
|
|
//dgvColumnMapping.Rows[e.RowIndex].Cells["clExpColumn"].Value = true;
|
|
//dgvExportList.Rows[intExportIndex].Cells["clExport"].Value = true;
|
|
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
private void btnExport_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
sqlSourceConn.Close();
|
|
sqlSourceConn = null;
|
|
sqlTargetConn.Close();
|
|
sqlTargetConn = null;
|
|
}
|
|
|
|
private void btnMapping_Click(object sender, EventArgs e)
|
|
{
|
|
//自動預設產生所有的Mapping檔案
|
|
dgvExportList.Rows[intExportIndex].Cells["clMappingData"].Value = GenMappingColumn();
|
|
dgvExportList.Rows[intExportIndex].Cells["clExport"].Value = true;
|
|
//設定來源與目標的資料表對應
|
|
if (cbTargetTable.SelectedValue != null)
|
|
{
|
|
dgvExportList.Rows[intExportIndex].Cells["clTargetTable"].Value = cbTargetTable.SelectedValue.ToString();
|
|
}
|
|
}
|
|
|
|
#region 自定義功能
|
|
|
|
#region MS-SQL
|
|
private void ShowMSSQLSourceTables(SqlConnection sqlConn)
|
|
{
|
|
try
|
|
{
|
|
string strGetMSSQLTableList = "Select [name] as TableName from sys.tables order by name";
|
|
dgvExportList.DataSource = MSSQLUtility.GetSQLResult(strGetMSSQLTableList, sqlConn).Tables["Result"];
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void ShowMSSQLTargetTableList(SqlConnection sqlConn)
|
|
{
|
|
try
|
|
{
|
|
string strGetMSSQLTableList = "Select [name] as TableName from sys.tables order by name";
|
|
cbTargetTable.DataSource = MSSQLUtility.GetSQLResult(strGetMSSQLTableList, sqlConn).Tables["Result"];
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void ShowMSSQLSourceColumnList(SqlConnection sqlConn, string strTableName)
|
|
{
|
|
try
|
|
{
|
|
string strGetMSSQLColumnList = "Select COLUMN_NAME From INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME ='" + strTableName + "' Order by ORDINAL_POSITION";
|
|
dgvColumnMapping.DataSource = MSSQLUtility.GetSQLResult(strGetMSSQLColumnList, sqlConn).Tables["Result"];
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
private void ShowMSSQLTargetColumnList(SqlConnection sqlConn, string strTableName)
|
|
{
|
|
try
|
|
{
|
|
string strGetMSSQLColumnList = "Select COLUMN_NAME From INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME ='" + strTableName + "' Order by ORDINAL_POSITION";
|
|
this.clTargetColumn.DisplayMember = "COLUMN_NAME";
|
|
this.clTargetColumn.DataSource = MSSQLUtility.GetSQLResult(strGetMSSQLColumnList, sqlConn).Tables["Result"];
|
|
Application.DoEvents();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
#endregion //End of MS-SQL
|
|
|
|
private string CheckSource()
|
|
{
|
|
try
|
|
{
|
|
string strResult = "";
|
|
|
|
if (cbSourceClass.SelectedItem == null)
|
|
{
|
|
strResult = "請選擇來源資料庫類別";
|
|
cbSourceClass.Focus();
|
|
return strResult;
|
|
}
|
|
else
|
|
{
|
|
if (txtSourceIP.Text.Trim() == "")
|
|
{
|
|
strResult = "來源資料庫IP為必填";
|
|
txtSourceIP.Focus();
|
|
return strResult;
|
|
}
|
|
|
|
if (txtSourceDBName.Text.Trim() == "")
|
|
{
|
|
strResult = "來源資料庫名稱為必填";
|
|
txtSourceDBName.Focus();
|
|
return strResult;
|
|
}
|
|
|
|
if (txtSourceID.Text.Trim() == "")
|
|
{
|
|
strResult = "來源資料庫帳號為必填";
|
|
txtSourceID.Focus();
|
|
return strResult;
|
|
}
|
|
}
|
|
return strResult;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
return "發生不明錯誤!";
|
|
}
|
|
}
|
|
|
|
private string CheckTarget()
|
|
{
|
|
try
|
|
{
|
|
string strResult = "";
|
|
|
|
if (cbTargetClass.SelectedItem != null)
|
|
{
|
|
if (txtTargetIP.Text.Trim() == "")
|
|
{
|
|
strResult = "目標資料庫IP為必填";
|
|
txtTargetIP.Focus();
|
|
return strResult;
|
|
}
|
|
|
|
if (txtTargetDBName.Text.Trim() == "")
|
|
{
|
|
strResult = "目標資料庫名稱為必填";
|
|
txtTargetDBName.Focus();
|
|
return strResult;
|
|
}
|
|
|
|
if (txtTargetID.Text.Trim() == "")
|
|
{
|
|
strResult = "目標資料庫帳號為必填";
|
|
txtTargetID.Focus();
|
|
return strResult;
|
|
}
|
|
}
|
|
return strResult;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
return "發生不明錯誤!";
|
|
}
|
|
}
|
|
|
|
private void LockSourceForm()
|
|
{
|
|
try
|
|
{
|
|
cbSourceClass.Enabled = false;
|
|
txtSourceIP.Enabled = false;
|
|
txtSourceID.Enabled = false;
|
|
txtSourceDBName.Enabled = false;
|
|
txtSourcePWD.Enabled = false;
|
|
btnSourceConnTest.Text = "連線中…";
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void UnLockSourceForm()
|
|
{
|
|
try
|
|
{
|
|
cbSourceClass.Enabled = true;
|
|
txtSourceIP.Enabled = true;
|
|
txtSourceID.Enabled = true;
|
|
txtSourceDBName.Enabled = true;
|
|
txtSourcePWD.Enabled = true;
|
|
btnSourceConnTest.Text = "建立來源連線";
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void LockTargetForm()
|
|
{
|
|
try
|
|
{
|
|
cbTargetClass.Enabled = false;
|
|
cbTargetTable.Enabled = true;
|
|
cbTargetTable.SelectedIndex = -1;
|
|
txtTargetIP.Enabled = false;
|
|
txtTargetID.Enabled = false;
|
|
txtTargetDBName.Enabled = false;
|
|
txtTargetPWD.Enabled = false;
|
|
btnTargetConnTest.Text = "連線中…";
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private void UnLockTargetForm()
|
|
{
|
|
try
|
|
{
|
|
cbTargetClass.Enabled = true;
|
|
cbTargetTable.DataSource = null;
|
|
cbTargetTable.Enabled = false;
|
|
txtTargetIP.Enabled = true;
|
|
txtTargetID.Enabled = true;
|
|
txtTargetDBName.Enabled = true;
|
|
txtTargetPWD.Enabled = true;
|
|
btnTargetConnTest.Text = "建立目標連線";
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ErrorHandler.WriteErrorLog("Form1.cs", ex);
|
|
}
|
|
}
|
|
|
|
private string GenMappingColumn()
|
|
{
|
|
string strExportColumns = "";
|
|
string strSourceColumn = "";
|
|
string strTargetColumn = "";
|
|
|
|
//預設所有欄位均匯出
|
|
foreach (DataGridViewRow dgRow in dgvColumnMapping.Rows)
|
|
{
|
|
//處理下拉欄位空白的問題
|
|
if (dgRow.Cells["clExpColumn"].Value != null)
|
|
{
|
|
if ((bool)dgRow.Cells["clExpColumn"].Value == true)
|
|
{
|
|
if (dgRow.Cells["clSourceColumn"].Value == null)
|
|
{
|
|
strSourceColumn = " ";
|
|
}
|
|
else
|
|
{
|
|
strSourceColumn = dgRow.Cells["clSourceColumn"].Value.ToString();
|
|
}
|
|
|
|
if (dgRow.Cells["clTargetColumn"].Value == null)
|
|
{
|
|
strTargetColumn = " ";
|
|
}
|
|
else
|
|
{
|
|
strTargetColumn = dgRow.Cells["clTargetColumn"].Value.ToString();
|
|
}
|
|
|
|
if (strExportColumns == "")
|
|
{
|
|
|
|
strExportColumns += strSourceColumn + "," + strTargetColumn;
|
|
}
|
|
else
|
|
{
|
|
strExportColumns += "|" + strSourceColumn + "," + strTargetColumn;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return strExportColumns;
|
|
}
|
|
|
|
private void LocatedTarget(int intRowIndex)
|
|
{
|
|
if (cbTargetClass.SelectedIndex >= 0 && cbTargetClass.Enabled == false)
|
|
{
|
|
//cbTargetTable.SelectedValue = dgvExportList.Rows[intRowIndex].Cells["clSourceTable"].Value.ToString();
|
|
|
|
string strTarget = "";
|
|
string[] strColumnMapping = null;
|
|
|
|
if (intRowIndex != -1)
|
|
{
|
|
intExportIndex = intRowIndex;
|
|
|
|
//設定目標Table下拉式選單的內容
|
|
if (dgvExportList.Rows[intRowIndex].Cells["clTargetTable"].Value != null && dgvExportList.Rows[intRowIndex].Cells["clTargetTable"].Value.ToString() != "")
|
|
{
|
|
strTarget = dgvExportList.Rows[intRowIndex].Cells["clTargetTable"].Value.ToString();
|
|
}
|
|
else
|
|
{
|
|
strTarget = dgvExportList.Rows[intRowIndex].Cells["clSourceTable"].Value.ToString();
|
|
}
|
|
|
|
cbTargetTable.SelectedValue = strTarget;
|
|
|
|
//取得欄位對應字串陣列
|
|
if (dgvExportList.Rows[intRowIndex].Cells["clMappingData"].Value != null)
|
|
{
|
|
strColumnMapping = dgvExportList.Rows[intRowIndex].Cells["clMappingData"].Value.ToString().Split('|');
|
|
}
|
|
|
|
|
|
//顯示欄位對應表的內容
|
|
if (cbTargetTable.SelectedValue != null)
|
|
{
|
|
switch (cbTargetClass.SelectedItem.ToString().Trim())
|
|
{
|
|
case "MS-SQL":
|
|
ShowMSSQLSourceColumnList(sqlSourceConn, strTarget.ToString());
|
|
Application.DoEvents();
|
|
break;
|
|
case "MySQL":
|
|
|
|
break;
|
|
case "Oracle":
|
|
|
|
break;
|
|
case "PostgreSQL":
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (strColumnMapping != null)
|
|
{
|
|
string strSourceColumn = "";
|
|
string strTargetColumn = "";
|
|
foreach (string strColumn in strColumnMapping)
|
|
{
|
|
strSourceColumn = strColumn.Substring(0, strColumn.IndexOf(',')).Trim();
|
|
strTargetColumn = strColumn.Substring(strColumn.IndexOf(',') + 1).Trim();
|
|
foreach (DataGridViewRow dgvRow in dgvColumnMapping.Rows)
|
|
{
|
|
if (dgvRow.Cells["clSourceColumn"].Value.ToString() == strSourceColumn)
|
|
{
|
|
dgvRow.Cells[0].Value = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//預設所有欄位均匯出
|
|
foreach (DataGridViewRow dgRow in dgvColumnMapping.Rows)
|
|
{
|
|
((DataGridViewCheckBoxCell)dgRow.Cells["clExpColumn"]).Value = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void CleanExpRow(DataGridView senderGrid, int intRowIndex)
|
|
{
|
|
senderGrid.Rows[intRowIndex].Cells["clExport"].Value = false;
|
|
senderGrid.Rows[intRowIndex].Cells["clTargetTable"].Value = "";
|
|
senderGrid.Rows[intRowIndex].Cells["clTableDel"].Value = false;
|
|
senderGrid.Rows[intRowIndex].Cells["clDataTrim"].Value = false;
|
|
senderGrid.Rows[intRowIndex].Cells["clMaxRecord"].Value = "";
|
|
senderGrid.Rows[intRowIndex].Cells["clWhere"].Value = "";
|
|
senderGrid.Rows[intRowIndex].Cells["clMappingData"].Value = "";
|
|
CleanMappingRow(senderGrid, intRowIndex);
|
|
txtWhere.Text = "";
|
|
Application.DoEvents();
|
|
}
|
|
|
|
private void CleanMappingRow(DataGridView senderGrid,int intRowIndex)
|
|
{
|
|
DataTable CleanTable = (DataTable)dgvColumnMapping.DataSource;
|
|
CleanTable.Rows.Clear();
|
|
dgvColumnMapping.DataSource = CleanTable;
|
|
}
|
|
#endregion
|
|
|
|
|
|
}
|
|
}
|