using System; using System.Collections.Generic; using Mesnac.Basic; using System.Text; using System.Windows.Forms; using ICSharpCode.Data.Core; using ICSharpCode.Data.Core.Common; using ICSharpCode.Data.Core.DatabaseDrivers.SQLServer; using ICSharpCode.Data.Core.Interfaces; using ICSharpCode.Data.Core.DatabaseObjects; using ICSharpCode.Data.Core.Enums; using ICSharpCode.Data.Core.Interfaces; namespace Mesnac.Gui.Edit.Common { public delegate void CallBackDelegate(); //回调方法 /// /// 数据源工厂 /// public class DataSourceFactory { private static DataSourceFactory instance = null; //保存工厂实例 private Dictionary _dataSources = null; //保存数据源 private TreeNode root = null; public event EventHandler DataSourceRefresh; private DataSourceFactory() { this.root = new TreeNode(); root.Text = "数据源列表"; } /// /// 工厂实例 /// public static DataSourceFactory Instance { get { if (instance == null) { instance = new DataSourceFactory(); } return instance; } } /// /// 把内存中的数据源数据保存只文件 /// /// 要保存数据源信息的文件名 public void RefreshDataFromFile(string fileName, params CallBackDelegate[] callBack) { if (System.IO.File.Exists(fileName)) { this._dataSources = XmlHandler.ParseFromDataSourceXml(fileName); //触发事件 if (DataSourceRefresh != null) { DataSourceRefresh(this, EventArgs.Empty); } new System.Threading.Thread(new System.Threading.ThreadStart(delegate() { this.GenerateDataSourceTree(); foreach (CallBackDelegate call in callBack) { call(); } })).Start(); //异步生成数据源树 } else { this._dataSources = new Dictionary(); } } /// /// 把文件中的内容读取至内存 /// /// 保存数据源信息的文件名 public void RefreshDataToFile(string fileName, params CallBackDelegate[] callBack) { if (this._dataSources != null) { XmlHandler.GenerateDataSourceXml(this._dataSources, fileName); new System.Threading.Thread(new System.Threading.ThreadStart(delegate() { this.GenerateDataSourceTree(); foreach (CallBackDelegate call in callBack) { call(); } })).Start(); //异步生成数据源树 } } /// /// 数据源信息 /// public Dictionary DataSources { get { return this._dataSources; } } /// /// 数据源树 /// public TreeNode Root { get { return this.root; } } /// /// 生成数据源树 /// public void GenerateDataSourceTree() { lock (this) { this.root.Nodes.Clear(); this.root = new TreeNode(); this.root.Text = "数据源列表"; if (this._dataSources != null) { TreeNode nodeDataSource = null; int cnt = 0; foreach (DataSourceItem dataSourceItem in this._dataSources.Values) { nodeDataSource = new TreeNode(); nodeDataSource.Text = dataSourceItem.Name; nodeDataSource.ToolTipText = dataSourceItem.Driver; //string driverAssembly = dataSourceItem.DriverAssembly; //string driverClass = dataSourceItem.DriverClass; #region 数据源处理 switch (dataSourceItem.Driver) { case "MS SQL Server": SQLServerDatabaseDriver driver = new SQLServerDatabaseDriver(); SQLServerDatasource ds = new SQLServerDatasource(driver); ds.Name = dataSourceItem.Server; ds.UserId = dataSourceItem.UserName; ds.Password = dataSourceItem.Password; driver.PopulateDatabases(ds); IDatabase database = null; foreach (IDatabase db in ds.Databases) { if (db.ToString() == dataSourceItem.Database) { database = db; break; } } if (database != null) { database.LoadDatabase(); TreeNode nodeTables = new TreeNode(); nodeTables.Text = "数据表"; TreeNode nodeTable = null; foreach (ITable table in database.Tables) { nodeTable = new TreeNode(); nodeTable.Text = table.TableName; TreeNode nodeColumn = null; foreach (IColumn col in table.Items) { nodeColumn = new TreeNode(); nodeColumn.Text = col.Name; nodeTable.Nodes.Add(nodeColumn); } nodeTables.Nodes.Add(nodeTable); } TreeNode nodeViews = new TreeNode(); nodeViews.Text = "数据视图"; TreeNode nodeView = null; foreach (IView view in database.Views) { nodeView = new TreeNode(); nodeView.Text = view.Name; TreeNode nodeColumn = null; foreach (IColumn col in view.Items) { nodeColumn = new TreeNode(); nodeColumn.Text = col.Name; nodeTable.Nodes.Add(nodeColumn); } nodeViews.Nodes.Add(nodeView); } TreeNode nodeProcedures = new TreeNode(); nodeProcedures.Text = "存储过程"; TreeNode nodeProcedure = null; foreach (IProcedure procedure in database.Procedures) { nodeProcedure = new TreeNode(); nodeProcedure.Text = procedure.Name; nodeProcedures.Nodes.Add(nodeProcedure); } nodeDataSource.Nodes.Add(nodeTables); nodeDataSource.Nodes.Add(nodeViews); nodeDataSource.Nodes.Add(nodeProcedures); } break; default: break; } #endregion cnt++; if (cnt > this._dataSources.Values.Count) break; this.root.Nodes.Add(nodeDataSource); } } } } /// /// 添加数据源 /// /// /// public void Add(string name, DataSourceItem item) { if (this._dataSources == null) { this._dataSources = new Dictionary(); } if (!this.IsExists(name)) { this._dataSources.Add(name, item); //触发事件 if (DataSourceRefresh != null) { DataSourceRefresh(this, EventArgs.Empty); } } } /// /// 移除数据源 /// /// public void Remove(string name) { if (this.IsExists(name)) { this._dataSources.Remove(name); //触发事件 if (DataSourceRefresh != null) { DataSourceRefresh(this, EventArgs.Empty); } } } /// /// 修改数据源 /// /// /// public void Modify(string name, DataSourceItem newItem) { if (this._dataSources == null) { this._dataSources = new Dictionary(); } if (this.IsExists(name)) { this._dataSources[name] = newItem; //触发事件 if (DataSourceRefresh != null) { DataSourceRefresh(this, EventArgs.Empty); } } } /// /// 获取下一个可用的数据源名称 /// /// public string GetNextDataSourceName() { int i = 1; if (this._dataSources == null) { return "DataSource1"; } else { while (this._dataSources.ContainsKey("DataSource" + i)) { i++; } } return "DataSource" + i; } /// /// 判断指定名称的数据源是否存在 /// /// 要判断的数据源名称 /// 存在返回true,否则返回false public bool IsExists(string dataSourceName) { if (this._dataSources == null) { return false; } else { if (this._dataSources.ContainsKey(dataSourceName)) { return true; } else { return false; } } } } }