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.

2679 lines
119 KiB

3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Data.SqlClient;
  6. using System.Drawing;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Xml.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. using Npgsql;
  14. using MySqlConnector;
  15. using Oracle.ManagedDataAccess.Client;
  16. using ManagementSystem.Utility;
  17. namespace ExportDataToFile
  18. {
  19. public partial class Form1 : Form
  20. {
  21. //參數設定
  22. int intExportIndex = -1;
  23. bool blSourceConnStatus = false;
  24. bool blTargetConnStatus = false;
  25. string strSourceClass = "";
  26. string strTargetClass = "";
  27. //MS-SQL
  28. SqlConnection sqlMSSourceConn = null; //new SqlConnection();
  29. SqlConnection sqlMSTargetConn = null; //new SqlConnection();
  30. //PostgreSQL
  31. NpgsqlConnection sqlPsgSourceConn = null; //new NpgsqlConnection();
  32. NpgsqlConnection sqlPsgTargetConn = null; //new NpgsqlConnection();
  33. //MySQL
  34. MySqlConnection sqlMySourceConn = null; //new MySqlConnection();
  35. MySqlConnection sqlMyTargetConn = null; //new MySqlConnection();
  36. //Oracle
  37. OracleConnection sqlOraSourceConn = null; //new OracleConnection();
  38. OracleConnection sqlOraTargetConn = null; //new OracleConnection();
  39. public Form1()
  40. {
  41. InitializeComponent();
  42. }
  43. private void Form1_Load(object sender, EventArgs e)
  44. {
  45. ResetDataGridView();
  46. }
  47. private void btnSourceConnTest_Click(object sender, EventArgs e)
  48. {
  49. try
  50. {
  51. string strCheck = CheckSource();
  52. //查詢來源資料庫中的資料表
  53. string strIP = txtSourceIP.Text.Trim();
  54. string strPort = txtSourcePort.Text.Trim();
  55. string strDBName = txtSourceDBName.Text.Trim();
  56. string strID = txtSourceID.Text.Trim();
  57. string strPWD = txtSourcePWD.Text.Trim();
  58. DataTable dtResult = null;
  59. if (strCheck == "")
  60. {
  61. if (cbSourceClass.Enabled)
  62. {
  63. LockSourceForm();
  64. switch (cbSourceClass.SelectedItem.ToString().Trim())
  65. {
  66. case "MS-SQL":
  67. //MS-SQL
  68. sqlMSSourceConn = new SqlConnection();
  69. sqlMSTargetConn = new SqlConnection();
  70. sqlMSSourceConn = MSSQLUtility.GetConn(strIP, strDBName, strID, strPWD, strPort);
  71. if (sqlMSSourceConn == null)
  72. {
  73. MessageBox.Show("連線失敗,請查詢連線資訊");
  74. }
  75. dtResult = ShowMSSQLTableList(sqlMSSourceConn);
  76. strSourceClass = "MS-SQL";
  77. Application.DoEvents();
  78. break;
  79. case "MySQL":
  80. //MySQL
  81. sqlMySourceConn = new MySqlConnection();
  82. sqlMyTargetConn = new MySqlConnection();
  83. sqlMySourceConn = MySQLUtility.GetConn(strIP, strDBName, strID, strPWD, strPort);
  84. if (sqlMySourceConn == null)
  85. {
  86. MessageBox.Show("連線失敗,請查詢連線資訊");
  87. }
  88. dtResult = ShowMySQLTableList(sqlMySourceConn, strDBName);
  89. strSourceClass = "MySQL";
  90. Application.DoEvents();
  91. break;
  92. case "Oracle":
  93. //Oracle
  94. sqlOraSourceConn = new OracleConnection();
  95. sqlOraTargetConn = new OracleConnection();
  96. sqlOraSourceConn = OracleUtility.GetConn(strIP, strDBName, strID, strPWD, strPort);
  97. if (sqlOraSourceConn == null)
  98. {
  99. MessageBox.Show("連線失敗,請查詢連線資訊");
  100. }
  101. dtResult = ShowOracleTableList(sqlOraSourceConn, strDBName);
  102. strSourceClass = "Oracle";
  103. Application.DoEvents();
  104. break;
  105. case "PostgreSQL":
  106. //PostgreSQL
  107. sqlPsgSourceConn = new NpgsqlConnection();
  108. sqlPsgTargetConn = new NpgsqlConnection();
  109. sqlPsgSourceConn = PostgreSQLUtility.GetConn(strIP, strDBName, strID, strPWD, strPort);
  110. if (sqlPsgSourceConn == null)
  111. {
  112. MessageBox.Show("連線失敗,請查詢連線資訊");
  113. }
  114. dtResult = ShowPostgreSQLTablesList(sqlPsgSourceConn);
  115. strSourceClass = "PostgreSQL";
  116. Application.DoEvents();
  117. break;
  118. }
  119. dgvExportList.DataSource = dtResult;
  120. blSourceConnStatus = true;
  121. EnableExport(); //啟動匯出鈕
  122. }
  123. else
  124. {
  125. UnLockSourceForm();
  126. }
  127. }
  128. else
  129. {
  130. MessageBox.Show(strCheck);
  131. }
  132. }
  133. catch (Exception ex)
  134. {
  135. UnLockSourceForm();
  136. MessageBox.Show("連線失敗,請查詢連線資訊");
  137. ErrorHandler.WriteErrorLog("Form1.btnSourceConnTest_Click", ex);
  138. }
  139. }
  140. private void btnTargetConnTest_Click(object sender, EventArgs e)
  141. {
  142. try
  143. {
  144. string strCheck = CheckTarget();
  145. //查詢目標資料庫中的資料表
  146. string strIP = txtTargetIP.Text.Trim();
  147. string strPort = txtTargetPort.Text.Trim();
  148. string strDBName = txtTargetDBName.Text.Trim();
  149. string strID = txtTargetID.Text.Trim();
  150. string strPWD = txtTargetPWD.Text.Trim();
  151. DataTable dtResult = null;
  152. if (strCheck == "")
  153. {
  154. if (cbTargetClass.Enabled)
  155. {
  156. LockTargetForm();
  157. switch (cbTargetClass.SelectedItem.ToString().Trim())
  158. {
  159. case "MS-SQL":
  160. sqlMSTargetConn = MSSQLUtility.GetConn(strIP, strDBName, strID, strPWD, strPort);
  161. dtResult = ShowMSSQLTableList(sqlMSTargetConn);
  162. strTargetClass = "MS-SQL";
  163. break;
  164. case "MySQL":
  165. sqlMyTargetConn = MySQLUtility.GetConn(strIP, strDBName, strID, strPWD, strPort);
  166. dtResult = ShowMySQLTableList(sqlMyTargetConn, strDBName);
  167. strTargetClass = "MySQL";
  168. Application.DoEvents();
  169. break;
  170. case "Oracle":
  171. sqlOraTargetConn = OracleUtility.GetConn(strIP, strDBName, strID, strPWD, strPort);
  172. dtResult = ShowOracleTableList(sqlOraTargetConn, strDBName);
  173. strTargetClass = "Oracle";
  174. Application.DoEvents();
  175. break;
  176. case "PostgreSQL":
  177. sqlPsgTargetConn = PostgreSQLUtility.GetConn(strIP, strDBName, strID, strPWD, strPort);
  178. dtResult = ShowPostgreSQLTablesList(sqlPsgTargetConn);
  179. strTargetClass = "PostgreSQL";
  180. break;
  181. }
  182. cbTargetTable.DataSource = dtResult;
  183. cbTargetTable.SelectedIndex = -1;
  184. blTargetConnStatus = true;
  185. EnableExport(); //啟動匯出鈕
  186. Application.DoEvents();
  187. }
  188. else
  189. {
  190. UnLockTargetForm();
  191. Form1_FormClosing(null,null);
  192. }
  193. }
  194. else
  195. {
  196. MessageBox.Show(strCheck);
  197. }
  198. }
  199. catch (Exception ex)
  200. {
  201. MessageBox.Show("連線失敗,請查詢連線資訊");
  202. ErrorHandler.WriteErrorLog("Form1.btnTargetConnTest_Click", ex);
  203. }
  204. }
  205. private void dgvExportList_CellClick(object sender, DataGridViewCellEventArgs e)
  206. {
  207. try
  208. {
  209. if (intExportIndex != e.RowIndex)
  210. {
  211. LocatedTarget(e.RowIndex);
  212. }
  213. }
  214. catch (Exception ex)
  215. {
  216. ErrorHandler.WriteErrorLog("Form1.dgvExportList_CellClick", ex);
  217. }
  218. }
  219. private void dgvExportList_CellContentClick(object sender, DataGridViewCellEventArgs e)
  220. {
  221. try
  222. {
  223. var senderGrid = (DataGridView)sender;
  224. if (e.RowIndex >= 0)
  225. {
  226. //清除該列資料
  227. if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && senderGrid.Columns[e.ColumnIndex].Name == "clCancel")
  228. {
  229. CleanExpRow(dgvExportList, e.RowIndex);
  230. }
  231. //顯示結果資料
  232. if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && senderGrid.Columns[e.ColumnIndex].Name == "clShow")
  233. {
  234. ShowRow(dgvExportList, e.RowIndex);
  235. }
  236. }
  237. }
  238. catch (Exception ex)
  239. {
  240. ErrorHandler.WriteErrorLog("Form1.dgvExportList_CellContentClick", ex);
  241. }
  242. }
  243. private void cbTargetTable_SelectedIndexChanged(object sender, EventArgs e)
  244. {
  245. try
  246. {
  247. DataTable dtResult = null;
  248. if (strTargetClass != "" && intExportIndex != -1)
  249. {
  250. if (cbTargetTable.SelectedValue != null)
  251. {
  252. //重新修改DataGridView的ComboBox的內容
  253. switch (strTargetClass)
  254. {
  255. case "MS-SQL":
  256. dtResult = ShowMSSQLColumnList(sqlMSTargetConn, cbTargetTable.SelectedValue.ToString());
  257. this.clTargetColumn.DisplayMember = "COLUMN_NAME";
  258. break;
  259. case "MySQL":
  260. dtResult = ShowMySQLColumnList(sqlMyTargetConn, cbTargetTable.SelectedValue.ToString(), txtTargetDBName.Text.Trim());
  261. this.clTargetColumn.DisplayMember = "Field";
  262. break;
  263. case "Oracle":
  264. dtResult = ShowOracleColumnList(sqlOraTargetConn, cbTargetTable.SelectedValue.ToString());
  265. this.clTargetColumn.DisplayMember = "COLUMN_NAME";
  266. break;
  267. case "PostgreSQL":
  268. dtResult = ShowPostgreSQLColumnList(sqlPsgTargetConn, cbTargetTable.SelectedValue.ToString());
  269. this.clTargetColumn.DisplayMember = "COLUMN_NAME";
  270. break;
  271. }
  272. this.clTargetColumn.DataSource = dtResult;
  273. }
  274. }
  275. }
  276. catch (Exception ex)
  277. {
  278. ErrorHandler.WriteErrorLog("Form1.cbTargetTable_SelectedIndexChanged", ex);
  279. }
  280. }
  281. private void dgvColumnMapping_CellContentClick(object sender, DataGridViewCellEventArgs e)
  282. {
  283. try
  284. {
  285. var senderGrid = (DataGridView)sender;
  286. //觸發清除事件
  287. if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0)
  288. {
  289. senderGrid.Rows[e.RowIndex].Cells["clExpColumn"].Value = false;
  290. ((DataGridViewComboBoxCell)senderGrid.Rows[e.RowIndex].Cells["clTargetColumn"]).Value = null;
  291. }
  292. }
  293. catch (Exception ex)
  294. {
  295. ErrorHandler.WriteErrorLog("Form1.dgvColumnMapping_CellContentClick", ex);
  296. }
  297. }
  298. private void btnExport_Click(object sender, EventArgs e)
  299. {
  300. try
  301. {
  302. if (cbSourceClass.SelectedIndex > 0)
  303. {
  304. string strPath = "";
  305. sfPath.AddExtension = false;
  306. sfPath.Filter = "All files (*.*)|*.*";
  307. sfPath.FileName = "Output" + DateTime.Now.ToString("_yyyyMMddHHmmss");
  308. if (sfPath.ShowDialog() == DialogResult.Cancel) //如果按下取消,放棄後面動作
  309. return;
  310. strPath = sfPath.FileName;
  311. //應依不同的來源,處理查詢字串
  312. switch (strTargetClass)
  313. {
  314. case "MS-SQL": //匯出MS-SQL檔
  315. ExportToMSSQLData(sfPath.FileName,sfPath.DefaultExt);
  316. break;
  317. case "MySQL":
  318. ExportToMySQLData(sfPath.FileName, sfPath.DefaultExt);
  319. break;
  320. case "Oracle":
  321. ExportToOracleData(sfPath.FileName, sfPath.DefaultExt);
  322. break;
  323. case "PostgreSQL":
  324. ExportToPostgreSQLData(sfPath.FileName, sfPath.DefaultExt);
  325. break;
  326. }
  327. }
  328. }
  329. catch (Exception ex)
  330. {
  331. ErrorHandler.WriteErrorLog("Form1.btnExport_Click", ex);
  332. }
  333. }
  334. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  335. {
  336. //MS-SQL
  337. //sqlMSSourceConn.Close();
  338. sqlMSSourceConn = null;
  339. //sqlMSTargetConn.Close();
  340. sqlMSTargetConn = null;
  341. //PostgreSQL
  342. //sqlPsgSourceConn.Close();
  343. sqlPsgSourceConn = null;
  344. //sqlPsgTargetConn.Close();
  345. sqlPsgTargetConn = null;
  346. //MySQL
  347. //sqlMySourceConn.Close();
  348. sqlMySourceConn = null;
  349. //sqlMyTargetConn.Close();
  350. sqlMyTargetConn = null;
  351. //Oracle
  352. //sqlOraSourceConn.Close();
  353. sqlOraSourceConn = null;
  354. //sqlOraTargetConn.Close();
  355. sqlOraTargetConn = null;
  356. }
  357. private void btnMapping_Click(object sender, EventArgs e)
  358. {
  359. if (dgvColumnMapping.DataSource == null)
  360. return;
  361. //自動預設產生所有的Mapping檔案
  362. dgvExportList.Rows[intExportIndex].Cells["clMappingData"].Value = GenMappingColumn();
  363. dgvExportList.Rows[intExportIndex].Cells["clExport"].Value = true;
  364. //設定來源與目標的資料表對應
  365. if (cbTargetTable.SelectedValue == null)
  366. {
  367. MessageBox.Show("請選擇目標資料表");
  368. }
  369. else
  370. {
  371. dgvExportList.Rows[intExportIndex].Cells["clTargetTable"].Value = cbTargetTable.SelectedValue.ToString();
  372. dgvExportList.Rows[intExportIndex].Cells["clWhere"].Value = txtWhere.Text.Trim();
  373. }
  374. }
  375. private void cbSourceClass_SelectedValueChanged(object sender, EventArgs e)
  376. {
  377. if (((ComboBox)sender).SelectedIndex != -1)
  378. {
  379. switch (cbSourceClass.SelectedItem.ToString())
  380. {
  381. case "MS-SQL":
  382. txtSourcePort.Text = "1433";
  383. break;
  384. case "MySQL":
  385. txtSourcePort.Text = "3306";
  386. break;
  387. case "Oracle":
  388. txtSourcePort.Text = "1521";
  389. break;
  390. case "PostgreSQL":
  391. txtSourcePort.Text = "5432";
  392. break;
  393. }
  394. }
  395. }
  396. private void cbTargetClass_SelectedValueChanged(object sender, EventArgs e)
  397. {
  398. if (((ComboBox)sender).SelectedIndex != -1)
  399. {
  400. switch (cbTargetClass.SelectedItem.ToString())
  401. {
  402. case "MS-SQL":
  403. txtTargetPort.Text = "1433";
  404. break;
  405. case "MySQL":
  406. txtTargetPort.Text = "3306";
  407. break;
  408. case "Oracle":
  409. txtTargetPort.Text = "1521";
  410. break;
  411. case "PostgreSQL":
  412. txtTargetPort.Text = "5432";
  413. break;
  414. }
  415. }
  416. }
  417. private void btnExportXML_Click(object sender, EventArgs e)
  418. {
  419. try
  420. {
  421. //參數設定
  422. string strXMLFile = ".\\File.xml";
  423. string strSourceTable = "";
  424. string strTargetTable = "";
  425. string strDeleteTable = "";
  426. string strWhere = "";
  427. string strMappingData = "";
  428. XElement xmlRoot = new XElement("Root");
  429. //匯出來源設定
  430. XElement xHead = new XElement("Head");
  431. xmlRoot.Add(xHead);
  432. if (cbSourceClass.SelectedIndex != -1)
  433. {
  434. XElement xSourceDetail = new XElement("SourceDetail");
  435. xSourceDetail.Add(new XAttribute("SourceClass", cbSourceClass.SelectedItem.ToString()));
  436. xSourceDetail.Add(new XAttribute("SourceIP", txtSourceIP.Text.Trim()));
  437. xSourceDetail.Add(new XAttribute("SourcePort", txtSourcePort.Text.Trim()));
  438. xSourceDetail.Add(new XAttribute("SourceDBName", txtSourceDBName.Text.Trim()));
  439. xSourceDetail.Add(new XAttribute("SourceID", txtSourceID.Text.Trim()));
  440. xSourceDetail.Add(new XAttribute("SourcePWD", txtSourcePWD.Text.Trim()));
  441. xHead.Add(xSourceDetail);
  442. }
  443. if (cbTargetClass.SelectedIndex != -1)
  444. {
  445. XElement xTargetDetail = new XElement("TargetDetail");
  446. xTargetDetail.Add(new XAttribute("TargetClass", cbTargetClass.SelectedItem.ToString()));
  447. xTargetDetail.Add(new XAttribute("TargetIP", txtTargetIP.Text.Trim()));
  448. xTargetDetail.Add(new XAttribute("TargetPort", txtTargetPort.Text.Trim()));
  449. xTargetDetail.Add(new XAttribute("TargetDBName", txtTargetDBName.Text.Trim()));
  450. xTargetDetail.Add(new XAttribute("TargetID", txtTargetID.Text.Trim()));
  451. xTargetDetail.Add(new XAttribute("TargetPWD", txtTargetPWD.Text.Trim()));
  452. xHead.Add(xTargetDetail);
  453. XElement xDetail = new XElement("Detail");
  454. xmlRoot.Add(xDetail);
  455. //匯出內容
  456. foreach (DataGridViewRow dgvRow in dgvExportList.Rows)
  457. {
  458. if (dgvRow.Cells["clExport"].Value != null && (bool)dgvRow.Cells["clExport"].Value == true)
  459. {
  460. XElement xColumnSetting = new XElement("ColumnSetting");
  461. strSourceTable = dgvRow.Cells["clSourceTable"].Value.ToString();
  462. strTargetTable = dgvRow.Cells["clTargetTable"].Value.ToString();
  463. if (dgvRow.Cells["clTableDel"].Value != null && Convert.ToBoolean(dgvRow.Cells["clTableDel"].Value) != false)
  464. {
  465. strDeleteTable = "true";
  466. }
  467. else
  468. {
  469. strDeleteTable = "false";
  470. }
  471. strWhere = dgvRow.Cells["clWhere"].Value.ToString();
  472. strMappingData = dgvRow.Cells["clMappingData"].Value.ToString();
  473. xColumnSetting.Add(new XAttribute("SourceTable", strSourceTable));
  474. xColumnSetting.Add(new XAttribute("TargetTable", strTargetTable));
  475. xColumnSetting.Add(new XAttribute("DeleteTable", strDeleteTable));
  476. xColumnSetting.Add(new XAttribute("Where", strWhere));
  477. xColumnSetting.Add(new XAttribute("MappingData", strMappingData));
  478. xDetail.Add(xColumnSetting);
  479. }
  480. }
  481. xmlRoot.Save(strXMLFile);
  482. MessageBox.Show("匯出成功");
  483. }
  484. }
  485. catch (Exception ex)
  486. {
  487. MessageBox.Show("匯出失敗");
  488. ErrorHandler.WriteErrorLog("Form1.cs", ex);
  489. }
  490. }
  491. private void btnImportXML_Click(object sender, EventArgs e)
  492. {
  493. string strFilePath = "";
  494. string strXMLSourceTable = "";
  495. ofPath.Filter = "XML Files(*.xml) | *.xml";
  496. ofPath.InitialDirectory = ".\\";
  497. if (ofPath.ShowDialog() == DialogResult.OK)
  498. {
  499. strFilePath = ofPath.FileName;
  500. if (File.Exists(strFilePath))
  501. {
  502. XDocument xmlContent = XDocument.Load(strFilePath);
  503. foreach (XElement xmlHeadData in xmlContent.Descendants("Head"))
  504. {
  505. //匯入來源設定
  506. cbSourceClass.SelectedItem = xmlHeadData.Element("SourceDetail").Attribute("SourceClass").Value.ToString();
  507. txtSourceIP.Text = xmlHeadData.Element("SourceDetail").Attribute("SourceIP").Value.ToString();
  508. txtSourcePort.Text = xmlHeadData.Element("SourceDetail").Attribute("SourcePort").Value.ToString();
  509. txtSourceDBName.Text = xmlHeadData.Element("SourceDetail").Attribute("SourceDBName").Value.ToString();
  510. txtSourceID.Text = xmlHeadData.Element("SourceDetail").Attribute("SourceID").Value.ToString();
  511. txtSourcePWD.Text = xmlHeadData.Element("SourceDetail").Attribute("SourcePWD").Value.ToString();
  512. btnSourceConnTest_Click(null, null);
  513. //匯入目標設定
  514. cbTargetClass.SelectedItem = xmlHeadData.Element("TargetDetail").Attribute("TargetClass").Value.ToString();
  515. txtTargetIP.Text = xmlHeadData.Element("TargetDetail").Attribute("TargetIP").Value.ToString();
  516. txtTargetPort.Text = xmlHeadData.Element("TargetDetail").Attribute("TargetPort").Value.ToString();
  517. txtTargetDBName.Text = xmlHeadData.Element("TargetDetail").Attribute("TargetDBName").Value.ToString();
  518. txtTargetID.Text = xmlHeadData.Element("TargetDetail").Attribute("TargetID").Value.ToString();
  519. txtTargetPWD.Text = xmlHeadData.Element("TargetDetail").Attribute("TargetPWD").Value.ToString();
  520. btnTargetConnTest_Click(null, null);
  521. }
  522. foreach (XElement xmlDetail in xmlContent.Descendants("ColumnSetting"))
  523. {
  524. strXMLSourceTable = xmlDetail.Attribute("SourceTable").Value.ToString();
  525. foreach (DataGridViewRow dgvRow in dgvExportList.Rows)
  526. {
  527. if (dgvRow.Cells["clSourceTable"].Value.ToString() == strXMLSourceTable)
  528. {
  529. dgvRow.Cells["clExport"].Value = true;
  530. dgvRow.Cells["clTargetTable"].Value = xmlDetail.Attribute("TargetTable").Value.ToString();
  531. dgvRow.Cells["clTableDel"].Value = Convert.ToBoolean(xmlDetail.Attribute("DeleteTable").Value.ToString());
  532. dgvRow.Cells["clWhere"].Value = xmlDetail.Attribute("Where").Value.ToString();
  533. dgvRow.Cells["clMappingData"].Value = xmlDetail.Attribute("MappingData").Value.ToString();
  534. break;
  535. }
  536. }
  537. }
  538. }
  539. }
  540. }
  541. private void btnClean_Click(object sender, EventArgs e)
  542. {
  543. UnLockSourceForm();
  544. cbSourceClass.SelectedIndex = -1;
  545. txtSourceIP.Text = "";
  546. txtSourcePort.Text = "";
  547. txtSourceDBName.Text = "";
  548. txtSourceID.Text = "";
  549. txtSourcePWD.Text = "";
  550. UnLockTargetForm();
  551. cbTargetClass.SelectedIndex = -1;
  552. txtTargetIP.Text = "";
  553. txtTargetPort.Text = "";
  554. txtTargetDBName.Text = "";
  555. txtTargetID.Text = "";
  556. txtTargetPWD.Text = "";
  557. cbTargetTable.SelectedIndex = -1;
  558. cbTargetTable.Enabled = false;
  559. dgvExportList.DataSource = null;
  560. dgvColumnMapping.DataSource = null;
  561. ResetDataGridView(); //重建DataGridView欄位
  562. sqlMSSourceConn = null;
  563. sqlMSTargetConn = null;
  564. sqlPsgSourceConn = null;
  565. sqlPsgTargetConn = null;
  566. sqlMySourceConn = null;
  567. sqlMyTargetConn = null;
  568. sqlOraSourceConn = null;
  569. sqlOraTargetConn = null;
  570. btnImportXML.Enabled = true;
  571. btnExportXML.Enabled = false;
  572. btnExport.Enabled = false;
  573. btnMapping.Enabled = false;
  574. }
  575. #region 自定義功能
  576. #region MS-SQL
  577. public DataSet GetMSSQLResult(string strSQL,SqlConnection conn)
  578. {
  579. DataSet dsData = new DataSet();
  580. try
  581. {
  582. using (SqlDataAdapter sqlAdapter = new SqlDataAdapter(strSQL, conn))
  583. {
  584. if (conn.State == ConnectionState.Closed) //判斷連線狀態
  585. {
  586. conn.Open();
  587. blSourceConnStatus = true;
  588. }
  589. sqlAdapter.Fill(dsData, "Result");
  590. }
  591. return dsData;
  592. }
  593. catch (Exception ex)
  594. {
  595. throw ex;
  596. }
  597. }
  598. private DataTable ShowMSSQLTableList(SqlConnection sqlConn)
  599. {
  600. try
  601. {
  602. string strGetMSSQLTableList = "Select [name] as TableName from sys.tables order by name";
  603. return MSSQLUtility.GetSQLResult(strGetMSSQLTableList, sqlConn);
  604. }
  605. catch (Exception ex)
  606. {
  607. ErrorHandler.WriteErrorLog("Form1.cs", ex);
  608. return null;
  609. }
  610. }
  611. private DataTable ShowMSSQLColumnList(SqlConnection sqlConn, string strTableName)
  612. {
  613. try
  614. {
  615. string strGetMSSQLColumnList = "Select COLUMN_NAME,DATA_TYPE From INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME ='" + strTableName + "' Order by ORDINAL_POSITION";
  616. return MSSQLUtility.GetSQLResult(strGetMSSQLColumnList, sqlConn);
  617. }
  618. catch (Exception ex)
  619. {
  620. ErrorHandler.WriteErrorLog("Form1.cs", ex);
  621. return null;
  622. }
  623. }
  624. private void ShowMSSQLTargetColumnList(SqlConnection sqlConn, string strTableName)
  625. {
  626. try
  627. {
  628. string strGetMSSQLColumnList = "Select COLUMN_NAME From INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME ='" + strTableName + "' Order by ORDINAL_POSITION";
  629. this.clTargetColumn.DisplayMember = "COLUMN_NAME";
  630. this.clTargetColumn.DataSource = MSSQLUtility.GetSQLResult(strGetMSSQLColumnList, sqlConn);
  631. Application.DoEvents();
  632. }
  633. catch (Exception ex)
  634. {
  635. ErrorHandler.WriteErrorLog("Form1.cs", ex);
  636. }
  637. }
  638. private void ExportToMSSQLData(string strPath,string subFileName)
  639. {
  640. ProgressForm pgsForm = new ProgressForm();
  641. int intDataCount = 0;
  642. int intMaxData = 0;
  643. int intProgress = 0;
  644. string strGenResult = "";
  645. string strSourceTable = "";
  646. string strTargetColumns = "";
  647. string strWhere = "";
  648. string strTargetTable = "";
  649. string strDeleteCommand = "";
  650. string strValues = "";
  651. string strFileCount = "";
  652. string[] strColumns = null;
  653. string[,] strColumnResults = new string[dgvExportList.Rows.Count, 2];
  654. string strSelectCommand = "";
  655. try
  656. {
  657. //命令字串處理
  658. strTargetColumns = "";
  659. //取得每個檔案最大筆數
  660. if (Int32.Parse(txtMaxCount.Text.Trim()) > 0)
  661. {
  662. intMaxData = Int32.Parse(txtMaxCount.Text.Trim());
  663. }
  664. else
  665. {
  666. intMaxData = 1;
  667. }
  668. //取得欄位對應字串陣列
  669. pgsForm.WindowState = FormWindowState.Normal;
  670. pgsForm.pbExport.Minimum = 0;
  671. pgsForm.Show();
  672. foreach (DataGridViewRow dgvRow in dgvExportList.Rows)
  673. {
  674. if (dgvRow.Cells["clExport"].Value != null && (bool)dgvRow.Cells["clExport"].Value == true)
  675. {
  676. strSelectCommand = "";
  677. strSourceTable = "";
  678. strTargetColumns = "";
  679. strDeleteCommand = "";
  680. strValues = "";
  681. DataTable dtResult = null;
  682. //取得欄位對應
  683. if (dgvRow.Cells["clMappingData"].Value != null)
  684. {
  685. strColumns = dgvRow.Cells["clMappingData"].Value.ToString().Split('|');
  686. }
  687. //取得來源Table
  688. if (dgvRow.Cells["clSourceTable"].Value != null)
  689. {
  690. if (dgvRow.Cells["clSourceTable"].Value.ToString().Trim() != "")
  691. {
  692. strSourceTable = dgvRow.Cells["clSourceTable"].Value.ToString();
  693. }
  694. }
  695. //取得目標Table
  696. if (dgvRow.Cells["clTargetTable"].Value != null)
  697. {
  698. if (dgvRow.Cells["clTargetTable"].Value.ToString().Trim() != "")
  699. {
  700. strTargetTable = dgvRow.Cells["clTargetTable"].Value.ToString();
  701. }
  702. }
  703. //取得Where條件
  704. if (dgvRow.Cells["clWhere"].Value != null)
  705. {
  706. if (dgvRow.Cells["clWhere"].Value.ToString().Trim() != "")
  707. {
  708. strWhere = " " + dgvRow.Cells["clWhere"].Value.ToString();
  709. }
  710. }
  711. #region 產生來源資料查詢命令
  712. strGenResult = GenExpSourceCommand(strColumns, strSourceClass, strSourceTable, strWhere);
  713. strSelectCommand = strGenResult.Substring(0, strGenResult.IndexOf('|')).Trim();
  714. strTargetColumns = strGenResult.Substring(strGenResult.IndexOf('|') + 1).Trim();
  715. switch (strSourceClass)
  716. {
  717. case "MS-SQL":
  718. dtResult = GetMSSQLResult(strSelectCommand, sqlMSSourceConn).Tables["Result"];
  719. break;
  720. case "MySQL":
  721. dtResult = GetMySQLResult(strSelectCommand, sqlMySourceConn).Tables["Result"];
  722. break;
  723. case "Oracle":
  724. dtResult = GetOracleResult(strSelectCommand, sqlOraSourceConn).Tables["Result"];
  725. break;
  726. case "PostgreSQL":
  727. dtResult = GetPostgreSQLResult(strSelectCommand.ToString(), sqlPsgSourceConn).Tables["Result"];
  728. break;
  729. }
  730. #endregion
  731. //產生匯出資料語法
  732. if (dtResult.Rows.Count > 0)
  733. {
  734. //Progess bar
  735. intProgress = 0;
  736. pgsForm.pbExport.Value = 0;
  737. pgsForm.pbExport.Maximum = dtResult.Rows.Count;
  738. if (dgvRow.Cells["clTargetTable"].Value != null)
  739. {
  740. strTargetTable = dgvRow.Cells["clTargetTable"].Value.ToString();
  741. //撰寫實體檔案
  742. if (intMaxData == 1)
  743. {
  744. //無設定最大筆數
  745. Utility.WriteFile(strPath + ".sql", string.Format("/*======================================================={0}======================================================*/", strTargetTable));
  746. Utility.WriteFile(strPath + ".sql", "Go");
  747. Utility.WriteFile(strPath + ".sql", " ");
  748. }
  749. else
  750. {
  751. //有設定最大筆數
  752. if (strFileCount == "0")
  753. strFileCount = "";
  754. Utility.WriteFile(strPath + strFileCount + ".sql", string.Format("/*======================================================={0}======================================================*/", strTargetTable));
  755. Utility.WriteFile(strPath + strFileCount + ".sql", "Go");
  756. Utility.WriteFile(strPath + strFileCount + ".sql", " ");
  757. }
  758. }
  759. //勾選清除目標資料表
  760. if (dgvRow.Cells["clTableDel"].Value != null && Convert.ToBoolean(dgvRow.Cells["clTableDel"].Value) == false)
  761. {
  762. strDeleteCommand = string.Format("Delete From {0} ", strTargetTable);
  763. if (dgvRow.Cells["clWhere"].Value != null)
  764. {
  765. if (dgvRow.Cells["clWhere"].Value.ToString().Trim() != "")
  766. {
  767. strDeleteCommand += "Where 1=1 And " + dgvRow.Cells["clWhere"].Value.ToString();
  768. }
  769. }
  770. //撰寫實體檔案
  771. if (intMaxData == 1)
  772. {
  773. //無設定最大筆數
  774. Utility.WriteFile(strPath + ".sql", strDeleteCommand + ";");
  775. Utility.WriteFile(strPath + ".sql", "Go");
  776. }
  777. else
  778. {
  779. //有設定最大筆數
  780. if (strFileCount == "0")
  781. strFileCount = "";
  782. Utility.WriteFile(strPath + strFileCount + ".sql", strDeleteCommand + ";");
  783. Utility.WriteFile(strPath + strFileCount + ".sql", "Go");
  784. }
  785. }
  786. //處理筆數上限似資料匯出
  787. foreach (DataRow dr in dtResult.Rows)
  788. {
  789. foreach (DataColumn dc in dtResult.Columns)
  790. {
  791. if (strValues == "")
  792. {
  793. switch (dc.DataType.ToString().ToUpper())
  794. {
  795. case "SYSTEM.DATETIME":
  796. strValues = ConvertMSSQLDataType(DateTime.Parse(dr[dc].ToString()), dc.DataType.ToString());
  797. break;
  798. default:
  799. strValues = ConvertMSSQLDataType(dr[dc].ToString().Trim(), dc.DataType.ToString());
  800. break;
  801. }
  802. }
  803. else
  804. {
  805. switch (dc.DataType.ToString().ToUpper())
  806. {
  807. case "SYSTEM.DATETIME":
  808. strValues += "," + ConvertMSSQLDataType(DateTime.Parse(dr[dc].ToString()), dc.DataType.ToString());
  809. break;
  810. default:
  811. strValues += "," + ConvertMSSQLDataType(dr[dc].ToString().Trim(), dc.DataType.ToString());
  812. break;
  813. }
  814. }
  815. }
  816. //撰寫實體檔案
  817. if (intMaxData == 1)
  818. {
  819. //無設定最大筆數
  820. Utility.WriteFile(strPath + ".sql", string.Format("Insert Into {0} ({1}) Values ({2}) ", strTargetTable, strTargetColumns, strValues));
  821. }
  822. else
  823. {
  824. //有設定最大筆數
  825. if (strFileCount == "0")
  826. strFileCount = "";
  827. Utility.WriteFile(strPath + strFileCount + ".sql", string.Format("Insert Into {0} ({1}) Values ({2}) ", strTargetTable, strTargetColumns, strValues));
  828. }
  829. intDataCount += 1;
  830. intProgress += 1;
  831. pgsForm.pbExport.Value = intProgress; //變化Progess的狀態
  832. Application.DoEvents();
  833. strFileCount = (intDataCount / intMaxData).ToString(); //切分檔案
  834. strValues = ""; //清除已經存在的資料
  835. }
  836. //撰寫實體檔案
  837. if (intMaxData == 1)
  838. {
  839. //無設定最大筆數
  840. Utility.WriteFile(strPath + ".sql", "Go");
  841. }
  842. else
  843. {
  844. //有設定最大筆數
  845. if (strFileCount == "0")
  846. strFileCount = "";
  847. Utility.WriteFile(strPath + strFileCount + ".sql", "Go");
  848. }
  849. }
  850. }
  851. }
  852. MessageBox.Show("匯出完成");
  853. }
  854. catch (Exception ex)
  855. {
  856. MessageBox.Show("匯出失敗");
  857. ErrorHandler.WriteErrorLog("Form1.ExportToMSSQLData", ex);
  858. }
  859. finally
  860. {
  861. pgsForm.Close();
  862. }
  863. }
  864. private string ConvertMSSQLColumnType(string strSourceCol, string strTargetCol, string strType)
  865. {
  866. switch (strType.ToUpper())
  867. {
  868. case "VARCHAR":
  869. return "[" + strSourceCol + "] AS " + strTargetCol;
  870. case "VAR":
  871. return "[" + strSourceCol + "] AS " + strTargetCol;
  872. case "INT":
  873. return "[" + strSourceCol + "] AS " + strTargetCol;
  874. case "DATETIME":
  875. return "Convert(varchar,[" + strSourceCol + "],21) AS " + strTargetCol;
  876. //return "[" + strSourceCol + "] AS " + strTargetCol;
  877. default:
  878. return "[" + strSourceCol + "] AS " + strTargetCol;
  879. }
  880. }
  881. private string ConvertMSSQLDataType(string strData, string strType)
  882. {
  883. if (strData == "")
  884. {
  885. return "Null";
  886. }
  887. switch (strType.ToUpper())
  888. {
  889. case "STRING":
  890. return "'" + strData.ToString().Trim() + "'";
  891. case "INT32":
  892. return strData.ToString().Trim();
  893. case "DECIMAL":
  894. return strData.ToString().Trim();
  895. default:
  896. return "'" + strData.ToString().Trim() + "'";
  897. }
  898. }
  899. private string ConvertMSSQLDataType(DateTime dtData, string strType)
  900. {
  901. return "'" + dtData.ToString("yyyy-MM-dd HH:mm:ss") + "'";
  902. }
  903. #endregion //End of MS-SQL
  904. #region PostgreSQL
  905. public DataSet GetPostgreSQLResult(string strSQL, NpgsqlConnection conn)
  906. {
  907. DataSet dsData = new DataSet();
  908. try
  909. {
  910. using (NpgsqlDataAdapter sqlAdapter = new NpgsqlDataAdapter(strSQL, conn))
  911. {
  912. if (conn.State == ConnectionState.Closed) //判斷連線狀態
  913. {
  914. conn.Open();
  915. blSourceConnStatus = true;
  916. }
  917. sqlAdapter.Fill(dsData, "Result");
  918. }
  919. return dsData;
  920. }
  921. catch (Exception ex)
  922. {
  923. throw ex;
  924. }
  925. }
  926. private DataTable ShowPostgreSQLTablesList(NpgsqlConnection sqlConn)
  927. {
  928. try
  929. {
  930. string strGetSQLTableList = "SELECT tablename FROM pg_tables where schemaname = 'public' order by tablename";
  931. return PostgreSQLUtility.GetSQLResult(strGetSQLTableList, sqlConn);
  932. }
  933. catch (Exception ex)
  934. {
  935. ErrorHandler.WriteErrorLog("Form1.ShowPostgreSQLTablesList", ex);
  936. return null;
  937. }
  938. }
  939. private DataTable ShowPostgreSQLColumnList(NpgsqlConnection sqlConn, string strTableName)
  940. {
  941. try
  942. {
  943. string strGetMSSQLColumnList = "select Column_name, data_type from information_schema.columns where table_schema='public' And table_name ='" + strTableName + "' order by ordinal_position";
  944. return PostgreSQLUtility.GetSQLResult(strGetMSSQLColumnList, sqlConn);
  945. }
  946. catch (Exception ex)
  947. {
  948. ErrorHandler.WriteErrorLog("Form1.ShowPostgreSQLColumnList", ex);
  949. return null;
  950. }
  951. }
  952. private void ExportToPostgreSQLData(string strPath, string subFileName)
  953. {
  954. ProgressForm pgsForm = new ProgressForm();
  955. int intDataCount = 0;
  956. int intMaxData = 0;
  957. int intProgress = 0;
  958. string strGenResult = "";
  959. string strSourceTable = "";
  960. string strTargetColumns = "";
  961. string strWhere = "";
  962. string strTargetTable = "";
  963. string strDeleteCommand = "";
  964. string strValues = "";
  965. string strFileCount = "";
  966. string[] strColumns = null;
  967. string[,] strColumnResults = new string[dgvExportList.Rows.Count, 2];
  968. string strSelectCommand = "";
  969. try
  970. {
  971. //命令字串處理
  972. strTargetColumns = "";
  973. //取得每個檔案最大筆數
  974. if (Int32.Parse(txtMaxCount.Text.Trim()) > 0)
  975. {
  976. intMaxData = Int32.Parse(txtMaxCount.Text.Trim());
  977. }
  978. else
  979. {
  980. intMaxData = 1;
  981. }
  982. //取得欄位對應字串陣列
  983. pgsForm.WindowState = FormWindowState.Normal;
  984. pgsForm.pbExport.Minimum = 0;
  985. pgsForm.Show();
  986. foreach (DataGridViewRow dgvRow in dgvExportList.Rows)
  987. {
  988. if (dgvRow.Cells["clExport"].Value != null && (bool)dgvRow.Cells["clExport"].Value == true)
  989. {
  990. strSelectCommand = "";
  991. strSourceTable = "";
  992. strTargetColumns = "";
  993. strDeleteCommand = "";
  994. strValues = "";
  995. DataTable dtResult = null;
  996. //取得欄位對應
  997. if (dgvRow.Cells["clMappingData"].Value != null)
  998. {
  999. strColumns = dgvRow.Cells["clMappingData"].Value.ToString().Split('|');
  1000. }
  1001. //取得來源Table
  1002. if (dgvRow.Cells["clSourceTable"].Value != null)
  1003. {
  1004. if (dgvRow.Cells["clSourceTable"].Value.ToString().Trim() != "")
  1005. {
  1006. strSourceTable = dgvRow.Cells["clSourceTable"].Value.ToString();
  1007. }
  1008. }
  1009. //取得Where條件
  1010. if (dgvRow.Cells["clWhere"].Value != null)
  1011. {
  1012. if (dgvRow.Cells["clWhere"].Value.ToString().Trim() != "")
  1013. {
  1014. strWhere = " " + dgvRow.Cells["clWhere"].Value.ToString();
  1015. }
  1016. }
  1017. #region 產生來源資料查詢命令
  1018. strGenResult = GenExpSourceCommand(strColumns, strSourceClass, strSourceTable, strWhere);
  1019. strSelectCommand = strGenResult.Substring(0, strGenResult.IndexOf('|')).Trim();
  1020. strTargetColumns = strGenResult.Substring(strGenResult.IndexOf('|') + 1).Trim();
  1021. switch (strSourceClass)
  1022. {
  1023. case "MS-SQL":
  1024. dtResult = GetMSSQLResult(strSelectCommand, sqlMSSourceConn).Tables["Result"];
  1025. break;
  1026. case "MySQL":
  1027. dtResult = GetMySQLResult(strSelectCommand, sqlMySourceConn).Tables["Result"];
  1028. break;
  1029. case "Oracle":
  1030. dtResult = GetOracleResult(strSelectCommand, sqlOraSourceConn).Tables["Result"];
  1031. break;
  1032. case "PostgreSQL":
  1033. dtResult = GetPostgreSQLResult(strSelectCommand.ToString(), sqlPsgSourceConn).Tables["Result"];
  1034. break;
  1035. }
  1036. #endregion
  1037. //產生匯出資料語法
  1038. if (dtResult.Rows.Count > 0)
  1039. {
  1040. //Progess bar
  1041. intProgress = 0;
  1042. pgsForm.pbExport.Value = 0;
  1043. pgsForm.pbExport.Maximum = dtResult.Rows.Count;
  1044. if (dgvRow.Cells["clTargetTable"].Value != null)
  1045. {
  1046. strTargetTable = dgvRow.Cells["clTargetTable"].Value.ToString();
  1047. //strFileCount = (intDataCount / intMaxData).ToString(); //切分檔案
  1048. //撰寫實體檔案
  1049. if (intMaxData == 1)
  1050. {
  1051. //無設定最大筆數
  1052. Utility.WriteFile(strPath + ".sql", string.Format("/*======================================================={0}======================================================*/", strTargetTable));
  1053. Utility.WriteFile(strPath + ".sql", "Go");
  1054. Utility.WriteFile(strPath + ".sql", " ");
  1055. }
  1056. else
  1057. {
  1058. //有設定最大筆數
  1059. if (strFileCount == "0")
  1060. strFileCount = "";
  1061. Utility.WriteFile(strPath + strFileCount + ".sql", string.Format("/*======================================================={0}======================================================*/", strTargetTable));
  1062. Utility.WriteFile(strPath + strFileCount + ".sql", " ");
  1063. }
  1064. }
  1065. //勾選清除目標資料表
  1066. if (dgvRow.Cells["clTableDel"].Value != null && Convert.ToBoolean(dgvRow.Cells["clTableDel"].Value) == false)
  1067. {
  1068. strDeleteCommand = string.Format("Delete From \"{0}\" ;", strTargetTable);
  1069. if (dgvRow.Cells["clWhere"].Value != null)
  1070. {
  1071. if (dgvRow.Cells["clWhere"].Value.ToString().Trim() != "")
  1072. {
  1073. strDeleteCommand += "Where 1=1 And " + dgvRow.Cells["clWhere"].Value.ToString();
  1074. }
  1075. }
  1076. //撰寫實體檔案
  1077. if (intMaxData == 1)
  1078. {
  1079. //無設定最大筆數
  1080. Utility.WriteFile(strPath + ".sql", strDeleteCommand);
  1081. }
  1082. else
  1083. {
  1084. //有設定最大筆數
  1085. if (strFileCount == "0")
  1086. strFileCount = "";
  1087. Utility.WriteFile(strPath + strFileCount + ".sql", strDeleteCommand);
  1088. }
  1089. }
  1090. //處理筆數上限似資料匯出
  1091. foreach (DataRow dr in dtResult.Rows)
  1092. {
  1093. foreach (DataColumn dc in dtResult.Columns)
  1094. {
  1095. if (strValues == "")
  1096. {
  1097. switch (dc.DataType.ToString().ToUpper())
  1098. {
  1099. case "TIMESTAMP WITH TIME ZONE":
  1100. strValues = ConvertMSSQLDataType(DateTime.Parse(dr[dc].ToString()), dc.DataType.ToString());
  1101. break;
  1102. case "TIMESTAMP WITHOUT TIME ZONE":
  1103. strValues = ConvertMSSQLDataType(DateTime.Parse(dr[dc].ToString()), dc.DataType.ToString());
  1104. break;
  1105. default:
  1106. strValues = ConvertMSSQLDataType(dr[dc].ToString().Trim(), dc.DataType.ToString());
  1107. break;
  1108. }
  1109. }
  1110. else
  1111. {
  1112. switch (dc.DataType.ToString().ToUpper())
  1113. {
  1114. case "TIMESTAMP WITH TIME ZONE":
  1115. strValues += "," + ConvertMSSQLDataType(DateTime.Parse(dr[dc].ToString()), dc.DataType.ToString());
  1116. break;
  1117. case "TIMESTAMP WITHOUT TIME ZONE":
  1118. strValues += "," + ConvertMSSQLDataType(DateTime.Parse(dr[dc].ToString()), dc.DataType.ToString());
  1119. break;
  1120. default:
  1121. strValues += "," + ConvertMSSQLDataType(dr[dc].ToString().Trim(), dc.DataType.ToString());
  1122. break;
  1123. }
  1124. }
  1125. }
  1126. //撰寫實體檔案
  1127. if (intMaxData == 1)
  1128. {
  1129. //無設定最大筆數
  1130. Utility.WriteFile(strPath + ".sql", string.Format("Insert Into \"{0}\" ({1}) Values ({2}) ;", strTargetTable, strTargetColumns, strValues));
  1131. }
  1132. else
  1133. {
  1134. //有設定最大筆數
  1135. if (strFileCount == "0")
  1136. strFileCount = "";
  1137. Utility.WriteFile(strPath + strFileCount + ".sql", string.Format("Insert Into \"{0}\" ({1}) Values ({2}) ;", strTargetTable, strTargetColumns, strValues));
  1138. }
  1139. intDataCount += 1;
  1140. intProgress += 1;
  1141. pgsForm.pbExport.Value = intProgress; //變化Progess的狀態
  1142. Application.DoEvents();
  1143. strFileCount = (intDataCount / intMaxData).ToString(); //切分檔案
  1144. strValues = ""; //清除已經存在的資料
  1145. }
  1146. }
  1147. }
  1148. }
  1149. MessageBox.Show("匯出完成");
  1150. }
  1151. catch (Exception ex)
  1152. {
  1153. MessageBox.Show("匯出失敗");
  1154. ErrorHandler.WriteErrorLog("Form1.ExportToPostgreSQLData", ex);
  1155. }
  1156. finally
  1157. {
  1158. pgsForm.Close();
  1159. }
  1160. }
  1161. private string ConvertPostgreSQLColumnType(string strSourceCol, string strTargetCol, string strType)
  1162. {
  1163. switch (strType.ToUpper())
  1164. {
  1165. case "TEXT":
  1166. return strSourceCol + " AS " + strTargetCol;
  1167. case "CHARATER VARYING":
  1168. return strSourceCol + " AS " + strTargetCol;
  1169. case "DOUBLE PRECISION":
  1170. return strSourceCol + " AS " + strTargetCol;
  1171. case "BOOLEAN":
  1172. return strSourceCol + " AS " + strTargetCol;
  1173. case "BIGINT":
  1174. return strSourceCol + " AS " + strTargetCol;
  1175. case "INTEGER":
  1176. return strSourceCol + " AS " + strTargetCol;
  1177. //case "TIMESTAMP WITH TIME ZONE":
  1178. // return "to_char(" + strSourceCol + ", 'yyyy-MM-dd hh24:mm:ss')";
  1179. //case "TIMESTAMP WITHOUT TIME ZONE":
  1180. // return "to_char(" + strSourceCol + ", 'yyyy-MM-dd hh24:mm:ss')";
  1181. default:
  1182. return strSourceCol + " AS " + strTargetCol;
  1183. }
  1184. }
  1185. private string ConvertPostgreSQLDataType(string strData, string strType)
  1186. {
  1187. if (strData == "")
  1188. {
  1189. return "Null";
  1190. }
  1191. switch (strType.ToUpper())
  1192. {
  1193. case "SYSTEM.STRING":
  1194. return "'" + strData.ToString().Replace("'","''").Trim() + "'";
  1195. case "SYSTEM.INT32":
  1196. return strData.ToString().Trim();
  1197. //case "SYSTEM.DATETIME":
  1198. //return "'" + strData.ToString().Trim() + "'";
  1199. case "SYSTEM.BOOLEAN":
  1200. return strData.ToString().Trim();
  1201. default:
  1202. return "'" + strData.ToString().Replace("'", "''").Trim() + "'";
  1203. }
  1204. }
  1205. private string ConvertPostgreSQLDataType(DateTime dtData, string strType)
  1206. {
  1207. return "'" + dtData.ToString("yyyy-MM-dd HH:mm:ss") + "'";
  1208. }
  1209. #endregion //End of PostgreSQL
  1210. #region MySQL
  1211. public DataSet GetMySQLResult(string strSQL, MySqlConnection conn)
  1212. {
  1213. DataSet dsData = new DataSet();
  1214. try
  1215. {
  1216. using (MySqlDataAdapter sqlAdapter = new MySqlDataAdapter(strSQL, conn))
  1217. {
  1218. if (conn.State == ConnectionState.Closed) //判斷連線狀態
  1219. {
  1220. conn.Open();
  1221. blSourceConnStatus = true;
  1222. }
  1223. sqlAdapter.Fill(dsData, "Result");
  1224. }
  1225. return dsData;
  1226. }
  1227. catch (Exception ex)
  1228. {
  1229. throw ex;
  1230. }
  1231. }
  1232. private DataTable ShowMySQLTableList(MySqlConnection sqlConn, string strDBName)
  1233. {
  1234. try
  1235. {
  1236. DataTable dtTemp = null;
  1237. string strGetMSSQLTableList = "Show tables from " + strDBName;
  1238. dtTemp = MySQLUtility.GetSQLResult(strGetMSSQLTableList, sqlConn);
  1239. dtTemp.Columns[0].ColumnName = "TableName";
  1240. return dtTemp;
  1241. }
  1242. catch (Exception ex)
  1243. {
  1244. ErrorHandler.WriteErrorLog("Form1.ShowMySQLTableList", ex);
  1245. return null;
  1246. }
  1247. }
  1248. private DataTable ShowMySQLColumnList(MySqlConnection sqlConn, string strTableName, string strDBName)
  1249. {
  1250. try
  1251. {
  1252. string strGetMSSQLColumnList = "Show COLUMNS FROM " + strTableName + " FROM " + strDBName;
  1253. return MySQLUtility.GetSQLResult(strGetMSSQLColumnList, sqlConn);
  1254. }
  1255. catch (Exception ex)
  1256. {
  1257. ErrorHandler.WriteErrorLog("Form1.cs", ex);
  1258. return null;
  1259. }
  1260. }
  1261. private void ShowMySQLTargetColumnList(MySqlConnection sqlConn, string strTableName, string strDBName)
  1262. {
  1263. try
  1264. {
  1265. string strGetMySQLColumnList = "Show COLUMNS FROM " + strTableName + " FROM " + strDBName;
  1266. DataTable dtTemp = MySQLUtility.GetSQLResult(strGetMySQLColumnList, sqlConn);
  1267. dtTemp.Columns[0].ColumnName = "COLUMN_NAME";
  1268. this.clTargetColumn.DisplayMember = "COLUMN_NAME";
  1269. this.clTargetColumn.DataSource = dtTemp;
  1270. Application.DoEvents();
  1271. }
  1272. catch (Exception ex)
  1273. {
  1274. ErrorHandler.WriteErrorLog("Form1.ShowMySQLTargetColumnList", ex);
  1275. }
  1276. }
  1277. private void ExportToMySQLData(string strPath, string subFileName)
  1278. {
  1279. ProgressForm pgsForm = new ProgressForm();
  1280. int intDataCount = 0;
  1281. int intMaxData = 0;
  1282. int intProgress = 0;
  1283. string strGenResult = "";
  1284. string strSourceTable = "";
  1285. string strTargetColumns = "";
  1286. string strWhere = "";
  1287. string strTargetTable = "";
  1288. string strDeleteCommand = "";
  1289. string strValues = "";
  1290. string strFileCount = "";
  1291. string[] strColumns = null;
  1292. string[,] strColumnResults = new string[dgvExportList.Rows.Count, 2];
  1293. string strSelectCommand = "";
  1294. try
  1295. {
  1296. //命令字串處理
  1297. strTargetColumns = "";
  1298. //取得每個檔案最大筆數
  1299. if (Int32.Parse(txtMaxCount.Text.Trim()) > 0)
  1300. {
  1301. intMaxData = Int32.Parse(txtMaxCount.Text.Trim());
  1302. }
  1303. else
  1304. {
  1305. intMaxData = 1;
  1306. }
  1307. //取得欄位對應字串陣列
  1308. pgsForm.WindowState = FormWindowState.Normal;
  1309. pgsForm.pbExport.Minimum = 0;
  1310. pgsForm.Show();
  1311. foreach (DataGridViewRow dgvRow in dgvExportList.Rows)
  1312. {
  1313. if (dgvRow.Cells["clExport"].Value != null && (bool)dgvRow.Cells["clExport"].Value == true)
  1314. {
  1315. strSelectCommand = "";
  1316. strSourceTable = "";
  1317. strTargetColumns = "";
  1318. strDeleteCommand = "";
  1319. strValues = "";
  1320. DataTable dtResult = null;
  1321. //取得欄位對應
  1322. if (dgvRow.Cells["clMappingData"].Value != null)
  1323. {
  1324. strColumns = dgvRow.Cells["clMappingData"].Value.ToString().Split('|');
  1325. }
  1326. //取得來源Table
  1327. if (dgvRow.Cells["clSourceTable"].Value != null)
  1328. {
  1329. if (dgvRow.Cells["clSourceTable"].Value.ToString().Trim() != "")
  1330. {
  1331. strSourceTable = dgvRow.Cells["clSourceTable"].Value.ToString();
  1332. }
  1333. }
  1334. //取得目標Table
  1335. if (dgvRow.Cells["clTargetTable"].Value != null)
  1336. {
  1337. if (dgvRow.Cells["clTargetTable"].Value.ToString().Trim() != "")
  1338. {
  1339. strTargetTable = dgvRow.Cells["clTargetTable"].Value.ToString();
  1340. }
  1341. }
  1342. //取得Where條件
  1343. if (dgvRow.Cells["clWhere"].Value != null)
  1344. {
  1345. if (dgvRow.Cells["clWhere"].Value.ToString().Trim() != "")
  1346. {
  1347. strWhere = " " + dgvRow.Cells["clWhere"].Value.ToString();
  1348. }
  1349. }
  1350. #region 產生來源資料查詢命令
  1351. strGenResult = GenExpSourceCommand(strColumns, strSourceClass, strSourceTable, strWhere);
  1352. strSelectCommand = strGenResult.Substring(0, strGenResult.IndexOf('|')).Trim();
  1353. strTargetColumns = strGenResult.Substring(strGenResult.IndexOf('|') + 1).Trim();
  1354. switch (strSourceClass)
  1355. {
  1356. case "MS-SQL":
  1357. dtResult = GetMSSQLResult(strSelectCommand, sqlMSSourceConn).Tables["Result"];
  1358. break;
  1359. case "MySQL":
  1360. dtResult = GetMySQLResult(strSelectCommand, sqlMySourceConn).Tables["Result"];
  1361. break;
  1362. case "Oracle":
  1363. dtResult = GetOracleResult(strSelectCommand, sqlOraSourceConn).Tables["Result"];
  1364. break;
  1365. case "PostgreSQL":
  1366. dtResult = GetPostgreSQLResult(strSelectCommand.ToString(), sqlPsgSourceConn).Tables["Result"];
  1367. break;
  1368. }
  1369. #endregion
  1370. //產生匯出資料語法
  1371. if (dtResult.Rows.Count > 0)
  1372. {
  1373. //Progess bar
  1374. intProgress = 0;
  1375. pgsForm.pbExport.Value = 0;
  1376. pgsForm.pbExport.Maximum = dtResult.Rows.Count;
  1377. if (dgvRow.Cells["clTargetTable"].Value != null)
  1378. {
  1379. strTargetTable = dgvRow.Cells["clTargetTable"].Value.ToString();
  1380. //strFileCount = (intDataCount / intMaxData).ToString(); //切分檔案
  1381. //撰寫實體檔案
  1382. if (intMaxData == 1)
  1383. {
  1384. //無設定最大筆數
  1385. Utility.WriteFile(strPath + ".sql", string.Format("/*======================================================={0}======================================================*/", strTargetTable));
  1386. Utility.WriteFile(strPath + ".sql", string.Format("raiserror('Now Insert {0} Datas .... ', 1, 1)", strTargetTable));
  1387. Utility.WriteFile(strPath + ".sql", "Go");
  1388. Utility.WriteFile(strPath + ".sql", " ");
  1389. }
  1390. else
  1391. {
  1392. //有設定最大筆數
  1393. if (strFileCount == "0")
  1394. strFileCount = "";
  1395. Utility.WriteFile(strPath + strFileCount + ".sql", string.Format("/*======================================================={0}======================================================*/", strTargetTable));
  1396. Utility.WriteFile(strPath + strFileCount + ".sql", string.Format("raiserror('Now Insert {0} Datas .... ', 1, 1)", strTargetTable));
  1397. Utility.WriteFile(strPath + strFileCount + ".sql", "Go");
  1398. Utility.WriteFile(strPath + strFileCount + ".sql", " ");
  1399. }
  1400. }
  1401. //勾選清除目標資料表
  1402. if (dgvRow.Cells["clTableDel"].Value != null && Convert.ToBoolean(dgvRow.Cells["clTableDel"].Value) == false)
  1403. {
  1404. strDeleteCommand = string.Format("Delete From {0} ", strTargetTable);
  1405. if (dgvRow.Cells["clWhere"].Value != null)
  1406. {
  1407. if (dgvRow.Cells["clWhere"].Value.ToString().Trim() != "")
  1408. {
  1409. strDeleteCommand += "Where 1=1 And " + dgvRow.Cells["clWhere"].Value.ToString();
  1410. }
  1411. }
  1412. //撰寫實體檔案
  1413. if (intMaxData == 1)
  1414. {
  1415. //無設定最大筆數
  1416. Utility.WriteFile(strPath + ".sql", strDeleteCommand + ";");
  1417. Utility.WriteFile(strPath + ".sql", "Go");
  1418. }
  1419. else
  1420. {
  1421. //有設定最大筆數
  1422. if (strFileCount == "0")
  1423. strFileCount = "";
  1424. Utility.WriteFile(strPath + strFileCount + ".sql", strDeleteCommand + ";");
  1425. Utility.WriteFile(strPath + strFileCount + ".sql", "Go");
  1426. }
  1427. }
  1428. //處理筆數上限似資料匯出
  1429. foreach (DataRow dr in dtResult.Rows)
  1430. {
  1431. foreach (DataColumn dc in dtResult.Columns)
  1432. {
  1433. if (strValues == "")
  1434. {
  1435. strValues = ConvertMySQLDataType(dr[dc].ToString().Trim(), dc.DataType.ToString());
  1436. }
  1437. else
  1438. {
  1439. strValues += "," + ConvertMySQLDataType(dr[dc].ToString().Trim(), dc.DataType.ToString());
  1440. }
  1441. }
  1442. //撰寫實體檔案
  1443. if (intMaxData == 1)
  1444. {
  1445. //無設定最大筆數
  1446. Utility.WriteFile(strPath + ".sql", string.Format("Insert Into {0} ({1}) Values ({2}) ", strTargetTable, strTargetColumns, strValues));
  1447. }
  1448. else
  1449. {
  1450. //有設定最大筆數
  1451. if (strFileCount == "0")
  1452. strFileCount = "";
  1453. Utility.WriteFile(strPath + strFileCount + ".sql", string.Format("Insert Into {0} ({1}) Values ({2}) ", strTargetTable, strTargetColumns, strValues));
  1454. }
  1455. intDataCount += 1;
  1456. intProgress += 1;
  1457. pgsForm.pbExport.Value = intProgress; //變化Progess的狀態
  1458. Application.DoEvents();
  1459. strFileCount = (intDataCount / intMaxData).ToString(); //切分檔案
  1460. strValues = ""; //清除已經存在的資料
  1461. }
  1462. //撰寫實體檔案
  1463. if (intMaxData == 1)
  1464. {
  1465. //無設定最大筆數
  1466. Utility.WriteFile(strPath + ".sql", "Go");
  1467. }
  1468. else
  1469. {
  1470. //有設定最大筆數
  1471. if (strFileCount == "0")
  1472. strFileCount = "";
  1473. Utility.WriteFile(strPath + strFileCount + ".sql", "Go");
  1474. }
  1475. }
  1476. }
  1477. Application.DoEvents();
  1478. }
  1479. MessageBox.Show("匯出完成");
  1480. }
  1481. catch (Exception ex)
  1482. {
  1483. MessageBox.Show("匯出失敗");
  1484. ErrorHandler.WriteErrorLog("Form1.ExportToMySQLData", ex);
  1485. }
  1486. finally
  1487. {
  1488. pgsForm.Close();
  1489. }
  1490. }
  1491. private string ConvertMySQLColumnType(string strSourceCol, string strTargetCol, string strType)
  1492. {
  1493. //特殊欄位型態處理
  1494. if (strType.IndexOf("enum") != -1)
  1495. {
  1496. strType = "ENUM";
  1497. }
  1498. if (strType.IndexOf("char") != -1)
  1499. {
  1500. strType = "CHAR";
  1501. }
  1502. if (strType.IndexOf("float") != -1)
  1503. {
  1504. strType = "FLOAT";
  1505. }
  1506. switch (strType.ToUpper())
  1507. {
  1508. case "DATETIME":
  1509. return "Date_Format(" + strSourceCol + ",'%Y-%m-%d %H:%i:%s') AS " + strTargetCol;
  1510. case "TIMESTAMP":
  1511. return "Date_Format(" + strSourceCol + ",'%Y-%m-%d %H:%i:%s') AS " + strTargetCol;
  1512. default:
  1513. return strSourceCol + " AS " + strTargetCol;
  1514. }
  1515. }
  1516. private string ConvertMySQLDataType(string strData, string strType)
  1517. {
  1518. if (strData == "")
  1519. {
  1520. return "Null";
  1521. }
  1522. switch (strType.ToUpper())
  1523. {
  1524. case "STRING":
  1525. return "'" + strData.ToString().Trim() + "'";
  1526. case "INT32":
  1527. return strData.ToString().Trim();
  1528. case "DECIMAL":
  1529. return strData.ToString().Trim();
  1530. default:
  1531. return "'" + strData.ToString().Trim() + "'";
  1532. }
  1533. }
  1534. #endregion //End of MySQL
  1535. #region Oracle
  1536. public DataSet GetOracleResult(string strSQL, OracleConnection conn)
  1537. {
  1538. DataSet dsData = new DataSet();
  1539. try
  1540. {
  1541. using (OracleDataAdapter sqlAdapter = new OracleDataAdapter(strSQL, conn))
  1542. {
  1543. if (conn.State == ConnectionState.Closed) //判斷連線狀態
  1544. {
  1545. conn.Open();
  1546. blSourceConnStatus = true;
  1547. }
  1548. sqlAdapter.Fill(dsData, "Result");
  1549. }
  1550. return dsData;
  1551. }
  1552. catch (Exception ex)
  1553. {
  1554. throw ex;
  1555. }
  1556. }
  1557. private DataTable ShowOracleTableList(OracleConnection sqlConn , string strDBName)
  1558. {
  1559. try
  1560. {
  1561. string strGetOracleTableList = "SELECT TABLE_NAME AS TableName FROM ALL_TABLES Where OWNER Not IN ('SYS', 'XDB', 'SYSTEM', 'CTXSYS', 'MDSYS') ";
  1562. return OracleUtility.GetSQLResult(strGetOracleTableList, sqlConn);
  1563. }
  1564. catch (Exception ex)
  1565. {
  1566. ErrorHandler.WriteErrorLog("Form1.ShowOracleTableList", ex);
  1567. return null;
  1568. }
  1569. }
  1570. private DataTable ShowOracleColumnList(OracleConnection sqlConn, string strTableName)
  1571. {
  1572. try
  1573. {
  1574. string strGetOracleColumnList = "Select COLUMN_NAME,DATA_TYPE From ALL_TAB_COLUMNS Where TABLE_NAME ='" + strTableName + "' Order by COLUMN_NAME";
  1575. return OracleUtility.GetSQLResult(strGetOracleColumnList, sqlConn);
  1576. }
  1577. catch (Exception ex)
  1578. {
  1579. ErrorHandler.WriteErrorLog("Form1.ShowOracleColumnList", ex);
  1580. return null;
  1581. }
  1582. }
  1583. private void ShowOracleTargetColumnList(OracleConnection sqlConn, string strTableName)
  1584. {
  1585. try
  1586. {
  1587. string strGetOracleColumnList = "Select COLUMN_NAME From ALL_TAB_COLUMNS Where TABLE_NAME ='" + strTableName + "' Order by COLUMN_NAME";
  1588. this.clTargetColumn.DisplayMember = "COLUMN_NAME";
  1589. this.clTargetColumn.DataSource = OracleUtility.GetSQLResult(strGetOracleColumnList, sqlConn);
  1590. Application.DoEvents();
  1591. }
  1592. catch (Exception ex)
  1593. {
  1594. ErrorHandler.WriteErrorLog("Form1.ShowOracleTargetColumnList", ex);
  1595. }
  1596. }
  1597. private void ExportToOracleData(string strPath, string subFileName)
  1598. {
  1599. ProgressForm pgsForm = new ProgressForm();
  1600. int intDataCount = 0;
  1601. int intMaxData = 0;
  1602. int intProgress = 0;
  1603. string strGenResult = "";
  1604. string strSourceTable = "";
  1605. string strTargetColumns = "";
  1606. string strWhere = "";
  1607. string strTargetTable = "";
  1608. string strDeleteCommand = "";
  1609. string strValues = "";
  1610. string strFileCount = "";
  1611. string[] strColumns = null;
  1612. string[,] strColumnResults = new string[dgvExportList.Rows.Count, 2];
  1613. string strSelectCommand = "";
  1614. try
  1615. {
  1616. //命令字串處理
  1617. strTargetColumns = "";
  1618. //取得每個檔案最大筆數
  1619. if (Int32.Parse(txtMaxCount.Text.Trim()) > 0)
  1620. {
  1621. intMaxData = Int32.Parse(txtMaxCount.Text.Trim());
  1622. }
  1623. else
  1624. {
  1625. intMaxData = 1;
  1626. }
  1627. //取得欄位對應字串陣列
  1628. pgsForm.WindowState = FormWindowState.Normal;
  1629. pgsForm.pbExport.Minimum = 0;
  1630. pgsForm.Show();
  1631. foreach (DataGridViewRow dgvRow in dgvExportList.Rows)
  1632. {
  1633. if (dgvRow.Cells["clExport"].Value != null && (bool)dgvRow.Cells["clExport"].Value == true)
  1634. {
  1635. strSelectCommand = "";
  1636. strSourceTable = "";
  1637. strTargetColumns = "";
  1638. strDeleteCommand = "";
  1639. strValues = "";
  1640. DataTable dtResult = null;
  1641. //取得欄位對應
  1642. if (dgvRow.Cells["clMappingData"].Value != null)
  1643. {
  1644. strColumns = dgvRow.Cells["clMappingData"].Value.ToString().Split('|');
  1645. }
  1646. //取得來源Table
  1647. if (dgvRow.Cells["clSourceTable"].Value != null)
  1648. {
  1649. if (dgvRow.Cells["clSourceTable"].Value.ToString().Trim() != "")
  1650. {
  1651. strSourceTable = dgvRow.Cells["clSourceTable"].Value.ToString();
  1652. }
  1653. }
  1654. //取得目標Table
  1655. if (dgvRow.Cells["clTargetTable"].Value != null)
  1656. {
  1657. if (dgvRow.Cells["clTargetTable"].Value.ToString().Trim() != "")
  1658. {
  1659. strTargetTable = dgvRow.Cells["clTargetTable"].Value.ToString();
  1660. }
  1661. }
  1662. //取得Where條件
  1663. if (dgvRow.Cells["clWhere"].Value != null)
  1664. {
  1665. if (dgvRow.Cells["clWhere"].Value.ToString().Trim() != "")
  1666. {
  1667. strWhere = " " + dgvRow.Cells["clWhere"].Value.ToString();
  1668. }
  1669. }
  1670. #region 產生來源資料查詢命令
  1671. strGenResult = GenExpSourceCommand(strColumns, strSourceClass, strSourceTable, strWhere);
  1672. strSelectCommand = strGenResult.Substring(0, strGenResult.IndexOf('|')).Trim();
  1673. strTargetColumns = strGenResult.Substring(strGenResult.IndexOf('|') + 1).Trim();
  1674. switch (strSourceClass)
  1675. {
  1676. case "MS-SQL":
  1677. dtResult = GetMSSQLResult(strSelectCommand, sqlMSSourceConn).Tables["Result"];
  1678. break;
  1679. case "MySQL":
  1680. dtResult = GetMySQLResult(strSelectCommand, sqlMySourceConn).Tables["Result"];
  1681. break;
  1682. case "Oracle":
  1683. dtResult = GetOracleResult(strSelectCommand, sqlOraSourceConn).Tables["Result"];
  1684. break;
  1685. case "PostgreSQL":
  1686. dtResult = GetPostgreSQLResult(strSelectCommand.ToString(), sqlPsgSourceConn).Tables["Result"];
  1687. break;
  1688. }
  1689. #endregion
  1690. //產生匯出資料語法
  1691. if (dtResult.Rows.Count > 0)
  1692. {
  1693. //Progess bar
  1694. intProgress = 0;
  1695. pgsForm.pbExport.Value = 0;
  1696. pgsForm.pbExport.Maximum = dtResult.Rows.Count;
  1697. if (dgvRow.Cells["clTargetTable"].Value != null)
  1698. {
  1699. strTargetTable = dgvRow.Cells["clTargetTable"].Value.ToString();
  1700. //撰寫實體檔案
  1701. if (intMaxData == 1)
  1702. {
  1703. //無設定最大筆數
  1704. Utility.WriteFile(strPath + ".sql", string.Format("/*======================================================={0}======================================================*/", strTargetTable));
  1705. Utility.WriteFile(strPath + ".sql", " ");
  1706. }
  1707. else
  1708. {
  1709. //有設定最大筆數
  1710. if (strFileCount == "0")
  1711. strFileCount = "";
  1712. Utility.WriteFile(strPath + strFileCount + ".sql", string.Format("/*======================================================={0}======================================================*/", strTargetTable));
  1713. Utility.WriteFile(strPath + strFileCount + ".sql", " ");
  1714. }
  1715. }
  1716. //勾選清除目標資料表
  1717. if (dgvRow.Cells["clTableDel"].Value != null && Convert.ToBoolean(dgvRow.Cells["clTableDel"].Value) == false)
  1718. {
  1719. strDeleteCommand = string.Format("Delete From {0} ", strTargetTable);
  1720. if (dgvRow.Cells["clWhere"].Value != null)
  1721. {
  1722. if (dgvRow.Cells["clWhere"].Value.ToString().Trim() != "")
  1723. {
  1724. strDeleteCommand += "Where 1=1 And " + dgvRow.Cells["clWhere"].Value.ToString();
  1725. }
  1726. }
  1727. //撰寫實體檔案
  1728. if (intMaxData == 1)
  1729. {
  1730. //無設定最大筆數
  1731. Utility.WriteFile(strPath + ".sql", strDeleteCommand + ";");
  1732. }
  1733. else
  1734. {
  1735. //有設定最大筆數
  1736. if (strFileCount == "0")
  1737. strFileCount = "";
  1738. Utility.WriteFile(strPath + strFileCount + ".sql", strDeleteCommand + ";");
  1739. }
  1740. }
  1741. //處理筆數上限似資料匯出
  1742. foreach (DataRow dr in dtResult.Rows)
  1743. {
  1744. foreach (DataColumn dc in dtResult.Columns)
  1745. {
  1746. if (strValues == "")
  1747. {
  1748. switch (dc.DataType.ToString().ToUpper())
  1749. {
  1750. case "SYSTEM.DATETIME":
  1751. strValues = ConvertOracleDataType(DateTime.Parse(dr[dc].ToString()), dc.DataType.ToString());
  1752. break;
  1753. default:
  1754. strValues = ConvertOracleDataType(dr[dc].ToString().Trim(), dc.DataType.ToString());
  1755. break;
  1756. }
  1757. }
  1758. else
  1759. {
  1760. switch (dc.DataType.ToString().ToUpper())
  1761. {
  1762. case "SYSTEM.DATETIME":
  1763. strValues += "," + ConvertOracleDataType(DateTime.Parse(dr[dc].ToString()), dc.DataType.ToString());
  1764. break;
  1765. default:
  1766. strValues += "," + ConvertOracleDataType(dr[dc].ToString().Trim(), dc.DataType.ToString());
  1767. break;
  1768. }
  1769. }
  1770. }
  1771. //撰寫實體檔案
  1772. if (intMaxData == 1)
  1773. {
  1774. //無設定最大筆數
  1775. Utility.WriteFile(strPath + ".sql", string.Format("Insert Into {0} ({1}) Values ({2}) ;", strTargetTable, strTargetColumns, strValues));
  1776. }
  1777. else
  1778. {
  1779. //有設定最大筆數
  1780. if (strFileCount == "0")
  1781. strFileCount = "";
  1782. Utility.WriteFile(strPath + strFileCount + ".sql", string.Format("Insert Into {0} ({1}) Values ({2}) ;", strTargetTable, strTargetColumns, strValues));
  1783. }
  1784. intDataCount += 1;
  1785. intProgress += 1;
  1786. pgsForm.pbExport.Value = intProgress; //變化Progess的狀態
  1787. Application.DoEvents();
  1788. strFileCount = (intDataCount / intMaxData).ToString(); //切分檔案
  1789. strValues = ""; //清除已經存在的資料
  1790. }
  1791. //撰寫實體檔案
  1792. if (intMaxData != 1)
  1793. {
  1794. //有設定最大筆數
  1795. if (strFileCount == "0")
  1796. strFileCount = "";
  1797. }
  1798. }
  1799. }
  1800. }
  1801. MessageBox.Show("匯出完成");
  1802. }
  1803. catch (Exception ex)
  1804. {
  1805. MessageBox.Show("匯出失敗");
  1806. ErrorHandler.WriteErrorLog("Form1.ExportToMSSQLData", ex);
  1807. }
  1808. finally
  1809. {
  1810. pgsForm.Close();
  1811. }
  1812. }
  1813. private string ConvertOracleColumnType(string strSourceCol, string strTargetCol, string strType)
  1814. {
  1815. return strSourceCol + " AS " + strTargetCol;
  1816. //switch (strType.ToUpper())
  1817. //{
  1818. // case "VARCHAR2":
  1819. // return strSourceCol + " AS " + strTargetCol;
  1820. // case "NUMBER":
  1821. // return strSourceCol + " AS " + strTargetCol;
  1822. // case "FLOAT":
  1823. // return strSourceCol + " AS " + strTargetCol;
  1824. // case "INT":
  1825. // return strSourceCol + " AS " + strTargetCol;
  1826. // case "TIMESTAMP(0)":
  1827. // return strSourceCol + " AS " + strTargetCol;
  1828. // case "TIMESTAMP":
  1829. // return strSourceCol + " AS " + strTargetCol;
  1830. // default:
  1831. // return strSourceCol + " AS " + strTargetCol;
  1832. //}
  1833. }
  1834. private string ConvertOracleDataType(string strData, string strType)
  1835. {
  1836. if (strData == "")
  1837. {
  1838. return "Null";
  1839. }
  1840. switch (strType.ToUpper())
  1841. {
  1842. case "SYSTEM.STRING":
  1843. return "'" + strData.ToString().Trim() + "'";
  1844. case "SYSTEM.DECIMAL":
  1845. return strData.ToString().Trim();
  1846. default:
  1847. return "'" + strData.ToString().Trim() + "'";
  1848. }
  1849. }
  1850. private string ConvertOracleDataType(DateTime dtData, string strType)
  1851. {
  1852. return "TO_TIMESTAMP('" + dtData.ToString("yyyy-MM-dd HH:mm:ss") + "', 'YYYY-MM-DD HH24:MI:SS')";
  1853. }
  1854. #endregion //End of Oracle
  1855. private string CheckSource()
  1856. {
  1857. try
  1858. {
  1859. string strResult = "";
  1860. if (cbSourceClass.SelectedIndex <= 0)
  1861. {
  1862. strResult = "請選擇來源資料庫類別";
  1863. cbSourceClass.Focus();
  1864. return strResult;
  1865. }
  1866. else
  1867. {
  1868. if (txtSourceIP.Text.Trim() == "")
  1869. {
  1870. strResult = "來源資料庫IP為必填";
  1871. txtSourceIP.Focus();
  1872. return strResult;
  1873. }
  1874. if (txtSourceDBName.Text.Trim() == "")
  1875. {
  1876. strResult = "來源資料庫名稱為必填";
  1877. txtSourceDBName.Focus();
  1878. return strResult;
  1879. }
  1880. if (txtSourceID.Text.Trim() == "")
  1881. {
  1882. strResult = "來源資料庫帳號為必填";
  1883. txtSourceID.Focus();
  1884. return strResult;
  1885. }
  1886. }
  1887. return strResult;
  1888. }
  1889. catch (Exception ex)
  1890. {
  1891. ErrorHandler.WriteErrorLog("Form1.CheckSource", ex);
  1892. return "發生不明錯誤!";
  1893. }
  1894. }
  1895. private string CheckTarget()
  1896. {
  1897. try
  1898. {
  1899. string strResult = "";
  1900. if (cbTargetClass.SelectedIndex <= 0)
  1901. {
  1902. strResult = "請選擇目標資料庫類別";
  1903. cbTargetClass.Focus();
  1904. return strResult;
  1905. }
  1906. else
  1907. {
  1908. if (txtTargetIP.Text.Trim() == "")
  1909. {
  1910. strResult = "目標資料庫IP為必填";
  1911. txtTargetIP.Focus();
  1912. return strResult;
  1913. }
  1914. if (txtTargetDBName.Text.Trim() == "")
  1915. {
  1916. strResult = "目標資料庫名稱為必填";
  1917. txtTargetDBName.Focus();
  1918. return strResult;
  1919. }
  1920. if (txtTargetID.Text.Trim() == "")
  1921. {
  1922. strResult = "目標資料庫帳號為必填";
  1923. txtTargetID.Focus();
  1924. return strResult;
  1925. }
  1926. }
  1927. return strResult;
  1928. }
  1929. catch (Exception ex)
  1930. {
  1931. ErrorHandler.WriteErrorLog("Form1.CheckTarget", ex);
  1932. return "發生不明錯誤!";
  1933. }
  1934. }
  1935. private void LockSourceForm()
  1936. {
  1937. try
  1938. {
  1939. cbSourceClass.Enabled = false;
  1940. txtSourceIP.Enabled = false;
  1941. txtSourcePort.Enabled = false;
  1942. txtSourceID.Enabled = false;
  1943. txtSourceDBName.Enabled = false;
  1944. txtSourcePWD.Enabled = false;
  1945. btnExportXML.Enabled = true;
  1946. btnImportXML.Enabled = true;
  1947. btnSourceConnTest.Text = "連線中…";
  1948. //dgvExportList.Columns["clSourceTable"].DataPropertyName = "TableName";
  1949. }
  1950. catch (Exception ex)
  1951. {
  1952. ErrorHandler.WriteErrorLog("Form1.LockSourceForm", ex);
  1953. }
  1954. }
  1955. private void UnLockSourceForm()
  1956. {
  1957. try
  1958. {
  1959. cbSourceClass.Enabled = true;
  1960. txtSourceIP.Enabled = true;
  1961. txtSourcePort.Enabled = true;
  1962. txtSourceID.Enabled = true;
  1963. txtSourceDBName.Enabled = true;
  1964. txtSourcePWD.Enabled = true;
  1965. btnExportXML.Enabled = false;
  1966. btnImportXML.Enabled = false;
  1967. btnSourceConnTest.Text = "建立來源連線";
  1968. Application.DoEvents();
  1969. }
  1970. catch (Exception ex)
  1971. {
  1972. ErrorHandler.WriteErrorLog("Form1.UnLockSourceForm", ex);
  1973. }
  1974. }
  1975. private void LockTargetForm()
  1976. {
  1977. try
  1978. {
  1979. cbTargetClass.Enabled = false;
  1980. cbTargetTable.Enabled = true;
  1981. cbTargetTable.ValueMember = "TableName";
  1982. cbTargetTable.DisplayMember = "TableName";
  1983. cbTargetTable.SelectedIndex = -1;
  1984. txtTargetIP.Enabled = false;
  1985. txtTargetPort.Enabled = false;
  1986. txtTargetID.Enabled = false;
  1987. txtTargetDBName.Enabled = false;
  1988. txtTargetPWD.Enabled = false;
  1989. btnTargetConnTest.Text = "連線中…";
  1990. }
  1991. catch (Exception ex)
  1992. {
  1993. ErrorHandler.WriteErrorLog("Form1.LockTargetForm", ex);
  1994. }
  1995. }
  1996. private void UnLockTargetForm()
  1997. {
  1998. try
  1999. {
  2000. cbTargetClass.Enabled = true;
  2001. cbTargetTable.DataSource = null;
  2002. cbTargetTable.ValueMember = "TableName";
  2003. cbTargetTable.DisplayMember = "TableName";
  2004. cbTargetTable.Enabled = false;
  2005. txtTargetIP.Enabled = true;
  2006. txtTargetPort.Enabled = true;
  2007. txtTargetID.Enabled = true;
  2008. txtTargetDBName.Enabled = true;
  2009. txtTargetPWD.Enabled = true;
  2010. btnTargetConnTest.Text = "建立目標連線";
  2011. }
  2012. catch (Exception ex)
  2013. {
  2014. ErrorHandler.WriteErrorLog("Form1.UnLockTargetForm", ex);
  2015. }
  2016. }
  2017. private string GenMappingColumn()
  2018. {
  2019. string strExportColumns = "";
  2020. string strSourceColumn = "";
  2021. string strTargetColumn = "";
  2022. string strSourceColType = "";
  2023. try
  2024. {
  2025. //預設所有欄位均匯出
  2026. foreach (DataGridViewRow dgRow in dgvColumnMapping.Rows)
  2027. {
  2028. //處理下拉欄位空白的問題
  2029. if (dgRow.Cells["clExpColumn"].Value != null)
  2030. {
  2031. if ((bool)dgRow.Cells["clExpColumn"].Value == true)
  2032. {
  2033. if (dgRow.Cells["clSourceColumn"].Value == null)
  2034. {
  2035. strSourceColumn = " ";
  2036. }
  2037. else
  2038. {
  2039. strSourceColumn = dgRow.Cells["clSourceColumn"].Value.ToString();
  2040. }
  2041. if (dgRow.Cells["clType"].Value == null)
  2042. {
  2043. strSourceColType = " ";
  2044. }
  2045. else
  2046. {
  2047. strSourceColType = dgRow.Cells["clType"].Value.ToString();
  2048. }
  2049. if (dgRow.Cells["clTargetColumn"].Value == null)
  2050. {
  2051. strTargetColumn = " ";
  2052. }
  2053. else
  2054. {
  2055. strTargetColumn = dgRow.Cells["clTargetColumn"].Value.ToString();
  2056. }
  2057. if (strExportColumns == "")
  2058. {
  2059. strExportColumns += strSourceColumn + "," + strSourceColType + ";" + strTargetColumn;
  2060. }
  2061. else
  2062. {
  2063. strExportColumns += "|" + strSourceColumn + "," + strSourceColType + ";" + strTargetColumn;
  2064. }
  2065. }
  2066. }
  2067. }
  2068. return strExportColumns;
  2069. }
  2070. catch (Exception ex)
  2071. {
  2072. ErrorHandler.WriteErrorLog("Form1.GenMappingColumn", ex);
  2073. return null;
  2074. }
  2075. }
  2076. private void LocatedTarget(int intRowIndex)
  2077. {
  2078. DataTable dtResult = null;
  2079. try
  2080. {
  2081. if (cbTargetClass.SelectedIndex >= 0 && cbTargetClass.Enabled == false)
  2082. {
  2083. string strTarget = "";
  2084. string[] strColumnMapping = null;
  2085. if (intRowIndex != -1)
  2086. {
  2087. intExportIndex = intRowIndex;
  2088. //設定目標Table下拉式選單的內容
  2089. if (dgvExportList.Rows[intRowIndex].Cells["clTargetTable"].Value != null && dgvExportList.Rows[intRowIndex].Cells["clTargetTable"].Value.ToString() != "")
  2090. {
  2091. strTarget = dgvExportList.Rows[intRowIndex].Cells["clTargetTable"].Value.ToString();
  2092. }
  2093. else
  2094. {
  2095. strTarget = dgvExportList.Rows[intRowIndex].Cells["clSourceTable"].Value.ToString();
  2096. }
  2097. cbTargetTable.SelectedValue = strTarget;
  2098. //取得欄位對應字串陣列
  2099. if (dgvExportList.Rows[intRowIndex].Cells["clMappingData"].Value != null)
  2100. {
  2101. strColumnMapping = dgvExportList.Rows[intRowIndex].Cells["clMappingData"].Value.ToString().Split('|');
  2102. }
  2103. //顯示欄位對應表的內容
  2104. if (!cbTargetClass.Enabled)
  2105. {
  2106. switch (strSourceClass)
  2107. {
  2108. case "MS-SQL":
  2109. dtResult = ShowMSSQLColumnList(sqlMSSourceConn, strTarget.ToString());
  2110. Application.DoEvents();
  2111. break;
  2112. case "MySQL":
  2113. dtResult = ShowMySQLColumnList(sqlMySourceConn, strTarget.ToString(), txtSourceDBName.Text.Trim());
  2114. dtResult.Columns[0].ColumnName = "COLUMN_NAME";
  2115. dtResult.Columns[1].ColumnName = "DATA_TYPE";
  2116. dtResult.Columns.Remove("Null");
  2117. dtResult.Columns.Remove("Key");
  2118. dtResult.Columns.Remove("Default");
  2119. dtResult.Columns.Remove("Extra");
  2120. Application.DoEvents();
  2121. break;
  2122. case "Oracle":
  2123. dtResult = ShowOracleColumnList(sqlOraSourceConn, strTarget.ToString());
  2124. Application.DoEvents();
  2125. break;
  2126. case "PostgreSQL":
  2127. dtResult = ShowPostgreSQLColumnList(sqlPsgSourceConn, strTarget.ToString());
  2128. Application.DoEvents();
  2129. break;
  2130. }
  2131. dgvColumnMapping.DataSource = dtResult;
  2132. }
  2133. if (strColumnMapping != null)
  2134. {
  2135. string strSourceColumn = "";
  2136. string strTargetColumn = "";
  2137. foreach (string strColumn in strColumnMapping)
  2138. {
  2139. strSourceColumn = strColumn.Substring(0, strColumn.IndexOf(',')).Trim();
  2140. strTargetColumn = strColumn.Substring(strColumn.IndexOf(',') + 1).Trim();
  2141. foreach (DataGridViewRow dgvRow in dgvColumnMapping.Rows)
  2142. {
  2143. if (dgvRow.Cells["clSourceColumn"].Value.ToString() == strSourceColumn)
  2144. {
  2145. dgvRow.Cells[0].Value = true;
  2146. }
  2147. }
  2148. }
  2149. }
  2150. else
  2151. {
  2152. //預設所有欄位均匯出
  2153. foreach (DataGridViewRow dgRow in dgvColumnMapping.Rows)
  2154. {
  2155. ((DataGridViewCheckBoxCell)dgRow.Cells["clExpColumn"]).Value = true;
  2156. }
  2157. }
  2158. //設定Where條件
  2159. if (dgvExportList.Rows[intRowIndex].Cells["clWhere"].Value != null)
  2160. {
  2161. txtWhere.Text = dgvExportList.Rows[intRowIndex].Cells["clWhere"].Value.ToString();
  2162. }
  2163. else
  2164. {
  2165. txtWhere.Text = "";
  2166. }
  2167. }
  2168. }
  2169. }
  2170. catch (Exception ex)
  2171. {
  2172. ErrorHandler.WriteErrorLog("Form1.LocatedTarget", ex);
  2173. }
  2174. }
  2175. private void CleanExpRow(DataGridView senderGrid, int intRowIndex)
  2176. {
  2177. try
  2178. {
  2179. senderGrid.Rows[intRowIndex].Cells["clExport"].Value = false;
  2180. senderGrid.Rows[intRowIndex].Cells["clTargetTable"].Value = "";
  2181. senderGrid.Rows[intRowIndex].Cells["clTableDel"].Value = false;
  2182. senderGrid.Rows[intRowIndex].Cells["clWhere"].Value = "";
  2183. senderGrid.Rows[intRowIndex].Cells["clMappingData"].Value = "";
  2184. CleanMappingRow(senderGrid, intRowIndex);
  2185. txtWhere.Text = "";
  2186. Application.DoEvents();
  2187. }
  2188. catch (Exception ex)
  2189. {
  2190. ErrorHandler.WriteErrorLog("Form1.CleanExpRow", ex);
  2191. }
  2192. }
  2193. private void ShowRow(DataGridView senderGrid, int intRowIndex)
  2194. {
  2195. try
  2196. {
  2197. DataTable dtResult = null;
  2198. string strTableName = senderGrid.Rows[intRowIndex].Cells["clSourceTable"].Value.ToString();
  2199. switch (strSourceClass)
  2200. {
  2201. case "MS-SQL":
  2202. dtResult = MSSQLUtility.GetTable(strTableName, 200, sqlMSSourceConn);
  2203. break;
  2204. case "MySQL":
  2205. dtResult = MySQLUtility.GetTable(strTableName, 200, sqlMySourceConn);
  2206. break;
  2207. case "Oracle":
  2208. dtResult = OracleUtility.GetTable(strTableName, 200, sqlOraSourceConn);
  2209. break;
  2210. case "PostgreSQL":
  2211. dtResult = PostgreSQLUtility.GetTable(strTableName, 200, sqlPsgSourceConn);
  2212. break;
  2213. }
  2214. ShowForm ResultForm = new ShowForm();
  2215. ResultForm.WindowState = FormWindowState.Normal;
  2216. ResultForm.dgvShowResult.DataSource = dtResult;
  2217. ResultForm.ShowDialog();
  2218. Application.DoEvents();
  2219. }
  2220. catch (Exception ex)
  2221. {
  2222. ErrorHandler.WriteErrorLog("Form1.ShowRow", ex);
  2223. }
  2224. }
  2225. private void CleanMappingRow(DataGridView senderGrid,int intRowIndex)
  2226. {
  2227. DataTable CleanTable = (DataTable)dgvColumnMapping.DataSource;
  2228. CleanTable.Rows.Clear();
  2229. dgvColumnMapping.DataSource = CleanTable;
  2230. }
  2231. private void EnableExport()
  2232. {
  2233. if (blSourceConnStatus == true && blTargetConnStatus == true)
  2234. {
  2235. btnExport.Enabled = true;
  2236. btnMapping.Enabled = true;
  2237. }
  2238. }
  2239. private string GenExpSourceCommand(string[] strColumns, string strSourceClass, string strSourceTable, string strWhere)
  2240. {
  2241. string strSourceColumns = "";
  2242. string strSourceCol = "";
  2243. string strSourceType = "";
  2244. string strTargetColumns = "";
  2245. string strTargetCol = "";
  2246. string[,] strColumnResults = new string[dgvExportList.Rows.Count, 2];
  2247. string strSelectCommand = "";
  2248. //命令字串處理
  2249. strSourceColumns = "";
  2250. strTargetColumns = "";
  2251. try
  2252. {
  2253. foreach (string RowData in strColumns)
  2254. {
  2255. strSourceCol = RowData.Substring(0, RowData.IndexOf(',')).Trim();
  2256. strSourceType = RowData.Substring(RowData.IndexOf(',') + 1, RowData.IndexOf(';') - 1 - RowData.IndexOf(',')).Trim();
  2257. strTargetCol = RowData.Substring(RowData.IndexOf(';') + 1).Trim();
  2258. #region 處理查詢欄位格式
  2259. switch (strSourceClass)
  2260. {
  2261. case "MS-SQL":
  2262. if (strTargetCol == "")
  2263. {
  2264. strTargetCol = strSourceCol;
  2265. }
  2266. if (strSourceColumns == "")
  2267. {
  2268. strSourceColumns += ConvertMSSQLColumnType(strSourceCol, strTargetCol, strSourceType);
  2269. strTargetColumns += "[" + strTargetCol + "]";
  2270. }
  2271. else
  2272. {
  2273. strSourceColumns += "," + ConvertMSSQLColumnType(strSourceCol, strTargetCol, strSourceType);
  2274. strTargetColumns += ",[" + strTargetCol + "]";
  2275. }
  2276. break;
  2277. case "MySQL":
  2278. if (strTargetCol == "")
  2279. {
  2280. strTargetCol = strSourceCol;
  2281. }
  2282. if (strSourceColumns == "")
  2283. {
  2284. strSourceColumns += ConvertMySQLColumnType(strSourceCol, strTargetCol, strSourceType);
  2285. strTargetColumns += strTargetCol ;
  2286. }
  2287. else
  2288. {
  2289. strSourceColumns += "," + ConvertMySQLColumnType(strSourceCol, strTargetCol, strSourceType);
  2290. strTargetColumns += "," + strTargetCol ;
  2291. }
  2292. break;
  2293. case "Oracle":
  2294. if (strTargetCol == "")
  2295. {
  2296. strTargetCol = strSourceCol;
  2297. }
  2298. if (strSourceColumns == "")
  2299. {
  2300. strSourceColumns += ConvertOracleColumnType(strSourceCol, strTargetCol, strSourceType);
  2301. strTargetColumns += strTargetCol;
  2302. }
  2303. else
  2304. {
  2305. strSourceColumns += "," + ConvertOracleColumnType(strSourceCol, strTargetCol, strSourceType);
  2306. strTargetColumns += "," + strTargetCol;
  2307. }
  2308. break;
  2309. case "PostgreSQL":
  2310. if (strTargetCol == "")
  2311. {
  2312. strTargetCol = strSourceCol;
  2313. }
  2314. if (strSourceColumns == "")
  2315. {
  2316. strSourceColumns += ConvertPostgreSQLColumnType(strSourceCol, strTargetCol, strSourceType);
  2317. strTargetColumns += strTargetCol;
  2318. }
  2319. else
  2320. {
  2321. strSourceColumns += "," + ConvertPostgreSQLColumnType(strSourceCol, strTargetCol, strSourceType);
  2322. strTargetColumns += "," + strTargetCol;
  2323. }
  2324. break;
  2325. }
  2326. #endregion
  2327. }
  2328. switch (strSourceClass)
  2329. {
  2330. case "MS-SQL":
  2331. if (strSourceTable != "")
  2332. {
  2333. strSelectCommand += string.Format("Select {0} From {1} ", strSourceColumns, strSourceTable);
  2334. }
  2335. if (strWhere.Trim() != "")
  2336. {
  2337. strSelectCommand += "Where 1=1 And " + strWhere.Trim();
  2338. }
  2339. break;
  2340. case "MySQL":
  2341. if (strSourceTable != "")
  2342. {
  2343. strSelectCommand += string.Format("Select {0} From {1} ", strSourceColumns, strSourceTable);
  2344. }
  2345. if (strWhere.Trim() != "")
  2346. {
  2347. strSelectCommand += "Where 1=1 And " + strWhere.Trim();
  2348. }
  2349. break;
  2350. case "Oracle":
  2351. if (strSourceTable != "")
  2352. {
  2353. strSelectCommand += string.Format("Select {0} From {1} ", strSourceColumns, strSourceTable);
  2354. }
  2355. if (strWhere.Trim() != "")
  2356. {
  2357. strSelectCommand += "Where 1=1 And " + strWhere.Trim();
  2358. }
  2359. break;
  2360. case "PostgreSQL":
  2361. if (strSourceTable != "")
  2362. {
  2363. strSelectCommand += string.Format("Select {0} From \"{1}\" ", strSourceColumns, strSourceTable);
  2364. }
  2365. if (strWhere.Trim() != "")
  2366. {
  2367. strSelectCommand += "Where 1=1 And " + strWhere.Trim();
  2368. }
  2369. break;
  2370. }
  2371. return strSelectCommand +"|" + strTargetColumns;
  2372. }
  2373. catch (Exception ex)
  2374. {
  2375. ErrorHandler.WriteErrorLog("Form1.GenExpSourceCommand", ex);
  2376. return "";
  2377. }
  2378. }
  2379. private void ResetDataGridView()
  2380. {
  2381. #region dgvExportList
  2382. dgvExportList.Columns.Clear();
  2383. //匯出
  2384. DataGridViewCheckBoxColumn clExport = new DataGridViewCheckBoxColumn();
  2385. clExport.HeaderText = "匯出";
  2386. clExport.Name = "clExport";
  2387. clExport.Width = 50;
  2388. //清除
  2389. DataGridViewButtonColumn clCancel = new DataGridViewButtonColumn();
  2390. clCancel.HeaderText = "清除";
  2391. clCancel.Name = "clCancel";
  2392. clCancel.Width = 50;
  2393. //顯示來源
  2394. DataGridViewButtonColumn clShow = new DataGridViewButtonColumn();
  2395. clShow.HeaderText = "顯示來源";
  2396. clShow.Name = "clShow";
  2397. //來源資料表名稱
  2398. DataGridViewTextBoxColumn clSourceTable = new DataGridViewTextBoxColumn();
  2399. clSourceTable.HeaderText = "來源資料表名稱";
  2400. clSourceTable.Name = "clSourceTable";
  2401. clSourceTable.DataPropertyName = "TableName";
  2402. clSourceTable.Width = 200;
  2403. //目標資料表名稱
  2404. DataGridViewTextBoxColumn clTargetTable = new DataGridViewTextBoxColumn();
  2405. clTargetTable.HeaderText = "目標資料表名稱";
  2406. clTargetTable.Name = "clTargetTable";
  2407. clTargetTable.Width = 200;
  2408. //清除目標資料表內容
  2409. DataGridViewCheckBoxColumn clTableDel = new DataGridViewCheckBoxColumn();
  2410. clTableDel.HeaderText = "清除目標資料表內容";
  2411. clTableDel.Name = "clTableDel";
  2412. clTableDel.Width = 200;
  2413. //過濾條件
  2414. DataGridViewTextBoxColumn clWhere = new DataGridViewTextBoxColumn();
  2415. clWhere.HeaderText = "過濾條件";
  2416. clWhere.Name = "clWhere";
  2417. clWhere.Visible = false;
  2418. //欄位對應
  2419. DataGridViewTextBoxColumn clMappingData = new DataGridViewTextBoxColumn();
  2420. clMappingData.HeaderText = "欄位對應";
  2421. clMappingData.Name = "clMappingData";
  2422. clMappingData.Visible = false;
  2423. dgvExportList.Columns.Add(clExport);
  2424. dgvExportList.Columns.Add(clCancel);
  2425. dgvExportList.Columns.Add(clShow);
  2426. dgvExportList.Columns.Add(clSourceTable);
  2427. dgvExportList.Columns.Add(clTargetTable);
  2428. dgvExportList.Columns.Add(clTableDel);
  2429. dgvExportList.Columns.Add(clWhere);
  2430. dgvExportList.Columns.Add(clMappingData);
  2431. #endregion
  2432. #region dgvColumnMapping
  2433. //匯出
  2434. dgvColumnMapping.Columns.Clear();
  2435. DataGridViewCheckBoxColumn clExpColumn = new DataGridViewCheckBoxColumn();
  2436. clExpColumn.HeaderText = "匯出";
  2437. clExpColumn.Name = "clExpColumn";
  2438. clExpColumn.Width = 50;
  2439. //清除
  2440. DataGridViewButtonColumn clClean = new DataGridViewButtonColumn();
  2441. clClean.HeaderText = "清除";
  2442. clClean.Name = "clClean";
  2443. clClean.Width = 50;
  2444. //來源欄位
  2445. DataGridViewTextBoxColumn clSourceColumn = new DataGridViewTextBoxColumn();
  2446. clSourceColumn.HeaderText = "來源欄位";
  2447. clSourceColumn.Name = "clSourceColumn";
  2448. clSourceColumn.DataPropertyName = "COLUMN_NAME";
  2449. clSourceColumn.Width = 100;
  2450. //型態
  2451. DataGridViewTextBoxColumn clType = new DataGridViewTextBoxColumn();
  2452. clType.HeaderText = "型態";
  2453. clType.Name = "clType";
  2454. clType.DataPropertyName = "DATA_TYPE";
  2455. clType.Width = 100;
  2456. //目標欄位
  2457. DataGridViewComboBoxColumn clTargetColumn = new DataGridViewComboBoxColumn();
  2458. clTargetColumn.HeaderText = "目標欄位";
  2459. clTargetColumn.Name = "clTargetColumn";
  2460. clTargetColumn.Width = 100;
  2461. dgvColumnMapping.Columns.Add(clExpColumn);
  2462. dgvColumnMapping.Columns.Add(clClean);
  2463. dgvColumnMapping.Columns.Add(clSourceColumn);
  2464. dgvColumnMapping.Columns.Add(clType);
  2465. dgvColumnMapping.Columns.Add(clTargetColumn);
  2466. #endregion
  2467. }
  2468. #endregion
  2469. }
  2470. }