NewLife/XCoder

抽取自动探测数据库代码,多个功能共用
智能大石头 authored at 2021-12-23 20:31:17
a48e6d3
Tree
1 Parent(s) 6372721
Summary: 5 changed files with 348 additions and 324 deletions.
Modified +3 -12
Added +276 -0
Modified +46 -2
Modified +9 -9
Modified +14 -301
Modified +3 -12
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>
Added +276 -0
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
Modified +46 -2
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)
Modified +9 -9
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);
Modified +14 -301
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);
-            });
+                });
             });
         }