using ComponentFactory.Krypton.Toolkit; using MJTop.Data; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Windows.Forms; namespace DBCHM { public partial class DBForm : KryptonForm { private DBForm() : this(OPType.新建) { } /// /// 当前操作类型 /// public OPType OpType { get; private set; } public int Id { get; private set; } public DBForm(OPType opType, int? id = null) { InitializeComponent(); this.OpType = opType; if ((this.OpType == OPType.编辑 || this.OpType == OPType.克隆) && !id.HasValue) { throw new ArgumentNullException(this.OpType + "操作必须传递要操作的Id!"); } else { if (id.HasValue) { foreach (var item in FormUtils.DictDBType) { cboDBType.Items.Add(item.Value.ToString()); } this.Id = id.Value; DBCHMConfig config = ConfigUtils.Get(id.Value); TxtConnectName.Text = config.Name; cboDBType.Text = config.DBType; TxtHost.Text = config.Server; TxtPort.Text = config.Port?.ToString(); TxtUName.Text = config.Uid; TxtPwd.Text = config.Pwd; cboDBName.Text = config.DBName; txtConnTimeOut.Text = config.ConnTimeOut?.ToString(); if (this.OpType == OPType.克隆) { TxtConnectName.Text += "_Clone"; } if (config.DBType == DBType.SQLite.ToString()) { btnSelectFile.Visible = true; TxtHost.Enabled = false; TxtPort.Enabled = false; TxtUName.Enabled = false; //暂不支持 加密的 Sqlite数据库 TxtPwd.Enabled = false; } //编辑时,确定后刷新连接列表 BtnOk.DialogResult = DialogResult.OK; } else { btnSelectFile.Visible = false; } if (string.IsNullOrWhiteSpace(txtConnTimeOut.Text)) { txtConnTimeOut.Text = "30"; } } //为KeyDown能应用到所有控件上 注册 KeyDown 事件 foreach (Control control in this.Controls) { control.KeyDown += control_KeyDown; } lblMsg.Text = string.Empty; } void control_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { this.Close(); } } private void DBFrom_Load(object sender, EventArgs e) { if (OpType == OPType.新建) { foreach (var item in FormUtils.DictDBType) { cboDBType.Items.Add(item.Value.ToString()); } cboDBType.SelectedIndex = 0; string port; if (FormUtils.DictPort.TryGetValue(cboDBType.Text, out port)) { TxtPort.Text = port; } TxtHost.Text = "127.0.0.1"; // TODO 设置默认用户名等 SetUserNameByDbType(); } } private void BtnSelectFile_Click(object sender, EventArgs e) { OpenFileDialog fileDia = new OpenFileDialog(); var dia = fileDia.ShowDialog(); if (dia == DialogResult.OK) { cboDBName.Text = fileDia.FileName; } } public void SetMsg(string msg, bool isSuccess = false) { lblMsg.Text = msg; lblMsg.ForeColor = isSuccess ? System.Drawing.Color.Green : System.Drawing.Color.Red; } private void BtnTestConnect_Click(object sender, EventArgs e) { DBType type = (DBType)Enum.Parse(typeof(DBType), cboDBType.Text); try { if (type == DBType.Oracle && string.IsNullOrWhiteSpace(cboDBName.Text)) { throw new Exception("Oracle没有提供数据库名称查询支持,请输入服务名!"); } var connString = InitConnectionStr(type); List dbNames = null; DBMgr.TryConnect(type, connString, out dbNames); if (dbNames != null && dbNames.Count > 0) { cboDBName.Items.Clear(); foreach (var dbName in dbNames) { cboDBName.Items.Add(dbName); } } this.Text = "连接服务器成功!"; } catch (Exception ex) { MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } } private void BtnCancel_Click(object sender, EventArgs e) { this.Close(); } private void BtnOk_Click(object sender, EventArgs e) { try { if (string.IsNullOrWhiteSpace(TxtConnectName.Text)) { MessageBox.Show("请输入连接名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (string.IsNullOrWhiteSpace(cboDBName.Text)) { MessageBox.Show("请输入数据库名称!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } DBType type = (DBType)Enum.Parse(typeof(DBType), cboDBType.Text); string connString = InitConnectionStr(type); NameValueCollection nvc = new NameValueCollection(); if (OpType == OPType.新建 || OpType == OPType.克隆) { nvc.Add("Name", TxtConnectName.Text.Trim()); nvc.Add("DBType", cboDBType.Text.Trim()); nvc.Add("Server", TxtHost.Enabled ? TxtHost.Text.Trim() : string.Empty); nvc.Add("Port", TxtPort.Enabled ? TxtPort.Text : string.Empty); nvc.Add("DBName", cboDBName.Text.Trim()); nvc.Add("Uid", TxtUName.Enabled ? TxtUName.Text.Trim() : string.Empty); nvc.Add("Pwd", TxtPwd.Enabled ? TxtPwd.Text : string.Empty); nvc.Add("ConnTimeOut", txtConnTimeOut.Enabled ? txtConnTimeOut.Text : "30"); nvc.Add("ConnString", connString); nvc.Add("Modified", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); ConfigUtils.Save(nvc); } else if (OpType == OPType.编辑) { nvc.Add("Id", Id.ToString()); nvc.Add("Name", TxtConnectName.Text.Trim()); nvc.Add("DBType", cboDBType.Text.Trim()); nvc.Add("Server", TxtHost.Enabled ? TxtHost.Text.Trim() : string.Empty); nvc.Add("Port", TxtPort.Enabled ? TxtPort.Text : string.Empty); nvc.Add("DBName", cboDBName.Text.Trim()); nvc.Add("Uid", TxtUName.Enabled ? TxtUName.Text.Trim() : string.Empty); nvc.Add("Pwd", TxtPwd.Enabled ? TxtPwd.Text : string.Empty); nvc.Add("ConnTimeOut", txtConnTimeOut.Enabled ? txtConnTimeOut.Text : "30"); nvc.Add("ConnString", connString); nvc.Add("Modified", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); ConfigUtils.Save(nvc); } FormUtils.ShowProcessing("正在查询表结构信息,请稍等......", this, arg => { try { InitDb(type); } catch (Exception ex) { LogUtils.LogError("BtnOk_Click", Developer.SysDefault, ex, connString); } }, null); this.DialogResult = DialogResult.OK; this.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } } private void cboDBType_SelectedIndexChanged(object sender, EventArgs e) { this.Text = "连接数据库"; string port; if (FormUtils.DictPort.TryGetValue(cboDBType.Text, out port)) { TxtPort.Text = port; } // TODO 设置默认用户名等 SetUserNameByDbType(); } /// /// 根据数据库类型设置默认用户名等 扩展修改 2019-01-24 21:23 /// private void SetUserNameByDbType() { btnSelectFile.Visible = false; TxtHost.Enabled = true; TxtPort.Enabled = true; TxtUName.Enabled = true; sslLabel.Visible = false; noneSSLCB.Visible = false; requiredSSLCB.Visible = false; labDBName.Text = "数据库"; DBType dbtype = (DBType)Enum.Parse(typeof(DBType), cboDBType.Text.ToString()); if (dbtype == DBType.SqlServer) { TxtUName.Text = "sa"; } else if (dbtype == DBType.MySql) { TxtUName.Text = "root"; sslLabel.Visible = true; noneSSLCB.Visible = true; requiredSSLCB.Visible = true; } else if (dbtype == DBType.Oracle || dbtype == DBType.OracleDDTek) { TxtUName.Text = "scott"; labDBName.Text = "服务名"; } else if (dbtype == DBType.PostgreSql) { TxtUName.Text = "postgres"; } else if (dbtype == DBType.DB2) { TxtUName.Text = "db2admin"; } else if(dbtype == DBType.SQLite) { btnSelectFile.Visible = true; TxtHost.Enabled = false; TxtPort.Enabled = false; TxtUName.Enabled = false; //暂不支持 加密的 Sqlite数据库 TxtPwd.Enabled = false; } else { TxtUName.Text = ""; } } /// /// 端口验证 只能输入数字 /// /// /// private void TxtPort_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; if (e.KeyChar == 8 || e.KeyChar == 127)//退格删除,delete删除 { e.Handled = false; } else { if (e.KeyChar >= '0' && e.KeyChar <= '9')//只能输入数字 { int maxPort = 0; int.TryParse(TxtPort.Text + e.KeyChar.ToString(), out maxPort); if (maxPort > 0 && maxPort <= 65535) { e.Handled = false; } } } } private void txtConnectionOut_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; if (e.KeyChar == 8 || e.KeyChar == 127)//退格删除,delete删除 { e.Handled = false; } else { if (e.KeyChar >= '0' && e.KeyChar <= '9')//只能输入数字 { int timtOut = 0; int.TryParse(TxtPort.Text + e.KeyChar.ToString(), out timtOut); if (timtOut > -1) { e.Handled = false; } } } } private void cboDBName_SelectedIndexChanged(object sender, EventArgs e) { this.Text = "连接数据库"; } private void noneSSLCB_Click(object sender, EventArgs e) { if ((sender as CheckBox).Checked == true) { requiredSSLCB.Checked = false; } else { requiredSSLCB.Checked = true; } } private void requiredSSLCB_Click(object sender, EventArgs e) { if ((sender as CheckBox).Checked == true) { noneSSLCB.Checked = false; } else { noneSSLCB.Checked = true; } } private string extraParam = ""; // 额外参数 /// /// 临时处理 /// TODO 创建额外参数 /// private void CreateExtraParam() { // TODO 额外参数 if (noneSSLCB.Checked == true) { this.extraParam = "SslMode=None;"; } else if (requiredSSLCB.Checked == true) { this.extraParam = "SslMode=Required;"; } else { this.extraParam = ""; } } /// /// 临时处理 /// TODO 初始化DB连接 /// /// /// private void InitDb(DBType type) { if (type == DBType.MySql) { CreateExtraParam(); DBUtils.Instance = DBMgr.UseDB(type, TxtHost.Text, (string.IsNullOrWhiteSpace(TxtPort.Text) ? null : new Nullable(Convert.ToInt32(TxtPort.Text))), cboDBName.Text.Trim(), TxtUName.Text, TxtPwd.Text, (string.IsNullOrWhiteSpace(txtConnTimeOut.Text) ? 30 : Convert.ToInt32(txtConnTimeOut.Text)) , 300, this.extraParam); } else { DBUtils.Instance = DBMgr.UseDB(type, TxtHost.Text, (string.IsNullOrWhiteSpace(TxtPort.Text) ? null : new Nullable(Convert.ToInt32(TxtPort.Text))), cboDBName.Text.Trim(), TxtUName.Text, TxtPwd.Text, (string.IsNullOrWhiteSpace(txtConnTimeOut.Text) ? 30 : Convert.ToInt32(txtConnTimeOut.Text)) , 300); } } /// /// 临时处理 /// TODO 初始化连接串 /// private string InitConnectionStr(DBType type) { CreateExtraParam(); string connString = ""; if (type == DBType.MySql) { connString = DBMgr.GetConnectionString(type, TxtHost.Text, (string.IsNullOrWhiteSpace(TxtPort.Text) ? null : new Nullable(Convert.ToInt32(TxtPort.Text))), cboDBName.Text, TxtUName.Text, TxtPwd.Text, (string.IsNullOrWhiteSpace(txtConnTimeOut.Text) ? 30 : Convert.ToInt32(txtConnTimeOut.Text)), this.extraParam); } else { connString = DBMgr.GetConnectionString(type, TxtHost.Text, (string.IsNullOrWhiteSpace(TxtPort.Text) ? null : new Nullable(Convert.ToInt32(TxtPort.Text))), cboDBName.Text, TxtUName.Text, TxtPwd.Text, (string.IsNullOrWhiteSpace(txtConnTimeOut.Text) ? 30 : Convert.ToInt32(txtConnTimeOut.Text)) ); } return connString; } } }