From 7e280702cda605439434243bb9a27acd0e4b202c Mon Sep 17 00:00:00 2001 From: OCEAN <1010331798@qq.com> Date: Sun, 16 Feb 2025 10:48:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EDmServerInstrumentData.cs?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CNAS_DBSync/frmDatabaseParams.Designer.cs | 5 +- CNAS_DBSync/frmDatabaseParams.cs | 74 +++++++++++ .../InsturmentData/DmServerInstrumentData.cs | 116 ++++++++++++++++++ .../InstrumentDataSourceInfo.cs | 3 +- dll/CnasSynchrousModel.dll | Bin 46592 -> 46592 bytes 5 files changed, 195 insertions(+), 3 deletions(-) create mode 100644 CnasSynchronusClient/InsturmentData/DmServerInstrumentData.cs diff --git a/CNAS_DBSync/frmDatabaseParams.Designer.cs b/CNAS_DBSync/frmDatabaseParams.Designer.cs index b1a08a7..2df9813 100644 --- a/CNAS_DBSync/frmDatabaseParams.Designer.cs +++ b/CNAS_DBSync/frmDatabaseParams.Designer.cs @@ -1804,7 +1804,7 @@ // this.btnDmConn.Location = new System.Drawing.Point(167, 226); this.btnDmConn.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.btnDmConn.Name = "btnDmConn"; + this.btnDmConn.Name = "txtDmPort"; this.btnDmConn.Size = new System.Drawing.Size(472, 28); this.btnDmConn.TabIndex = 68; // @@ -1822,11 +1822,12 @@ // this.button1.Location = new System.Drawing.Point(599, 272); this.button1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.button1.Name = "button1"; + this.button1.Name = "btnDmConn"; this.button1.Size = new System.Drawing.Size(118, 36); this.button1.TabIndex = 69; this.button1.Text = "测试连接"; this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.btnDmConn_Click); // // txtDmServer // diff --git a/CNAS_DBSync/frmDatabaseParams.cs b/CNAS_DBSync/frmDatabaseParams.cs index ebad370..bb2b180 100644 --- a/CNAS_DBSync/frmDatabaseParams.cs +++ b/CNAS_DBSync/frmDatabaseParams.cs @@ -591,6 +591,37 @@ namespace CNAS_DBSync } syncInstrumentItem.SyncInstrumentDSInfo.InstrumentDataSourceType = DataSourceType.Kingbase; } + if (e.TabPage == tabDm) + { + if (!CheckExcelControl() || !CheckAccessControl() || !CheckSQLiteControl() || + !CheckSQLServerControl() || !CheckMySqlControl() || !CheckOracleControl() || + !CheckFoxproControl() || !CheckTxtControl() || !CheckPostgreSqlControl() || + !CheckKingbaseControl()) + { + if (MessageBox.Show("其他数据源存在已保存数据,继续将删除这些值,是否继续", "提示", + MessageBoxButtons.OKCancel) == DialogResult.OK) + { + ClearAccessControl(); + ClearExcelControl(); + ClearSqliteControl(); + ClearSQLServerControl(); + ClearMySQLControl(); + ClearOracleControl(); + ClearFoxproControl(); + ClearTxtControl(); + ClearPostgreSqlControl(); + ClearKingbaseControl(); + + ClearObjectValue(); + } + else + { + ChangeSelectTabPageByType(); + return; + } + } + syncInstrumentItem.SyncInstrumentDSInfo.InstrumentDataSourceType = DataSourceType.Dm; + } } //根据数据源类型切换Tab页 @@ -1266,5 +1297,48 @@ namespace CNAS_DBSync //else // MessageBox.Show("连接失败!"); } + + private void btnDmConn_Click(object sender, EventArgs e) + { + if (this.txtDmHost.Text.Trim() == "" || this.txtDmServer.Text.Trim() == "" || + this.txtDmUser.Text.Trim() == "" || this.btnDmConn.Text.Trim() == "") + { + MessageBox.Show("请填写相关连接信息。"); + return; + } + + InstrumentDataSourceInfo dbinfo = new InstrumentDataSourceInfo(); + dbinfo.Host = this.txtDmHost.Text.Trim(); + dbinfo.ServerName = this.txtDmServer.Text.Trim(); + dbinfo.UserId = this.txtDmUser.Text.Trim(); + dbinfo.UserPwd = this.txtDmPwd.Text.Trim(); + dbinfo.Port = this.btnDmConn.Text.Trim(); + + if (new DmServerInstrumentData(dbinfo, new object[] { "", "", "" }).TestSQLServerLink()) + MessageBox.Show("连接成功!"); + else + MessageBox.Show("连接失败!"); + } + + private bool CheckDmControl() + { + if (this.txtDmHost.Text.Trim() != "" || this.txtDmServer.Text.Trim() != "" || + this.txtDmUser.Text.Trim() != "" || this.txtDmPwd.Text.Trim() != "" || + this.btnDmConn.Text.Trim() != "") + return false; + else + return true; + } + + private void ClearDmControl() + { + this.txtDmHost.Text = ""; + this.txtDmServer.Text = ""; + this.txtDmUser.Text = ""; + this.txtDmPwd.Text = ""; + this.btnDmConn.Text = ""; + } + + } } diff --git a/CnasSynchronusClient/InsturmentData/DmServerInstrumentData.cs b/CnasSynchronusClient/InsturmentData/DmServerInstrumentData.cs new file mode 100644 index 0000000..e05525c --- /dev/null +++ b/CnasSynchronusClient/InsturmentData/DmServerInstrumentData.cs @@ -0,0 +1,116 @@ +using CnasSynchronousCommon; +using CnasSynchronusDAL; +using CnasSynchronusIDAL; +using CnasSynchrousModel; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; + +namespace CnasSynchronusClient +{ + public class DmServerInstrumentData : InstrumentData + { + public string StrHost { get; set; } + public string StrServerName { get; set; } + public string StrUser { get; set; } + public string StrPwd { get; set; } + public string strTableName { get; set; } + public string strDateColumn { get; set; } + public string strDate { get; set; } + public string StrPort { get; set; } + + public IDmDBService dmDataBaseService { get { return new DmDBService(); } } + public DmFormatConfig DmFormat { get; set; } + + public DmServerInstrumentData(InstrumentDataSourceInfo dataSourceInfo, object[] vs) + { + try + { + DmFormat = FileOperation.GetFormatConfigData("DmFormatConfig.xml"); + + this.StrHost = dataSourceInfo.Host; + this.StrServerName = dataSourceInfo.ServerName; + this.StrUser = dataSourceInfo.UserId; + this.StrPwd = dataSourceInfo.UserPwd; + this.StrPort = dataSourceInfo.Port; + + this.strTableName = vs[0].ToString(); + this.strDateColumn = vs[1].ToString(); + this.strDate = vs[2].ToString(); + } + catch (Exception ex) + { + AppLog.Error(ex.Message); + } + } + + public override Dictionary GetInstrumentData() + { + return dmDataBaseService.GetInstrumentData(new DmOpenParams + { + StrHost = StrHost, + StrServer = StrServerName, + StrUser = StrUser, + StrPwd = StrPwd, + StrPort = StrPort + }); + } + + public override DataTable GetInstrumentDataByDate() + { + return dmDataBaseService.GetInstrumentDataByDate( + new DmOpenParams + { + StrHost = StrHost, + StrServer = StrServerName, + StrUser = StrUser, + StrPwd = StrPwd, + StrPort = StrPort, + autoSql = DmFormat.AutoSql + }, + new ConditionParams + { + TableName = strTableName, + DateColumn = strDateColumn, + DateValue = strDate + } + ); + } + + public override DataTable GetInstrumentDataStruct() + { + return dmDataBaseService.GetInstrumentDataStruct( + new DmOpenParams + { + StrHost = StrHost, + StrServer = StrServerName, + StrUser = StrUser, + StrPwd = StrPwd, + StrPort = StrPort, + autoSql = DmFormat.AutoSql + }, + new ConditionParams + { + TableName = strTableName + } + ); + } + + /// + /// 测试连接 + /// + /// + public bool TestSQLServerLink() + { + return dmDataBaseService.TestConnect( + StrHost, + StrServerName, + StrUser, + StrPwd, + StrPort + ); + } + } +} \ No newline at end of file diff --git a/CnasSynchrousModel/InstrumentDataSourceInfo.cs b/CnasSynchrousModel/InstrumentDataSourceInfo.cs index ccd7ee2..ed43996 100644 --- a/CnasSynchrousModel/InstrumentDataSourceInfo.cs +++ b/CnasSynchrousModel/InstrumentDataSourceInfo.cs @@ -20,7 +20,8 @@ namespace CnasSynchrousModel FoxPro, TXT, PostgreSQL, - Kingbase + Kingbase, + Dm } public enum PathType diff --git a/dll/CnasSynchrousModel.dll b/dll/CnasSynchrousModel.dll index b56767f5fa72c3499ad32193526bc5328e381732..0bf58123d9e6b59b5fff182d6e202169aabc9597 100644 GIT binary patch delta 16875 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 EFK(pvf&c&j