using LeaRun.Application.Entity.SystemManage;
using LeaRun.Application.IService.SystemManage;
using LeaRun.Data;
using LeaRun.Data.Repository;
using LeaRun.Util.WebControl;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;
namespace LeaRun.Application.Service.SystemManage
{
///
/// 版 本 6.1
/// Copyright (c) 2013-2016 上海力软信息技术有限公司
/// 创建人:佘赐雄
/// 日 期:2015.11.18 11:02
/// 描 述:数据库管理(支持:SqlServer)
///
public class DataBaseTableService : RepositoryFactory, IDataBaseTableService
{
private IDataBaseLinkService dataBaseLinkService = new DataBaseLinkService();
#region 获取数据
///
/// 数据表列表
///
/// 库连接Id
/// 表明
///
public DataTable GetTableList(string dataBaseLinkId, string tableName)
{
DataBaseLinkEntity dataBaseLinkEntity = dataBaseLinkService.GetEntity(dataBaseLinkId);
if (dataBaseLinkEntity != null)
{
StringBuilder strSql = new StringBuilder();
strSql.Append(@"DECLARE @TableInfo TABLE ( name VARCHAR(50) , sumrows VARCHAR(11) , reserved VARCHAR(50) , data VARCHAR(50) , index_size VARCHAR(50) , unused VARCHAR(50) , pk VARCHAR(50) )
DECLARE @TableName TABLE ( name VARCHAR(50) )
DECLARE @name VARCHAR(50)
DECLARE @pk VARCHAR(50)
INSERT INTO @TableName ( name ) SELECT o.name FROM sysobjects o , sysindexes i WHERE o.id = i.id AND o.Xtype = 'U' AND i.indid < 2 ORDER BY i.rows DESC , o.name
WHILE EXISTS ( SELECT 1 FROM @TableName ) BEGIN SELECT TOP 1 @name = name FROM @TableName DELETE @TableName WHERE name = @name DECLARE @objectid INT SET @objectid = OBJECT_ID(@name) SELECT @pk = COL_NAME(@objectid, colid) FROM sysobjects AS o INNER JOIN sysindexes AS i ON i.name = o.name INNER JOIN sysindexkeys AS k ON k.indid = i.indid WHERE o.xtype = 'PK' AND parent_obj = @objectid AND k.id = @objectid INSERT INTO @TableInfo ( name , sumrows , reserved , data , index_size , unused ) EXEC sys.sp_spaceused @name UPDATE @TableInfo SET pk = @pk WHERE name = @name END
SELECT F.name , F.reserved , F.data , F.index_size , RTRIM(F.sumrows) AS sumrows , F.unused , ISNULL(p.tdescription, f.name) AS tdescription , F.pk
FROM @TableInfo F LEFT JOIN ( SELECT name = CASE WHEN A.COLORDER = 1 THEN D.NAME ELSE '' END , tdescription = CASE WHEN A.COLORDER = 1 THEN ISNULL(F.VALUE, '') ELSE '' END FROM SYSCOLUMNS A LEFT JOIN SYSTYPES B ON A.XUSERTYPE = B.XUSERTYPE INNER JOIN SYSOBJECTS D ON A.ID = D.ID AND D.XTYPE = 'U' AND D.NAME <> 'DTPROPERTIES' LEFT JOIN sys.extended_properties F ON D.ID = F.major_id WHERE a.COLORDER = 1 AND F.minor_id = 0 ) P ON F.name = p.name
WHERE 1 = 1 ");
if (!string.IsNullOrEmpty(tableName))
{
strSql.Append(" AND f.name='" + tableName + "'");
}
strSql.Append(" ORDER BY f.name");
return this.BaseRepository(dataBaseLinkEntity.DbConnection).FindTable(strSql.ToString());
}
return null;
}
///
/// 数据表字段列表
///
/// 库连接Id
/// 表明
///
public IEnumerable GetTableFiledList(string dataBaseLinkId, string tableName)
{
DataBaseLinkEntity dataBaseLinkEntity = dataBaseLinkService.GetEntity(dataBaseLinkId);
if (dataBaseLinkEntity != null)
{
StringBuilder strSql = new StringBuilder();
strSql.Append(@"SELECT [number] = a.colorder , [column] = a.name , [datatype] = b.name , [length] = COLUMNPROPERTY(a.id, a.name, 'PRECISION') , [identity] = CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '1' ELSE '' END , [key] = CASE WHEN EXISTS ( SELECT 1 FROM sysobjects WHERE xtype = 'PK' AND parent_obj = a.id AND name IN ( SELECT name FROM sysindexes WHERE indid IN ( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid = a.colid ) ) ) THEN '1' ELSE '' END , [isnullable] = CASE WHEN a.isnullable = 1 THEN '1' ELSE '' END , [defaults] = ISNULL(e.text, '') , [remark] = ISNULL(g.[value], a.name)
FROM syscolumns a LEFT JOIN systypes b ON a.xusertype = b.xusertype INNER JOIN sysobjects d ON a.id = d.id AND d.xtype = 'U' AND d.name <> 'dtproperties' LEFT JOIN syscomments e ON a.cdefault = e.id LEFT JOIN sys.extended_properties g ON a.id = g.major_id AND a.colid = g.minor_id LEFT JOIN sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0
WHERE d.name = @tableName
ORDER BY a.id , a.colorder");
DbParameter[] parameter =
{
DbParameters.CreateDbParameter("@tableName",tableName)
};
return this.BaseRepository(dataBaseLinkEntity.DbConnection).FindList(strSql.ToString(), parameter);
}
return null;
}
///
/// 数据库表数据列表
///
/// 库连接
/// 表明
/// 条件
/// 逻辑
/// 关键字
/// 分页参数
///
public DataTable GetTableDataList(string dataBaseLinkId, string tableName, string switchWhere, string logic, string keyword, Pagination pagination)
{
DataBaseLinkEntity dataBaseLinkEntity = dataBaseLinkService.GetEntity(dataBaseLinkId);
if (dataBaseLinkEntity != null)
{
StringBuilder strSql = new StringBuilder();
List parameter = new List();
strSql.Append("SELECT * FROM " + tableName + " WHERE 1=1");
if (!string.IsNullOrEmpty(keyword))
{
strSql.Append(" AND " + switchWhere + "");
switch (logic)
{
case "Equal": //等于
strSql.Append(" = ");
parameter.Add(DbParameters.CreateDbParameter("@" + switchWhere, keyword));
break;
case "NotEqual": //不等于
strSql.Append(" <> ");
parameter.Add(DbParameters.CreateDbParameter("@" + switchWhere, keyword));
break;
case "Greater": //大于
strSql.Append(" > ");
parameter.Add(DbParameters.CreateDbParameter("@" + switchWhere, keyword));
break;
case "GreaterThan": //大于等于
strSql.Append(" >= ");
parameter.Add(DbParameters.CreateDbParameter("@" + switchWhere, keyword));
break;
case "Less": //小于
strSql.Append(" < ");
parameter.Add(DbParameters.CreateDbParameter("@" + switchWhere, keyword));
break;
case "LessThan": //小于等于
strSql.Append(" >= ");
parameter.Add(DbParameters.CreateDbParameter("@" + switchWhere, keyword));
break;
case "Null": //为空
strSql.Append(" is null ");
parameter.Add(DbParameters.CreateDbParameter("@" + switchWhere, keyword));
break;
case "NotNull": //不为空
strSql.Append(" is not null ");
parameter.Add(DbParameters.CreateDbParameter("@" + switchWhere, keyword));
break;
case "Like": //包含
strSql.Append(" like ");
parameter.Add(DbParameters.CreateDbParameter("@" + switchWhere, '%' + keyword + '%'));
break;
default:
break;
}
strSql.Append("@" + switchWhere + "");
}
return this.BaseRepository(dataBaseLinkEntity.DbConnection).FindTable(strSql.ToString(), parameter.ToArray(), pagination);
}
return null;
}
#endregion
#region 提交数据
///
/// 保存数据库表表单(新增、修改)
///
/// 库连接Id
/// 表名称
/// 表说明
/// 字段列表
public void SaveForm(string dataBaseLinkId, string tableName, string tableDescription, IEnumerable fieldList)
{
//StringBuilder strSql = new StringBuilder();
//strSql.Append("if exists (select 1");
//strSql.Append(" from sysobjects");
//strSql.Append(" where id = object_id('" + tableName + "')");
//strSql.Append(" and type = 'U')");
//strSql.Append(" drop table " + tableName + "");
//strSql.Append("go");
//strSql.Append("/*==============================================================*/");
//strSql.Append("/* Table: " + tableName + " */");
//strSql.Append("/*==============================================================*/");
//strSql.Append("create table " + tableName + " (");
//strSql.Append(" LogId varchar(50) not null,");
//strSql.Append(" SourceObjectId varchar(50) null,");
//strSql.Append(" SourceContentJson text null,");
//strSql.Append(" IPAddress varchar(50) null,");
//strSql.Append(" IPAddressName varchar(200) null,");
//strSql.Append(" Category int null,");
//strSql.Append(" constraint PK_BASE_LOG primary key nonclustered (LogId)");
//strSql.Append(")");
//strSql.Append("go");
DataBaseLinkEntity dataBaseLinkEntity = dataBaseLinkService.GetEntity(dataBaseLinkId);
StringBuilder strSql = new StringBuilder();
strSql.Append("if exists (select 1");
strSql.Append(" from sysobjects");
strSql.Append(" where id = object_id('" + tableName + "')");
strSql.Append(" and type = 'U')");
strSql.Append(" drop table " + tableName + " ");
strSql.Append("\r\n");
strSql.Append("create table " + tableName + " (");
foreach (var field in fieldList)
{
var column = field.column;
var datatype = field.datatype;
if (datatype == "varchar") datatype = datatype + "(" + field.length + ")";
var isnuallable = field.isnullable == "0" || field.isnullable == "" ? "not null" : "null";
var primary = field.key == "0" || field.key == "" ? "" : "primary key";
var identity = field.identity =="0"||field.identity =="" ? "" : "IDENTITY(1,1)";
var defaultvalue = field.defaults;
strSql.Append(" " + column + " " + datatype + " " + isnuallable + " " + primary + " " + identity + " ");
defaultvalue = defaultvalue.Replace("(", "").Replace(")", "").Replace("'", "");
;
if (!string.IsNullOrEmpty(defaultvalue))
{
strSql.Append(" default('" + defaultvalue + "')" + " ");
}
strSql.Append(",\r\n");
}
strSql.Append(") \r\n");
strSql.Append(" EXECUTE sp_addextendedproperty 'MS_Description', \r\n\t'" + tableDescription
+ "',\r\n\t'user', 'dbo', 'table', '"
+ tableName + "'\r\n");
foreach (var field in fieldList)
{
var coloumn = field.column;
var description = field.remark;
strSql.Append(" EXECUTE sp_addextendedproperty 'MS_Description', " +
"\r\n\t'" + description + "',\r\n\t'user', 'dbo', 'table', '"
+ tableName + "', 'column', '" + coloumn + "'\r\n");
}
this.BaseRepository(dataBaseLinkEntity.DbConnection).ExecuteBySql(strSql.ToString());
}
#endregion
}
}