diff --git a/XCoder/App.config b/XCoder/App.config
index 42c09bc..eba03e9 100644
--- a/XCoder/App.config
+++ b/XCoder/App.config
@@ -7,21 +7,12 @@
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true"/>
</appSettings>
<connectionStrings>
- <add name="mssql" connectionString="Data Source=.;Initial Catalog=master;user=sa;password=;" providerName="System.Data.SqlClient"/>
- <add name="mssql2" connectionString="Data Source=.;Initial Catalog=master;user=sa;password=sa;" providerName="System.Data.SqlClient"/>
- <add name="mssql3" connectionString="Data Source=.;Initial Catalog=master;user=sa;password=Pass@word;" providerName="System.Data.SqlClient"/>
- <add name="mssql4" connectionString="Data Source=.;Initial Catalog=master;Integrated Security=True;" providerName="System.Data.SqlClient"/>
+ <add name="mssql" connectionString="Data Source=.;Initial Catalog=master;user=sa;password=sa;" providerName="System.Data.SqlClient"/>
+ <add name="mssql2" connectionString="Data Source=.;Initial Catalog=master;Integrated Security=True;" providerName="System.Data.SqlClient"/>
<add name="Oracle" connectionString="Data Source=Tcp://127.0.0.1/ORCL;User Id=scott;Password=tiger;" providerName="System.Data.OracleClient"/>
<add name="Oracle2" connectionString="Data Source=orc;User ID=admin;Password=admin" providerName="System.Data.OracleClient"/>
<add name="sqlite" connectionString="Data Source=test.db;" providerName="Sqlite"/>
- <add name="MySql" connectionString="Server=127.0.0.1;Port=3306;Database=mysql;Uid=root;Pwd=;" providerName="MySql.Data.MySqlClient"/>
- <add name="MySql2" connectionString="Server=127.0.0.1;Port=3306;Database=mysql;Uid=root;Pwd=root;" providerName="MySql.Data.MySqlClient"/>
- <add name="MySql3" connectionString="Server=127.0.0.1;Port=3306;Database=mysql;Uid=root;Pwd=Pass@word;" providerName="MySql.Data.MySqlClient"/>
+ <add name="MySql" connectionString="Server=127.0.0.1;Port=3306;Database=mysql;Uid=root;Pwd=root;" providerName="MySql.Data.MySqlClient"/>
<add name="PostgreSQL" connectionString="Server=.;Database=master;Uid=root;Pwd=root;" providerName="PostgreSQL.Data.PostgreSQLClient"/>
- <add name="Access" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=~\App_Data\Test.mdb;Persist Security Info=False;OLE DB Services=-1" providerName="Access"/>
- <add name="SqlCe" connectionString="Data Source=test.sdf;" providerName="SqlCe"/>
</connectionStrings>
- <System.Windows.Forms.ApplicationConfigurationSection>
- <add key="DpiAwareness" value="PerMonitorV2"/>
- </System.Windows.Forms.ApplicationConfigurationSection>
</configuration>
diff --git a/XCoder/Data/DbHelper.cs b/XCoder/Data/DbHelper.cs
new file mode 100644
index 0000000..e179ef1
--- /dev/null
+++ b/XCoder/Data/DbHelper.cs
@@ -0,0 +1,276 @@
+using System.Data;
+using System.Data.Common;
+using System.Diagnostics;
+using System.Text;
+using NewLife;
+using NewLife.Log;
+using XCode.DataAccessLayer;
+
+namespace CrazyCoder.Data
+{
+ internal class DbHelper
+ {
+ public static async Task AutoDetectDatabase(Action callback)
+ {
+ // 加上本机MSSQL
+ var localName = "local_MSSQL";
+ var localstr = "Data Source=.;Initial Catalog=master;Integrated Security=True;";
+ if (!ContainConnStr(localstr)) DAL.AddConnStr(localName, localstr, null, "mssql");
+
+ // 检测本地Access和SQLite
+ //ThreadPoolX.QueueUserWorkItem(DetectFile);
+ var t1 = Task.Run(() => DetectFile(callback));
+
+ //!!! 必须另外实例化一个列表,否则作为数据源绑定时,会因为是同一个对象而被跳过
+ //var list = new List<String>();
+
+ // 探测连接中的其它库
+ //ThreadPoolX.QueueUserWorkItem(DetectRemote);
+ var t2 = Task.Run(() => DetectRemote(callback));
+
+ await Task.WhenAll(t1, t2);
+ }
+
+ static Boolean ContainConnStr(String connstr)
+ {
+ foreach (var item in DAL.ConnStrs)
+ {
+ if (connstr.EqualIgnoreCase(item.Value)) return true;
+ }
+ return false;
+ }
+
+ static void DetectFile(Action callback)
+ {
+ var sw = Stopwatch.StartNew();
+
+ var n = 0;
+ var ss = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.*", SearchOption.TopDirectoryOnly);
+ foreach (var item in ss)
+ {
+ var ext = Path.GetExtension(item);
+ if (ext.EqualIgnoreCase(".exe", ".dll", ".zip", ".rar", ".txt", ".config")) continue;
+
+ try
+ {
+ if (DetectFileDb(item)) n++;
+ }
+ catch (Exception ex)
+ {
+ XTrace.WriteException(ex);
+ }
+ }
+
+ sw.Stop();
+ XTrace.WriteLine("自动检测文件{0}个,发现数据库{1}个,耗时:{2}!", ss.Length, n, sw.Elapsed);
+
+ var list = new List<String>();
+ foreach (var item in DAL.ConnStrs)
+ {
+ if (!String.IsNullOrEmpty(item.Value)) list.Add(item.Key);
+ }
+
+ // 远程数据库耗时太长,这里先列出来
+ //this.Invoke(SetDatabaseList, list);
+ callback();
+ }
+
+ static Boolean DetectFileDb(String item)
+ {
+ var sqlite = "SQLite";
+
+ using (var fs = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.Read))
+ {
+ if (fs.Length <= 0) return false;
+
+ var reader = new BinaryReader(fs);
+ var bts = reader.ReadBytes(sqlite.Length);
+ if (bts != null && bts.Length > 0)
+ {
+ if (bts[0] == 'S' && bts[1] == 'Q' && Encoding.ASCII.GetString(bts) == sqlite)
+ {
+ var localstr = String.Format("Data Source={0};", item);
+ if (!ContainConnStr(localstr)) DAL.AddConnStr("SQLite_" + Path.GetFileNameWithoutExtension(item), localstr, null, "SQLite");
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ static async Task DetectRemote(Action callback)
+ {
+ var list = new List<String>();
+ foreach (var item in DAL.ConnStrs)
+ {
+ if (!String.IsNullOrEmpty(item.Value)) list.Add(item.Key);
+ }
+
+ var ts = new List<Task>();
+ foreach (var item in list)
+ {
+ var t1 = Task.Run(() => DetectSqlServer(item, callback));
+ var t2 = Task.Run(() => DetectMySql(item, callback));
+ ts.Add(t1);
+ ts.Add(t2);
+ }
+
+ var localName = "local_MSSQL";
+ if (DAL.ConnStrs.ContainsKey(localName)) DAL.ConnStrs.Remove(localName);
+ //if (list.Contains(localName)) list.Remove(localName);
+
+ await Task.WhenAll(ts);
+ }
+
+ static void DetectSqlServer(String item, Action callback)
+ {
+ try
+ {
+ var dal = DAL.Create(item);
+ if (dal.DbType != DatabaseType.SqlServer) return;
+
+ var sw = Stopwatch.StartNew();
+
+ DataTable dt = null;
+
+ // 列出所有数据库
+ //Boolean old = DAL.ShowSQL;
+ //DAL.ShowSQL = false;
+ //try
+ //{
+ if (dal.Db.CreateMetaData().MetaDataCollections.Contains("Databases"))
+ {
+ dt = dal.Db.CreateSession().GetSchema(null, "Databases", null);
+ }
+ //}
+ //finally { DAL.ShowSQL = old; }
+
+ if (dt == null) return;
+
+ var dbprovider = dal.DbType.ToString();
+ var builder = new DbConnectionStringBuilder
+ {
+ ConnectionString = dal.ConnStr
+ };
+
+ // 统计库名
+ var n = 0;
+ var names = new List<String>();
+ var sysdbnames = new String[] { "master", "tempdb", "model", "msdb" };
+ foreach (DataRow dr in dt.Rows)
+ {
+ var dbname = dr[0].ToString();
+ if (Array.IndexOf(sysdbnames, dbname) >= 0) continue;
+
+ var connName = String.Format("{0}_{1}", item, dbname);
+
+ builder["Database"] = dbname;
+ DAL.AddConnStr(connName, builder.ToString(), null, dbprovider);
+ n++;
+
+ try
+ {
+ var ver = dal.Db.ServerVersion;
+ names.Add(connName);
+ }
+ catch
+ {
+ if (DAL.ConnStrs.ContainsKey(connName)) DAL.ConnStrs.Remove(connName);
+ }
+ }
+
+
+ sw.Stop();
+ XTrace.WriteLine("发现远程数据库{0}个,耗时:{1}!", n, sw.Elapsed);
+
+ if (names != null && names.Count > 0)
+ {
+ var list = new List<String>();
+ foreach (var elm in DAL.ConnStrs)
+ {
+ if (!String.IsNullOrEmpty(elm.Value)) list.Add(elm.Key);
+ }
+ list.AddRange(names);
+
+ //this.Invoke(SetDatabaseList, list);
+ }
+ }
+ catch
+ {
+ //if (item == localName) DAL.ConnStrs.Remove(localName);
+ }
+ }
+
+ static void DetectMySql(String item, Action callback)
+ {
+ try
+ {
+ var dal = DAL.Create(item);
+ if (dal.DbType != DatabaseType.MySql) return;
+
+ var sw = Stopwatch.StartNew();
+
+ // 列出所有数据库
+ DataTable dt = null;
+ if (dal.Db.CreateMetaData().MetaDataCollections.Contains("Databases"))
+ {
+ dt = dal.Db.CreateSession().GetSchema(null, "Databases", null);
+ }
+ if (dt == null) return;
+
+ var dbprovider = dal.DbType.ToString();
+ var builder = new DbConnectionStringBuilder
+ {
+ ConnectionString = dal.ConnStr
+ };
+
+ // 统计库名
+ var n = 0;
+ var names = new List<String>();
+ var sysdbnames = new String[] { "mysql" };
+ foreach (DataRow dr in dt.Rows)
+ {
+ var dbname = dr["database_name"].ToString();
+ if (Array.IndexOf(sysdbnames, dbname) >= 0) continue;
+
+ var connName = String.Format("{0}_{1}", item, dbname);
+
+ builder["Database"] = dbname;
+ DAL.AddConnStr(connName, builder.ToString(), null, dbprovider);
+ n++;
+
+ try
+ {
+ var ver = dal.Db.ServerVersion;
+ names.Add(connName);
+ }
+ catch
+ {
+ if (DAL.ConnStrs.ContainsKey(connName)) DAL.ConnStrs.Remove(connName);
+ }
+ }
+
+ sw.Stop();
+ XTrace.WriteLine("发现远程数据库{0}个,耗时:{1}!", n, sw.Elapsed);
+
+ if (names != null && names.Count > 0)
+ {
+ //var list = new List<String>();
+ //foreach (var elm in DAL.ConnStrs)
+ //{
+ // if (!String.IsNullOrEmpty(elm.Value)) list.Add(elm.Key);
+ //}
+ //list.AddRange(names);
+
+ //this.Invoke(SetDatabaseList, list);
+ callback();
+ }
+ }
+ catch
+ {
+ //if (item == localName) DAL.ConnStrs.Remove(localName);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/XCoder/Data/FrmSync.cs b/XCoder/Data/FrmSync.cs
index 4e094bd..7d0ce37 100644
--- a/XCoder/Data/FrmSync.cs
+++ b/XCoder/Data/FrmSync.cs
@@ -7,6 +7,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
+using NewLife.Configuration;
using XCode.DataAccessLayer;
using XCoder;
@@ -16,6 +17,9 @@ namespace CrazyCoder.Data
[DisplayName("跨库数据同步")]
public partial class FrmSync : Form, IXForm
{
+ DAL _source;
+ DAL _target;
+
public FrmSync()
{
InitializeComponent();
@@ -23,13 +27,53 @@ namespace CrazyCoder.Data
private void FrmSync_Load(Object sender, EventArgs e)
{
- var conns = DAL.ConnStrs.Keys.ToArray();
- cbConn.DataSource = conns;
+ cbConn.DataSource = DAL.ConnStrs.Keys.ToArray();
+
+ Task.Run(() => DbHelper.AutoDetectDatabase(() => this.Invoke(SetDatabaseList, DAL.ConnStrs.Keys.OrderBy(e => e).ToList())));
+ }
+
+ void SetDatabaseList(ICollection<String> list)
+ {
+ var str = cbConn.Text;
+
+ cbConn.DataSource = list;
+ //cbConn.DisplayMember = "value";
+
+ if (!String.IsNullOrEmpty(str)) cbConn.Text = str;
+
+ if (cbConn.SelectedIndex < 0 && cbConn.Items != null && cbConn.Items.Count > 0) cbConn.SelectedIndex = 0;
}
private void btnConnection_Click(Object sender, EventArgs e)
{
+ var btn = sender as Button;
+ if (btn == null) return;
+
+ var connName = cbConn.SelectedItem + "";
+ _source = DAL.Create(connName);
+
+ if (btn.Text == "连接")
+ {
+ var conns = DAL.ConnStrs.Keys.Where(e => e != connName).ToArray();
+ cbTarget.DataSource = conns;
+
+ var tables = _source.Tables;
+
+ var bs = listView1.DataBindings;
+ bs.Add("Name", tables, "Name");
+ bs.Add("DisplayName", tables, "DisplayName");
+
+ gbSource.Enabled = false;
+ gbTarget.Enabled = true;
+ btn.Text = "断开";
+ }
+ else
+ {
+ gbSource.Enabled = true;
+ gbTarget.Enabled = false;
+ btn.Text = "连接";
+ }
}
private void btnSync_Click(Object sender, EventArgs e)
diff --git a/XCoder/Data/FrmSync.Designer.cs b/XCoder/Data/FrmSync.Designer.cs
index 9f43566..182ccca 100644
--- a/XCoder/Data/FrmSync.Designer.cs
+++ b/XCoder/Data/FrmSync.Designer.cs
@@ -55,7 +55,7 @@
this.gbSource.Margin = new System.Windows.Forms.Padding(4);
this.gbSource.Name = "gbSource";
this.gbSource.Padding = new System.Windows.Forms.Padding(4);
- this.gbSource.Size = new System.Drawing.Size(287, 63);
+ this.gbSource.Size = new System.Drawing.Size(396, 63);
this.gbSource.TabIndex = 9;
this.gbSource.TabStop = false;
this.gbSource.Text = "来源";
@@ -69,7 +69,7 @@
this.cbConn.Location = new System.Drawing.Point(87, 18);
this.cbConn.Margin = new System.Windows.Forms.Padding(4);
this.cbConn.Name = "cbConn";
- this.cbConn.Size = new System.Drawing.Size(186, 32);
+ this.cbConn.Size = new System.Drawing.Size(301, 32);
this.cbConn.TabIndex = 13;
//
// label4
@@ -86,7 +86,7 @@
//
this.btnConnection.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.btnConnection.ForeColor = System.Drawing.Color.DeepPink;
- this.btnConnection.Location = new System.Drawing.Point(323, 27);
+ this.btnConnection.Location = new System.Drawing.Point(417, 27);
this.btnConnection.Margin = new System.Windows.Forms.Padding(4);
this.btnConnection.Name = "btnConnection";
this.btnConnection.Size = new System.Drawing.Size(78, 38);
@@ -103,11 +103,11 @@
this.gbTarget.Enabled = false;
this.gbTarget.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.gbTarget.ForeColor = System.Drawing.Color.DeepPink;
- this.gbTarget.Location = new System.Drawing.Point(439, 13);
+ this.gbTarget.Location = new System.Drawing.Point(558, 13);
this.gbTarget.Margin = new System.Windows.Forms.Padding(4);
this.gbTarget.Name = "gbTarget";
this.gbTarget.Padding = new System.Windows.Forms.Padding(4);
- this.gbTarget.Size = new System.Drawing.Size(424, 63);
+ this.gbTarget.Size = new System.Drawing.Size(531, 63);
this.gbTarget.TabIndex = 10;
this.gbTarget.TabStop = false;
this.gbTarget.Text = "目标";
@@ -116,7 +116,7 @@
//
this.btnSync.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
this.btnSync.ForeColor = System.Drawing.Color.DeepPink;
- this.btnSync.Location = new System.Drawing.Point(311, 14);
+ this.btnSync.Location = new System.Drawing.Point(445, 14);
this.btnSync.Margin = new System.Windows.Forms.Padding(4);
this.btnSync.Name = "btnSync";
this.btnSync.Size = new System.Drawing.Size(78, 38);
@@ -134,7 +134,7 @@
this.cbTarget.Location = new System.Drawing.Point(88, 18);
this.cbTarget.Margin = new System.Windows.Forms.Padding(4);
this.cbTarget.Name = "cbTarget";
- this.cbTarget.Size = new System.Drawing.Size(186, 32);
+ this.cbTarget.Size = new System.Drawing.Size(349, 32);
this.cbTarget.TabIndex = 13;
//
// label1
@@ -162,7 +162,7 @@
this.listView1.GridLines = true;
this.listView1.Location = new System.Drawing.Point(12, 83);
this.listView1.Name = "listView1";
- this.listView1.Size = new System.Drawing.Size(851, 443);
+ this.listView1.Size = new System.Drawing.Size(1077, 600);
this.listView1.TabIndex = 11;
this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details;
@@ -187,7 +187,7 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(878, 538);
+ this.ClientSize = new System.Drawing.Size(1104, 695);
this.Controls.Add(this.listView1);
this.Controls.Add(this.gbTarget);
this.Controls.Add(this.gbSource);
diff --git a/XCoder/Windows/FrmMain.cs b/XCoder/Windows/FrmMain.cs
index 9a11e56..36d62b0 100644
--- a/XCoder/Windows/FrmMain.cs
+++ b/XCoder/Windows/FrmMain.cs
@@ -1,15 +1,8 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
+using System.ComponentModel;
using System.Data;
-using System.Data.Common;
using System.Diagnostics;
-using System.IO;
-using System.Linq;
using System.Reflection;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
+using CrazyCoder.Data;
using NewLife;
using NewLife.Log;
using NewLife.Reflection;
@@ -75,7 +68,13 @@ namespace XCoder
//LoadConfig();
- ThreadPoolX.QueueUserWorkItem(AutoDetectDatabase);
+ Task.Run(() => DbHelper.AutoDetectDatabase(() => this.Invoke(SetDatabaseList, DAL.ConnStrs.Keys.OrderBy(e => e).ToList())));
+ //Task.Run(async () =>
+ //{
+ // await DbHelper.AutoDetectDatabase();
+
+ // this.Invoke(SetDatabaseList, DAL.ConnStrs.Keys.ToList());
+ //});
}
private void FrmMain_FormClosing(Object sender, FormClosingEventArgs e)
@@ -136,292 +135,6 @@ namespace XCoder
if (String.IsNullOrEmpty(txt_NameSpace.Text)) txt_NameSpace.Text = cbConn.Text;
}
- void AutoDetectDatabase()
- {
- // 加上本机MSSQL
- var localName = "local_MSSQL";
- var localstr = "Data Source=.;Initial Catalog=master;Integrated Security=True;";
- if (!ContainConnStr(localstr)) DAL.AddConnStr(localName, localstr, null, "mssql");
-
- // 检测本地Access和SQLite
- ThreadPoolX.QueueUserWorkItem(DetectFile);
-
- //!!! 必须另外实例化一个列表,否则作为数据源绑定时,会因为是同一个对象而被跳过
- //var list = new List<String>();
-
- // 探测连接中的其它库
- ThreadPoolX.QueueUserWorkItem(DetectRemote);
- }
-
- void DetectFile()
- {
- var sw = Stopwatch.StartNew();
-
- var n = 0;
- var ss = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.*", SearchOption.TopDirectoryOnly);
- foreach (var item in ss)
- {
- var ext = Path.GetExtension(item);
- //if (ext.EqualIC(".exe")) continue;
- //if (ext.EqualIC(".dll")) continue;
- //if (ext.EqualIC(".zip")) continue;
- //if (ext.EqualIC(".rar")) continue;
- //if (ext.EqualIC(".txt")) continue;
- //if (ext.EqualIC(".config")) continue;
- if (ext.EqualIgnoreCase(".exe", ".dll", ".zip", ".rar", ".txt", ".config")) continue;
-
- try
- {
- if (DetectFileDb(item)) n++;
- }
- catch (Exception ex) { XTrace.WriteException(ex); }
- }
-
- sw.Stop();
- XTrace.WriteLine("自动检测文件{0}个,发现数据库{1}个,耗时:{2}!", ss.Length, n, sw.Elapsed);
-
- var list = new List<String>();
- foreach (var item in DAL.ConnStrs)
- {
- if (!String.IsNullOrEmpty(item.Value)) list.Add(item.Key);
- }
-
- // 远程数据库耗时太长,这里先列出来
- this.Invoke(SetDatabaseList, list);
- }
-
- Boolean DetectFileDb(String item)
- {
- var access = "Standard Jet DB";
- var sqlite = "SQLite";
-
- using (var fs = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.Read))
- {
- if (fs.Length <= 0) return false;
-
- var reader = new BinaryReader(fs);
- var bts = reader.ReadBytes(sqlite.Length);
- if (bts != null && bts.Length > 0)
- {
- if (bts[0] == 'S' && bts[1] == 'Q' && Encoding.ASCII.GetString(bts) == sqlite)
- {
- var localstr = String.Format("Data Source={0};", item);
- if (!ContainConnStr(localstr)) DAL.AddConnStr("SQLite_" + Path.GetFileNameWithoutExtension(item), localstr, null, "SQLite");
- return true;
- }
- else if (bts.Length > 5 && bts[4] == 'S' && bts[5] == 't')
- {
- fs.Seek(4, SeekOrigin.Begin);
- bts = reader.ReadBytes(access.Length);
- if (Encoding.ASCII.GetString(bts) == access)
- {
- var localstr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Persist Security Info=False", item);
- if (!ContainConnStr(localstr)) DAL.AddConnStr("Access_" + Path.GetFileNameWithoutExtension(item), localstr, null, "Access");
- return true;
- }
- }
- }
-
- if (fs.Length > 20)
- {
- fs.Seek(16, SeekOrigin.Begin);
- var ver = reader.ReadInt32();
- if (ver == 0x73616261 ||
- ver == 0x002dd714 ||
- ver == 0x00357b9d ||
- ver == 0x003d0900
- )
- {
- var localstr = String.Format("Data Source={0};", item);
- if (!ContainConnStr(localstr)) DAL.AddConnStr("SqlCe_" + Path.GetFileNameWithoutExtension(item), localstr, null, "SqlCe");
- return true;
- }
- }
- }
-
- return false;
- }
-
- void DetectSqlServer(Object state)
- {
- var item = (String)state;
- try
- {
- var dal = DAL.Create(item);
- if (dal.DbType != DatabaseType.SqlServer) return;
-
- var sw = Stopwatch.StartNew();
-
- DataTable dt = null;
-
- // 列出所有数据库
- //Boolean old = DAL.ShowSQL;
- //DAL.ShowSQL = false;
- //try
- //{
- if (dal.Db.CreateMetaData().MetaDataCollections.Contains("Databases"))
- {
- dt = dal.Db.CreateSession().GetSchema(null, "Databases", null);
- }
- //}
- //finally { DAL.ShowSQL = old; }
-
- if (dt == null) return;
-
- var dbprovider = dal.DbType.ToString();
- var builder = new DbConnectionStringBuilder
- {
- ConnectionString = dal.ConnStr
- };
-
- // 统计库名
- var n = 0;
- var names = new List<String>();
- var sysdbnames = new String[] { "master", "tempdb", "model", "msdb" };
- foreach (DataRow dr in dt.Rows)
- {
- var dbname = dr[0].ToString();
- if (Array.IndexOf(sysdbnames, dbname) >= 0) continue;
-
- var connName = String.Format("{0}_{1}", item, dbname);
-
- builder["Database"] = dbname;
- DAL.AddConnStr(connName, builder.ToString(), null, dbprovider);
- n++;
-
- try
- {
- var ver = dal.Db.ServerVersion;
- names.Add(connName);
- }
- catch
- {
- if (DAL.ConnStrs.ContainsKey(connName)) DAL.ConnStrs.Remove(connName);
- }
- }
-
-
- sw.Stop();
- XTrace.WriteLine("发现远程数据库{0}个,耗时:{1}!", n, sw.Elapsed);
-
- if (names != null && names.Count > 0)
- {
- var list = new List<String>();
- foreach (var elm in DAL.ConnStrs)
- {
- if (!String.IsNullOrEmpty(elm.Value)) list.Add(elm.Key);
- }
- list.AddRange(names);
-
- this.Invoke(SetDatabaseList, list);
- }
- }
- catch
- {
- //if (item == localName) DAL.ConnStrs.Remove(localName);
- }
- }
-
- void DetectMySql(Object state)
- {
- var item = (String)state;
- try
- {
- var dal = DAL.Create(item);
- if (dal.DbType != DatabaseType.MySql) return;
-
- var sw = Stopwatch.StartNew();
-
- // 列出所有数据库
- DataTable dt = null;
- if (dal.Db.CreateMetaData().MetaDataCollections.Contains("Databases"))
- {
- dt = dal.Db.CreateSession().GetSchema(null, "Databases", null);
- }
- if (dt == null) return;
-
- var dbprovider = dal.DbType.ToString();
- var builder = new DbConnectionStringBuilder
- {
- ConnectionString = dal.ConnStr
- };
-
- // 统计库名
- var n = 0;
- var names = new List<String>();
- var sysdbnames = new String[] { "mysql" };
- foreach (DataRow dr in dt.Rows)
- {
- var dbname = dr["database_name"].ToString();
- if (Array.IndexOf(sysdbnames, dbname) >= 0) continue;
-
- var connName = String.Format("{0}_{1}", item, dbname);
-
- builder["Database"] = dbname;
- DAL.AddConnStr(connName, builder.ToString(), null, dbprovider);
- n++;
-
- try
- {
- var ver = dal.Db.ServerVersion;
- names.Add(connName);
- }
- catch
- {
- if (DAL.ConnStrs.ContainsKey(connName)) DAL.ConnStrs.Remove(connName);
- }
- }
-
-
- sw.Stop();
- XTrace.WriteLine("发现远程数据库{0}个,耗时:{1}!", n, sw.Elapsed);
-
- if (names != null && names.Count > 0)
- {
- var list = new List<String>();
- foreach (var elm in DAL.ConnStrs)
- {
- if (!String.IsNullOrEmpty(elm.Value)) list.Add(elm.Key);
- }
- list.AddRange(names);
-
- this.Invoke(SetDatabaseList, list);
- }
- }
- catch
- {
- //if (item == localName) DAL.ConnStrs.Remove(localName);
- }
- }
-
- void DetectRemote()
- {
- var list = new List<String>();
- foreach (var item in DAL.ConnStrs)
- {
- if (!String.IsNullOrEmpty(item.Value)) list.Add(item.Key);
- }
-
- foreach (var item in list)
- {
- Task.Factory.StartNew(DetectSqlServer, item);
- Task.Factory.StartNew(DetectMySql, item);
- }
-
- var localName = "local_MSSQL";
- if (DAL.ConnStrs.ContainsKey(localName)) DAL.ConnStrs.Remove(localName);
- //if (list.Contains(localName)) list.Remove(localName);
- }
-
- Boolean ContainConnStr(String connstr)
- {
- foreach (var item in DAL.ConnStrs)
- {
- if (connstr.EqualIgnoreCase(item.Value)) return true;
- }
- return false;
- }
-
void SetDatabaseList(ICollection<String> list)
{
var str = cbConn.Text;
@@ -447,8 +160,8 @@ namespace XCoder
{
var list = DAL.Create(Config.ConnName).Tables;
if (!cbIncludeView.Checked) list = list.Where(t => !t.IsView).ToList();
- //if (Config.NeedFix) list = Engine.FixTable(list);
- Tables = list;
+ //if (Config.NeedFix) list = Engine.FixTable(list);
+ Tables = list;
}
catch (Exception ex)
{
@@ -458,10 +171,10 @@ namespace XCoder
this.Invoke(() =>
{
- //SetTables(null);
- SetTables(Tables); //修复数据建模界面连接数据库不显示数据表问题
+ //SetTables(null);
+ SetTables(Tables); //修复数据建模界面连接数据库不显示数据表问题
//SetTables(Engine.Tables);
- });
+ });
});
}