📄 metadatadbprovider.cs
字号:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Drawing;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using Epi.Collections;
using Epi;
using Epi.Data;
using Epi.DataSets;
using Epi.Fields;
using Epi.Resources;
namespace Epi.Data.Services
{
/// <summary>
/// Database implementation of Metadata provider
/// </summary>
public class MetadataDbProvider : IMetadataProvider
{
#region MetadataProvider Database Members
/// <summary>
/// Creates a database
/// </summary>
/// <param name="dbInfo"></param>
protected void CreateDatabase(DbDriverInfo dbInfo)
{
dbFactory.CreatePhysicalDatabase(dbInfo);
//db.CreateDatabase(databaseName);
}
//[Obsolete("Use of DataTable in this context is no different than the use of a multidimensional System.Object array (not recommended).", false)]
//public DataTable GetCodeTableColumnSchema(string tableName)
//{
// Util.Assert(tableName.StartsWith("meta") == false);
// return db.GetTableColumnSchema(tableName);
//}
public DataTable GetCodeTableData(string tableName)
{
Util.Assert(tableName.StartsWith("meta") == false);
return db.GetTableData(tableName);
}
public DataTable GetCodeTableData(string tableName, string columnNames)
{
Util.Assert(tableName.StartsWith("meta") == false);
return this.db.GetTableData(tableName, columnNames);
}
public DataTable GetCodeTableData(string tableName, string columnNames, string sortCriteria)
{
return this.db.GetTableData(tableName, columnNames, sortCriteria);
}
#endregion
#region Fields
private Project project;
/// <summary>
/// The unerlying physical databsae
/// </summary>
//protected IDbDriver db;
public IDbDriver db;
private IDbDriverFactory dbFactory;
#endregion Fields
#region Events
public event ProgressReportBeginEventHandler ProgressReportBeginEvent;
private void RaiseProgressReportBeginEvent(int min, int max, int step)
{
if (this.ProgressReportBeginEvent != null)
{
this.ProgressReportBeginEvent(min, max, step);
}
}
public event ProgressReportUpdateEventHandler ProgressReportUpdateEvent;
private void RaiseProgressReportUpdateEvent()
{
if (this.ProgressReportUpdateEvent != null)
{
this.ProgressReportUpdateEvent();
}
}
public event SimpleEventHandler ProgressReportEndEvent;
private void RaiseProgressReportEndEvent()
{
if (this.ProgressReportEndEvent != null)
{
this.ProgressReportEndEvent();
}
}
#endregion Events
#region Constructors
/// <summary>
/// Constructor for the class.
/// </summary>
/// <param name="proj">Project the metadata belongs to</param>
//public MetadataDbProvider(Project proj, bool createDatabase)
public MetadataDbProvider(Project proj)
{
#region Input validation
if (proj == null)
throw new System.ArgumentNullException("proj");
#endregion Input validation
project = proj;
////KKM4 TODO: Check if the metadata source is Database. Assume it is for now.
//string connectionString = proj.MetadataConnectionString;
//if (!string.IsNullOrEmpty(connectionString))
//{
// if (Util.IsFilePath(connectionString) && !Path.IsPathRooted(connectionString))
// {
// connectionString = Path.Combine(proj.Location, connectionString);
// }
// db = DatabaseFactory.CreateDatabaseInstance(proj.MetadataDriver, connectionString);
//}
//if (createDatabase)
//{
// this.CreateDatabase(new ConnectionStringInfo(connectionString).DbName);
// CreateMetadataTables();
//}
//else
//{
// // if you've come this far, the connection string should be valid
// db.TestConnection();
//}
}
public void Initialize(DbDriverInfo MetaDbInfo, string driver, bool createDatabase)
{
dbFactory = DbDriverFactoryCreator.GetDbDriverFactory(driver);
if (createDatabase)
{
this.CreateDatabase(MetaDbInfo); //\\ + Path.DirectorySeparatorChar + DbDriverInfo.PreferredDatabaseName);
db = dbFactory.CreateDatabaseObject(MetaDbInfo.DBCnnStringBuilder);
CreateMetadataTables();
}
else
{
db = dbFactory.CreateDatabaseObject(MetaDbInfo.DBCnnStringBuilder);
}
db.TestConnection();
}
///// <summary>
///// Creates database from the connectionstring.
///// </summary>
///// <param name="connectionString"></param>
///// <param name="driver"></param>
///// <param name="createDatabase"></param>
//public void Initialize(string connectionString, string driver, bool createDatabase)
//{
// dbFactory = DatabaseFactoryCreator.GetDbDriverFactory(driver);
// DbConnectionStringBuilder cnnStringBuilder = new DbConnectionStringBuilder();
// cnnStringBuilder.ConnectionString = connectionString;
// if (createDatabase)
// {
// this.CreateDatabase(new ConnectionStringInfo(connectionString).DbName);
// CreateMetadataTables();
// }
// else
// {
// db = dbFactory.CreateDatabaseObject(cnnStringBuilder);
// }
// //db = DatabaseFactoryCreator.CreateDatabaseInstance(driver, connectionString);
// //if (createDatabase)
// //{
// // this.CreateDatabase(new ConnectionStringInfo(connectionString).DbName);
// // CreateMetadataTables();
// //}
// db.TestConnection();
//}
#endregion Constructors
#region Public Properties
/// <summary>
/// The project
/// </summary>
public Project Project
{
get
{
return project;
}
}
/// <summary>
/// MetaData DBFactory
/// </summary>
public IDbDriverFactory DBFactory
{
get { return dbFactory; }
}
#endregion Public Properties
#region Public Methods
/// <summary>
/// Gets list of code tables in the metadata database
/// </summary>
/// <returns>DataRow of table names</returns>
public DataSets.TableSchema.TablesDataTable GetCodeTableList()
{
try
{
DataSets.TableSchema.TablesDataTable tables = db.GetTableSchema();
DataRow[] rowsFiltered = tables.Select("TABLE_NAME NOT LIKE 'code%'");
foreach (DataRow rowFiltered in rowsFiltered)
{
tables.Rows.Remove(rowFiltered);
}
return tables;
}
catch (Exception ex)
{
throw new System.ApplicationException("Could not retrieve code tables from database", ex);
}
}
/// <summary>
/// Attaches a db driver object to this provider.
/// </summary>
/// <param name="dbDriver"></param>
public void AttachDbDriver(IDbDriver dbDriver)
{
this.db = dbDriver;
}
#region Select Statements
/// <summary>
/// Gets all views belonging to a project
/// </summary>
/// <returns>Datatable containing view info</returns>
public virtual DataTable GetViewsAsDataTable()
{
try
{
Query query = db.CreateQuery(
@"SELECT [ViewId], [Name], [CheckCodeBefore], [CheckCodeAfter], [RecordCheckCodeBefore],
[RecordCheckCodeAfter], [CheckCodeVariableDefinitions], [IsRelatedView]
FROM metaViews"
);
//query.Parameters.Add(new DbParameter("@ProjectId", DbType.Guid, Project.Id));
return db.Select(query);
}
catch (Exception ex)
{
throw new GeneralException("Could not retrieve view data table", ex);
}
}
/// <summary>
/// Gets all views belonging to a project
/// </summary>
/// <returns>A collection of views</returns>
public ViewCollection GetViews()
{
try
{
Collections.ViewCollection views = new Collections.ViewCollection();
DataTable table = GetViewsAsDataTable();
foreach (DataRow row in table.Rows)
{
views.Add(new View(row, project));
}
return views;
}
catch (Exception ex)
{
throw new GeneralException("Could not retrieve view collection", ex);
}
}
/*
/// <summary>
/// Gets all pages belonging to the project
/// </summary>
/// <returns>Datatable containing page info</returns>
public DataTable GetPagesForProject()
{
try
{
DbQuery query = db.CreateQuery("SELECT P.[PageId], V.[ViewId], P.[Name] AS PageName, V.[Name] AS ViewName, P.[Position] " +
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -