提交当前本机最新程序
This commit is contained in:
@@ -0,0 +1,886 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using Lskj.Business;
|
||||
using Lskj.Business.Impl;
|
||||
using Lskj.Control;
|
||||
using Lskj.Core;
|
||||
using Lskj.Util;
|
||||
|
||||
namespace Lskj.PubCodeDesign
|
||||
{
|
||||
internal static class CodeSchemeStorage
|
||||
{
|
||||
private const string SchemeTableName = "P_CodeSchemeTab";
|
||||
private const string SchemeControlTableName = "P_CodeSchemeControlTab";
|
||||
private const string CodeRecordTableName = "P_CodeSchemeRecordTab";
|
||||
private const string CodeGenerateProcedureName = "P_create_CodeSchemeDocumentPr";
|
||||
private const string NumberRuleTableName = "p_systemNumberRuleTab";
|
||||
private const string DesignRuleUseColumn = "UseEd";
|
||||
private const string DesignRuleSortColumn = "SortNo";
|
||||
private const string DesignRuleFieldNameColumn = "FieldName";
|
||||
private const string NumberRuleSchemeIdColumn = "SchemeId";
|
||||
private const string NumberRuleSchemeCodeColumn = "SchemeCode";
|
||||
private const string NumberRuleSchemeNameColumn = "SchemeName";
|
||||
private const string NumberRuleMenuKeyColumn = "MenuKey";
|
||||
private const string NumberRuleBindModuleColumn = "BindModule";
|
||||
private const string NumberRuleBindModuleCodeColumn = "BindModuleCode";
|
||||
private const string NumberRuleModIdColumn = "modid";
|
||||
|
||||
internal static void EnsureCodeSchemeStorage()
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureTable(SchemeTableName, GetCreateSchemeTableSql(), GetSchemeTableColumns());
|
||||
EnsureTable(SchemeControlTableName, GetCreateSchemeControlTableSql(), GetSchemeControlTableColumns());
|
||||
EnsureCodeRecordStorage();
|
||||
DropIndexIfExists(SchemeControlTableName, "UX_CodeSchemeControl_Field");
|
||||
DropIndexIfExists(SchemeControlTableName, "IX_CodeSchemeControl_Source");
|
||||
DropIndexIfExists(SchemeTableName, "IX_CodeScheme_Menu");
|
||||
DeleteDisabledCodeSchemes();
|
||||
DropColumnIfExists(SchemeTableName, DesignRuleUseColumn);
|
||||
RemoveLegacySchemeControlColumns();
|
||||
EnsureIndex("UX_CodeScheme_Code", "CREATE UNIQUE INDEX UX_CodeScheme_Code ON P_CodeSchemeTab(SchemeCode)");
|
||||
EnsureIndex("IX_CodeScheme_Menu", "CREATE INDEX IX_CodeScheme_Menu ON P_CodeSchemeTab(MenuKey)");
|
||||
EnsureRuleStorage();
|
||||
EnsureCodeGenerateProcedure();
|
||||
EnsureIndexIfColumnsExist(SchemeControlTableName, new string[] { NumberRuleSchemeIdColumn, DesignRuleSortColumn }, "IX_CodeSchemeControl_Scheme", "CREATE INDEX IX_CodeSchemeControl_Scheme ON P_CodeSchemeControlTab(SchemeId, SortNo)");
|
||||
EnsureIndexIfColumnsExist(SchemeControlTableName, new string[] { NumberRuleSchemeIdColumn, DesignRuleFieldNameColumn }, "IX_CodeSchemeControl_Field", "CREATE INDEX IX_CodeSchemeControl_Field ON P_CodeSchemeControlTab(SchemeId, FieldName)");
|
||||
EnsureConstraint("FK_CodeSchemeControl_Scheme", "ALTER TABLE P_CodeSchemeControlTab ADD CONSTRAINT FK_CodeSchemeControl_Scheme FOREIGN KEY (SchemeId) REFERENCES P_CodeSchemeTab(SchemeId)");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.Instance.WriteError(ex);
|
||||
MessageUtil.Show("编码方案表结构初始化失败:" + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private static void EnsureTable(string tableName, string createSql, List<TableColumnSpec> columns)
|
||||
{
|
||||
if (!TableExists(tableName))
|
||||
{
|
||||
SqlHelper.ExecuteNonQuery(createSql);
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (TableColumnSpec column in columns)
|
||||
{
|
||||
if (!ColumnExists(tableName, column.Name))
|
||||
{
|
||||
SqlHelper.ExecuteNonQuery(string.Format("ALTER TABLE {0} ADD {1} {2}", tableName, column.Name, column.Definition));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void RemoveLegacySchemeControlColumns()
|
||||
{
|
||||
string[] legacyColumns =
|
||||
{
|
||||
"ControlType",
|
||||
"FieldTypeId",
|
||||
"ModuleCode",
|
||||
"SourceType",
|
||||
"SourceIndex",
|
||||
"LabelText",
|
||||
"UserName",
|
||||
"ControlConfig",
|
||||
"SchemeControlId",
|
||||
"ControlWidth",
|
||||
"ControlHeight",
|
||||
DesignRuleUseColumn
|
||||
};
|
||||
|
||||
foreach (string columnName in legacyColumns)
|
||||
{
|
||||
DropColumnIfExists(SchemeControlTableName, columnName);
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteDisabledCodeSchemes()
|
||||
{
|
||||
if (!TableExists(SchemeTableName) || !ColumnExists(SchemeTableName, DesignRuleUseColumn)) return;
|
||||
|
||||
string sql = "SELECT SchemeId, BindModule, BindModuleCode FROM P_CodeSchemeTab WHERE ISNULL(UseEd, 1) = 0";
|
||||
DataTable table = SqlHelper.ExecuteDataTable(sql);
|
||||
if (table == null || table.Rows.Count == 0) return;
|
||||
|
||||
foreach (DataRow row in table.Rows)
|
||||
{
|
||||
int schemeId = ToInt(row["SchemeId"]);
|
||||
string bindModuleCode = ToBool(row["BindModule"]) ? row["BindModuleCode"] + "" : string.Empty;
|
||||
|
||||
DeleteRuleRows(SchemeControlTableName, schemeId);
|
||||
if (!string.IsNullOrWhiteSpace(bindModuleCode) && !BindModuleOwnedByEnabledScheme(bindModuleCode))
|
||||
{
|
||||
DeleteBindModuleNumberRuleRows(bindModuleCode);
|
||||
}
|
||||
|
||||
string deleteSql = "DELETE FROM P_CodeSchemeTab WHERE SchemeId = @SchemeId";
|
||||
SqlHelper.ExecuteNonQuery(CommandType.Text, deleteSql, new SqlParameter[] { new SqlParameter("@SchemeId", schemeId) });
|
||||
}
|
||||
}
|
||||
|
||||
private static bool BindModuleOwnedByEnabledScheme(string bindModuleCode)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(bindModuleCode) || !TableExists(SchemeTableName) || !ColumnExists(SchemeTableName, DesignRuleUseColumn)) return false;
|
||||
|
||||
string sql = @"
|
||||
SELECT COUNT(1)
|
||||
FROM P_CodeSchemeTab
|
||||
WHERE ISNULL(UseEd, 1) = 1
|
||||
AND ISNULL(BindModule, 0) = 1
|
||||
AND ISNULL(BindModuleCode, '') = @BindModuleCode";
|
||||
object result = SqlHelper.ExecuteScalar(CommandType.Text, sql, new SqlParameter[] { new SqlParameter("@BindModuleCode", bindModuleCode) });
|
||||
return ToInt(result) > 0;
|
||||
}
|
||||
|
||||
private static void DeleteRuleRows(string tableName, int schemeId)
|
||||
{
|
||||
if (schemeId <= 0 || string.IsNullOrWhiteSpace(tableName) || !TableExists(tableName) || !ColumnExists(tableName, NumberRuleSchemeIdColumn)) return;
|
||||
|
||||
string sql = string.Format("DELETE FROM {0} WHERE {1} = @SchemeId", QuoteSqlIdentifier(tableName), QuoteSqlIdentifier(NumberRuleSchemeIdColumn));
|
||||
SqlHelper.ExecuteNonQuery(CommandType.Text, sql, new SqlParameter[] { new SqlParameter("@SchemeId", schemeId) });
|
||||
}
|
||||
|
||||
private static void DeleteBindModuleNumberRuleRows(string bindModuleCode)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(bindModuleCode) || !TableExists(NumberRuleTableName)) return;
|
||||
|
||||
List<string> moduleConditions = new List<string>();
|
||||
if (ColumnExists(NumberRuleTableName, NumberRuleModIdColumn))
|
||||
{
|
||||
moduleConditions.Add(string.Format("ISNULL(CONVERT(NVARCHAR(100), {0}), '') = @BindModuleCode", QuoteSqlIdentifier(NumberRuleModIdColumn)));
|
||||
}
|
||||
if (ColumnExists(NumberRuleTableName, NumberRuleBindModuleCodeColumn))
|
||||
{
|
||||
moduleConditions.Add(string.Format("ISNULL(CONVERT(NVARCHAR(100), {0}), '') = @BindModuleCode", QuoteSqlIdentifier(NumberRuleBindModuleCodeColumn)));
|
||||
}
|
||||
if (moduleConditions.Count == 0) return;
|
||||
|
||||
string sql = string.Format("DELETE FROM {0} WHERE ({1})", QuoteSqlIdentifier(NumberRuleTableName), string.Join(" OR ", moduleConditions.ToArray()));
|
||||
SqlHelper.ExecuteNonQuery(CommandType.Text, sql, new SqlParameter[] { new SqlParameter("@BindModuleCode", bindModuleCode) });
|
||||
}
|
||||
|
||||
internal static bool TableExists(string tableName)
|
||||
{
|
||||
string sql = "SELECT COUNT(1) FROM sysobjects WHERE id = OBJECT_ID(@TableName) AND xtype = 'U'";
|
||||
object result = SqlHelper.ExecuteScalar(CommandType.Text, sql, new SqlParameter[] { new SqlParameter("@TableName", tableName) });
|
||||
return Convert.ToInt32(result) > 0;
|
||||
}
|
||||
|
||||
internal static bool ColumnExists(string tableName, string columnName)
|
||||
{
|
||||
string sql = "SELECT COUNT(1) FROM sys.columns WHERE object_id = OBJECT_ID(@TableName) AND name = @ColumnName";
|
||||
object result = SqlHelper.ExecuteScalar(CommandType.Text, sql, new SqlParameter[]
|
||||
{
|
||||
new SqlParameter("@TableName", tableName),
|
||||
new SqlParameter("@ColumnName", columnName)
|
||||
});
|
||||
return Convert.ToInt32(result) > 0;
|
||||
}
|
||||
|
||||
private static void EnsureIndex(string indexName, string createSql)
|
||||
{
|
||||
try
|
||||
{
|
||||
string sql = "SELECT COUNT(1) FROM sys.indexes WHERE name = @IndexName";
|
||||
object result = SqlHelper.ExecuteScalar(CommandType.Text, sql, new SqlParameter[] { new SqlParameter("@IndexName", indexName) });
|
||||
if (Convert.ToInt32(result) == 0)
|
||||
{
|
||||
SqlHelper.ExecuteNonQuery(createSql);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.Instance.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void EnsureIndexIfColumnsExist(string tableName, string[] columnNames, string indexName, string createSql)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(tableName) || columnNames == null) return;
|
||||
foreach (string columnName in columnNames)
|
||||
{
|
||||
if (!ColumnExists(tableName, columnName)) return;
|
||||
}
|
||||
|
||||
EnsureIndex(indexName, createSql);
|
||||
}
|
||||
|
||||
private static void EnsureConstraint(string constraintName, string createSql)
|
||||
{
|
||||
try
|
||||
{
|
||||
string sql = "SELECT COUNT(1) FROM sys.objects WHERE name = @ConstraintName";
|
||||
object result = SqlHelper.ExecuteScalar(CommandType.Text, sql, new SqlParameter[] { new SqlParameter("@ConstraintName", constraintName) });
|
||||
if (Convert.ToInt32(result) == 0)
|
||||
{
|
||||
SqlHelper.ExecuteNonQuery(createSql);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.Instance.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void DropIndexIfExists(string tableName, string indexName)
|
||||
{
|
||||
try
|
||||
{
|
||||
string sql = "SELECT COUNT(1) FROM sys.indexes WHERE object_id = OBJECT_ID(@TableName) AND name = @IndexName";
|
||||
object result = SqlHelper.ExecuteScalar(CommandType.Text, sql, new SqlParameter[]
|
||||
{
|
||||
new SqlParameter("@TableName", tableName),
|
||||
new SqlParameter("@IndexName", indexName)
|
||||
});
|
||||
if (Convert.ToInt32(result) == 0) return;
|
||||
|
||||
SqlHelper.ExecuteNonQuery(string.Format("DROP INDEX {0} ON {1}", QuoteSqlIdentifier(indexName), QuoteSqlIdentifier(tableName)));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.Instance.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void DropColumnIfExists(string tableName, string columnName)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!ColumnExists(tableName, columnName)) return;
|
||||
|
||||
DropColumnIndexes(tableName, columnName);
|
||||
DropColumnDefaultConstraints(tableName, columnName);
|
||||
SqlHelper.ExecuteNonQuery(string.Format("ALTER TABLE {0} DROP COLUMN {1}", QuoteSqlIdentifier(tableName), QuoteSqlIdentifier(columnName)));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.Instance.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void DropColumnIndexes(string tableName, string columnName)
|
||||
{
|
||||
string sql = @"
|
||||
DECLARE @sql NVARCHAR(MAX) = N'';
|
||||
SELECT @sql = @sql +
|
||||
CASE
|
||||
WHEN i.is_primary_key = 1 OR i.is_unique_constraint = 1 THEN
|
||||
N'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + N'.' + QUOTENAME(OBJECT_NAME(i.object_id)) + N' DROP CONSTRAINT ' + QUOTENAME(i.name) + N';'
|
||||
ELSE
|
||||
N'DROP INDEX ' + QUOTENAME(i.name) + N' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + N'.' + QUOTENAME(OBJECT_NAME(i.object_id)) + N';'
|
||||
END
|
||||
FROM sys.indexes i
|
||||
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
||||
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
||||
WHERE i.object_id = OBJECT_ID(@TableName)
|
||||
AND c.name = @ColumnName
|
||||
AND i.name IS NOT NULL;
|
||||
IF LEN(@sql) > 0
|
||||
BEGIN
|
||||
EXEC sp_executesql @sql;
|
||||
END";
|
||||
SqlHelper.ExecuteNonQuery(CommandType.Text, sql, new SqlParameter[]
|
||||
{
|
||||
new SqlParameter("@TableName", tableName),
|
||||
new SqlParameter("@ColumnName", columnName)
|
||||
});
|
||||
}
|
||||
|
||||
private static void DropColumnDefaultConstraints(string tableName, string columnName)
|
||||
{
|
||||
string sql = @"
|
||||
DECLARE @sql NVARCHAR(MAX) = N'';
|
||||
SELECT @sql = @sql + N'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + N'.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + N' DROP CONSTRAINT ' + QUOTENAME(name) + N';'
|
||||
FROM sys.default_constraints
|
||||
WHERE parent_object_id = OBJECT_ID(@TableName)
|
||||
AND parent_column_id = COLUMNPROPERTY(OBJECT_ID(@TableName), @ColumnName, 'ColumnId');
|
||||
IF LEN(@sql) > 0
|
||||
BEGIN
|
||||
EXEC sp_executesql @sql;
|
||||
END";
|
||||
SqlHelper.ExecuteNonQuery(CommandType.Text, sql, new SqlParameter[]
|
||||
{
|
||||
new SqlParameter("@TableName", tableName),
|
||||
new SqlParameter("@ColumnName", columnName)
|
||||
});
|
||||
}
|
||||
|
||||
internal static string QuoteSqlIdentifier(string name)
|
||||
{
|
||||
return "[" + (name ?? string.Empty).Replace("]", "]]") + "]";
|
||||
}
|
||||
|
||||
private static string GetCreateSchemeTableSql()
|
||||
{
|
||||
return @"CREATE TABLE P_CodeSchemeTab (
|
||||
SchemeId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
|
||||
SchemeCode VARCHAR(50) NOT NULL,
|
||||
SchemeName NVARCHAR(100) NOT NULL,
|
||||
MenuKey VARCHAR(200) NOT NULL,
|
||||
SubSysId VARCHAR(50) NULL,
|
||||
MenuId VARCHAR(50) NULL,
|
||||
MenuStruct VARCHAR(50) NULL,
|
||||
MenuCaption NVARCHAR(100) NULL,
|
||||
ModuleCode VARCHAR(100) NOT NULL,
|
||||
BindModule BIT NOT NULL DEFAULT(0),
|
||||
BindSubSysId VARCHAR(50) NULL,
|
||||
BindMenuStruct1 VARCHAR(50) NULL,
|
||||
BindMenuStruct2 VARCHAR(50) NULL,
|
||||
BindMenuId VARCHAR(50) NULL,
|
||||
BindModuleCode VARCHAR(100) NULL,
|
||||
IsDefault BIT NOT NULL DEFAULT(0),
|
||||
Remark NVARCHAR(500) NULL,
|
||||
CreateUserId VARCHAR(50) NULL,
|
||||
CreateUserName NVARCHAR(50) NULL,
|
||||
CreateTime DATETIME NOT NULL DEFAULT(GETDATE()),
|
||||
ModifyUserId VARCHAR(50) NULL,
|
||||
ModifyUserName NVARCHAR(50) NULL,
|
||||
ModifyTime DATETIME NULL
|
||||
)";
|
||||
}
|
||||
|
||||
private static string GetCreateSchemeControlTableSql()
|
||||
{
|
||||
return @"CREATE TABLE P_CodeSchemeControlTab (
|
||||
SchemeId INT NOT NULL DEFAULT(0),
|
||||
SchemeCode VARCHAR(50) NOT NULL DEFAULT(''),
|
||||
SchemeName NVARCHAR(100) NULL,
|
||||
MenuKey VARCHAR(200) NULL,
|
||||
BindModule BIT NOT NULL DEFAULT(0),
|
||||
BindModuleCode VARCHAR(100) NULL,
|
||||
modid VARCHAR(100) NULL
|
||||
)";
|
||||
}
|
||||
|
||||
private static List<TableColumnSpec> GetSchemeTableColumns()
|
||||
{
|
||||
return new List<TableColumnSpec>
|
||||
{
|
||||
new TableColumnSpec("SchemeId", "INT IDENTITY(1,1) NOT NULL"),
|
||||
new TableColumnSpec("SchemeCode", "VARCHAR(50) NOT NULL DEFAULT('')"),
|
||||
new TableColumnSpec("SchemeName", "NVARCHAR(100) NOT NULL DEFAULT('')"),
|
||||
new TableColumnSpec("MenuKey", "VARCHAR(200) NOT NULL DEFAULT('')"),
|
||||
new TableColumnSpec("SubSysId", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("MenuId", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("MenuStruct", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("MenuCaption", "NVARCHAR(100) NULL"),
|
||||
new TableColumnSpec("ModuleCode", "VARCHAR(100) NOT NULL DEFAULT('')"),
|
||||
new TableColumnSpec("BindModule", "BIT NOT NULL DEFAULT(0)"),
|
||||
new TableColumnSpec("BindSubSysId", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("BindMenuStruct1", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("BindMenuStruct2", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("BindMenuId", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("BindModuleCode", "VARCHAR(100) NULL"),
|
||||
new TableColumnSpec("IsDefault", "BIT NOT NULL DEFAULT(0)"),
|
||||
new TableColumnSpec("Remark", "NVARCHAR(500) NULL"),
|
||||
new TableColumnSpec("CreateUserId", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("CreateUserName", "NVARCHAR(50) NULL"),
|
||||
new TableColumnSpec("CreateTime", "DATETIME NOT NULL DEFAULT(GETDATE())"),
|
||||
new TableColumnSpec("ModifyUserId", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("ModifyUserName", "NVARCHAR(50) NULL"),
|
||||
new TableColumnSpec("ModifyTime", "DATETIME NULL")
|
||||
};
|
||||
}
|
||||
|
||||
private static List<TableColumnSpec> GetSchemeControlTableColumns()
|
||||
{
|
||||
return new List<TableColumnSpec>
|
||||
{
|
||||
new TableColumnSpec("SchemeId", "INT NOT NULL DEFAULT(0)"),
|
||||
new TableColumnSpec("SchemeCode", "VARCHAR(50) NOT NULL DEFAULT('')"),
|
||||
new TableColumnSpec("SchemeName", "NVARCHAR(100) NULL"),
|
||||
new TableColumnSpec("MenuKey", "VARCHAR(200) NULL"),
|
||||
new TableColumnSpec("BindModule", "BIT NOT NULL DEFAULT(0)"),
|
||||
new TableColumnSpec("BindModuleCode", "VARCHAR(100) NULL"),
|
||||
new TableColumnSpec("modid", "VARCHAR(100) NULL")
|
||||
};
|
||||
}
|
||||
|
||||
private static string GetCreateCodeRecordTableSql()
|
||||
{
|
||||
return @"CREATE TABLE P_CodeSchemeRecordTab (
|
||||
RecordId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
|
||||
SchemeId INT NOT NULL DEFAULT(0),
|
||||
SchemeCode VARCHAR(50) NOT NULL DEFAULT(''),
|
||||
SchemeName NVARCHAR(100) NULL,
|
||||
MenuKey VARCHAR(200) NULL,
|
||||
SequenceKey NVARCHAR(300) NOT NULL DEFAULT(''),
|
||||
SerialNo INT NOT NULL DEFAULT(0),
|
||||
CodeValue NVARCHAR(300) NOT NULL,
|
||||
RuleText NVARCHAR(MAX) NULL,
|
||||
CreateUserId VARCHAR(50) NULL,
|
||||
CreateUserName NVARCHAR(50) NULL,
|
||||
CreateTime DATETIME NOT NULL DEFAULT(GETDATE())
|
||||
)";
|
||||
}
|
||||
|
||||
private static List<TableColumnSpec> GetCodeRecordTableColumns()
|
||||
{
|
||||
return new List<TableColumnSpec>
|
||||
{
|
||||
new TableColumnSpec("RecordId", "INT IDENTITY(1,1) NOT NULL"),
|
||||
new TableColumnSpec("SchemeId", "INT NOT NULL DEFAULT(0)"),
|
||||
new TableColumnSpec("SchemeCode", "VARCHAR(50) NOT NULL DEFAULT('')"),
|
||||
new TableColumnSpec("SchemeName", "NVARCHAR(100) NULL"),
|
||||
new TableColumnSpec("MenuKey", "VARCHAR(200) NULL"),
|
||||
new TableColumnSpec("SequenceKey", "NVARCHAR(300) NOT NULL DEFAULT('')"),
|
||||
new TableColumnSpec("SerialNo", "INT NOT NULL DEFAULT(0)"),
|
||||
new TableColumnSpec("CodeValue", "NVARCHAR(300) NOT NULL DEFAULT('')"),
|
||||
new TableColumnSpec("RuleText", "NVARCHAR(MAX) NULL"),
|
||||
new TableColumnSpec("CreateUserId", "VARCHAR(50) NULL"),
|
||||
new TableColumnSpec("CreateUserName", "NVARCHAR(50) NULL"),
|
||||
new TableColumnSpec("CreateTime", "DATETIME NOT NULL DEFAULT(GETDATE())")
|
||||
};
|
||||
}
|
||||
|
||||
internal static void EnsureCodeRecordStorage()
|
||||
{
|
||||
EnsureTable(CodeRecordTableName, GetCreateCodeRecordTableSql(), GetCodeRecordTableColumns());
|
||||
EnsureIndexIfColumnsExist(CodeRecordTableName, new string[] { "SchemeId", "CodeValue" }, "UX_CodeSchemeRecord_Code", "CREATE UNIQUE INDEX UX_CodeSchemeRecord_Code ON P_CodeSchemeRecordTab(SchemeId, CodeValue)");
|
||||
EnsureIndexIfColumnsExist(CodeRecordTableName, new string[] { "SchemeId", "SequenceKey", "SerialNo" }, "IX_CodeSchemeRecord_Sequence", "CREATE INDEX IX_CodeSchemeRecord_Sequence ON P_CodeSchemeRecordTab(SchemeId, SequenceKey, SerialNo)");
|
||||
}
|
||||
|
||||
internal static void EnsureCodeGenerateProcedure()
|
||||
{
|
||||
string createSql = string.Format(@"
|
||||
IF OBJECT_ID(N'dbo.{0}', N'P') IS NULL
|
||||
BEGIN
|
||||
EXEC(N'CREATE PROCEDURE dbo.{0} AS BEGIN SET NOCOUNT ON; END')
|
||||
END", CodeGenerateProcedureName);
|
||||
SqlHelper.ExecuteNonQuery(CommandType.Text, createSql);
|
||||
SqlHelper.ExecuteNonQuery(CommandType.Text, GetAlterCodeGenerateProcedureSql());
|
||||
}
|
||||
|
||||
private static string GetAlterCodeGenerateProcedureSql()
|
||||
{
|
||||
return string.Format(@"
|
||||
ALTER PROCEDURE dbo.{0}
|
||||
@SchemeId INT,
|
||||
@CreateUserId VARCHAR(50) = '',
|
||||
@CreateUserName NVARCHAR(50) = '',
|
||||
@return_id NVARCHAR(300) OUTPUT
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
|
||||
DECLARE @SchemeCode VARCHAR(50);
|
||||
DECLARE @SchemeName NVARCHAR(100);
|
||||
DECLARE @MenuKey VARCHAR(200);
|
||||
DECLARE @BindModule BIT;
|
||||
|
||||
SELECT
|
||||
@SchemeCode = ISNULL(SchemeCode, ''),
|
||||
@SchemeName = ISNULL(SchemeName, N''),
|
||||
@MenuKey = ISNULL(MenuKey, ''),
|
||||
@BindModule = ISNULL(BindModule, 0)
|
||||
FROM P_CodeSchemeTab
|
||||
WHERE SchemeId = @SchemeId;
|
||||
|
||||
IF @SchemeCode IS NULL
|
||||
BEGIN
|
||||
RAISERROR(N'未找到编码方案。', 16, 1);
|
||||
RETURN;
|
||||
END
|
||||
|
||||
IF ISNULL(@BindModule, 0) = 1
|
||||
BEGIN
|
||||
RAISERROR(N'当前方案已绑定模块,view模式只支持未绑定方案生成编码。', 16, 1);
|
||||
RETURN;
|
||||
END
|
||||
|
||||
DECLARE @defaultValue VARCHAR(MAX),
|
||||
@defaultSql NVARCHAR(MAX),
|
||||
@likeValue VARCHAR(MAX),
|
||||
@likeSql NVARCHAR(MAX),
|
||||
@prefixSql NVARCHAR(MAX),
|
||||
@likePrefix VARCHAR(300),
|
||||
@orderlen INT,
|
||||
@emptyint INT,
|
||||
@orderNumber VARCHAR(300),
|
||||
@out_char VARCHAR(300),
|
||||
@tmpSql NVARCHAR(MAX),
|
||||
@tmpvar VARCHAR(100),
|
||||
@avalue VARCHAR(300),
|
||||
@RuleText NVARCHAR(MAX),
|
||||
@SerialNo INT;
|
||||
|
||||
BEGIN TRY
|
||||
SELECT CASE WHEN element=1 THEN QUOTENAME(RIGHT('0000000000'+ISNULL(LTRIM(defaultvalue),''),elementlen),'''')
|
||||
WHEN element=2 THEN 'CONVERT(varchar(4),'+defaultvalue+',120)'
|
||||
WHEN element=3 THEN 'RIGHT(CONVERT(varchar(4),'+defaultvalue+',120),2)'
|
||||
WHEN element=4 THEN 'RIGHT('+QUOTENAME('00','''')+'+cast(month('+defaultvalue+') as varchar),2)'
|
||||
WHEN element=5 THEN 'RIGHT('+QUOTENAME('00','''')+'+cast(day('+defaultvalue+') as varchar),2)'
|
||||
WHEN element=6 AND ISNULL(elementlen,0)>0 THEN 'RIGHT('+QUOTENAME('000000000000','''')+'+'+defaultvalue+','+CAST(elementlen AS varchar)+')'
|
||||
WHEN element=6 AND ISNULL(elementlen,0)=0 THEN defaultvalue
|
||||
WHEN element=999 THEN QUOTENAME(CASE WHEN ISNULL(LTRIM(defaultvalue),'')='' THEN '0000000000000001' ELSE defaultvalue END,'''')
|
||||
ELSE 'RIGHT('+QUOTENAME('000000000000','''')+'+'+defaultvalue+','+CAST(elementlen AS varchar)+')'
|
||||
END AS defaultvalue,
|
||||
ISNULL(splitchar,'') AS splitchar,
|
||||
CASE WHEN element=1 AND isrelated=1 THEN QUOTENAME(RIGHT('0000000000'+ISNULL(LTRIM(defaultvalue),''),elementlen),'''')
|
||||
WHEN element=2 AND isrelated=1 THEN 'CONVERT(varchar(4),'+defaultvalue+',120)'
|
||||
WHEN element=3 AND isrelated=1 THEN 'RIGHT(CONVERT(varchar(4),'+defaultvalue+',120),2)'
|
||||
WHEN element=4 AND isrelated=1 THEN 'RIGHT('+QUOTENAME('00','''')+'+cast(month('+defaultvalue+') as varchar),2)'
|
||||
WHEN element=5 AND isrelated=1 THEN 'RIGHT('+QUOTENAME('00','''')+'+cast(day('+defaultvalue+') as varchar),2)'
|
||||
WHEN element=6 AND isrelated=1 AND ISNULL(elementlen,0)>0 THEN 'RIGHT(''000000000000''+'+defaultvalue+','+CAST(elementlen AS varchar)+')'
|
||||
WHEN element=6 AND isrelated=1 AND ISNULL(elementlen,0)=0 THEN defaultvalue
|
||||
WHEN element=999 THEN ''
|
||||
WHEN isrelated=0 THEN QUOTENAME(RIGHT('__________',elementlen),'''')
|
||||
ELSE ''
|
||||
END AS likevalue,
|
||||
CASE WHEN element=999 THEN elementlen ELSE 0 END AS orderlen
|
||||
INTO #tempordernumber
|
||||
FROM (
|
||||
SELECT
|
||||
CASE WHEN ISNUMERIC(CONVERT(VARCHAR(20), element)) = 1 THEN CONVERT(INT, element) ELSE 0 END AS element,
|
||||
ISNULL(CONVERT(VARCHAR(MAX), defaultvalue), '') AS defaultvalue,
|
||||
ISNULL(CONVERT(VARCHAR(50), splitchar), '') AS splitchar,
|
||||
CASE WHEN ISNUMERIC(CONVERT(VARCHAR(20), elementlen)) = 1 THEN CONVERT(INT, elementlen) ELSE 0 END AS elementlen,
|
||||
CASE WHEN ISNULL(CONVERT(VARCHAR(20), isrelated), '0') IN ('1', 'True', 'true', '是') THEN 1 ELSE 0 END AS isrelated,
|
||||
CASE WHEN ISNUMERIC(CONVERT(VARCHAR(20), Orderid)) = 1 THEN CONVERT(INT, Orderid) ELSE 0 END AS Orderid,
|
||||
CASE WHEN ISNUMERIC(CONVERT(VARCHAR(20), ID)) = 1 THEN CONVERT(INT, ID) ELSE 0 END AS ID
|
||||
FROM P_CodeSchemeControlTab
|
||||
WHERE SchemeId=@SchemeId
|
||||
AND ISNULL(CONVERT(NVARCHAR(20), enableFlag), N'1') IN (N'1', N'True', N'true', N'是')
|
||||
) ruleSource
|
||||
ORDER BY Orderid, ID;
|
||||
|
||||
SET @defaultValue='';
|
||||
SET @defaultSql='';
|
||||
SET @likeValue='';
|
||||
SET @likeSql='';
|
||||
SET @prefixSql='';
|
||||
SET @likePrefix='';
|
||||
SET @orderlen=0;
|
||||
SET @emptyint=0;
|
||||
SET @orderNumber='';
|
||||
SET @out_char='';
|
||||
SET @tmpvar='';
|
||||
SET @avalue='';
|
||||
SET @SerialNo=0;
|
||||
|
||||
SELECT @emptyint=1,
|
||||
@defaultValue=@defaultValue+defaultvalue+'+'+QUOTENAME(splitchar,'''')+'+',
|
||||
@likeValue=@likeValue+CASE WHEN likevalue='' THEN '' ELSE likevalue+'+'+QUOTENAME(splitchar,'''')+'+' END,
|
||||
@orderlen=@orderlen+orderlen
|
||||
FROM #tempordernumber;
|
||||
|
||||
SET @defaultValue=REPLACE(@defaultValue,'{{&loginid&}}',CAST(ISNULL(@CreateUserId,'') AS VARCHAR));
|
||||
SET @likeValue=REPLACE(@likeValue,'{{&loginid&}}',CAST(ISNULL(@CreateUserId,'') AS VARCHAR));
|
||||
|
||||
IF ISNULL(@emptyint,0)=0
|
||||
BEGIN
|
||||
SET @defaultSql='select @out_char=replace(convert(varchar(10),getdate(),120),''-'','''')+''0001''';
|
||||
SET @likeSql='select @out_char=max(CodeValue) from P_CodeSchemeRecordTab with(updlock,holdlock) where SchemeId=@SchemeId and CodeValue like '+QUOTENAME(REPLACE(CONVERT(VARCHAR(10),GETDATE(),120),'-','')+'%','''');
|
||||
SET @prefixSql='select @out_char='+QUOTENAME(REPLACE(CONVERT(VARCHAR(10),GETDATE(),120),'-',''),'''');
|
||||
SET @orderlen=4;
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
IF ISNULL(@orderlen,0)<=0
|
||||
BEGIN
|
||||
RAISERROR(N'当前方案未配置流水号规则。', 16, 1);
|
||||
RETURN;
|
||||
END
|
||||
|
||||
IF ISNULL(@defaultValue,'')<>''
|
||||
SET @defaultSql='select @out_char='+LEFT(@defaultValue,LEN(@defaultValue)-1);
|
||||
IF ISNULL(@likeValue,'')<>''
|
||||
BEGIN
|
||||
SET @likeSql='select @out_char=max(CodeValue) from P_CodeSchemeRecordTab with(updlock,holdlock) where SchemeId=@SchemeId and CodeValue like '+@likeValue+QUOTENAME('%','''');
|
||||
SET @prefixSql='select @out_char='+LEFT(@likeValue,LEN(@likeValue)-1);
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
SET @likeSql='select @out_char=max(CodeValue) from P_CodeSchemeRecordTab with(updlock,holdlock) where SchemeId=@SchemeId';
|
||||
SET @prefixSql='select @out_char=''''';
|
||||
END
|
||||
END
|
||||
|
||||
WHILE CHARINDEX('{{&',@defaultSql)>0
|
||||
BEGIN
|
||||
IF CHARINDEX('&}}',@defaultSql)<1
|
||||
BEGIN
|
||||
RAISERROR(N'变量名缺少&}}号。', 16, 1);
|
||||
RETURN;
|
||||
END
|
||||
SET @tmpvar=SUBSTRING(@defaultSql,CHARINDEX('{{&',@defaultSql),CHARINDEX('&}}',@defaultSql)-CHARINDEX('{{&',@defaultSql)+2);
|
||||
RAISERROR(N'未绑定模块方案不支持字段变量:%s。', 16, 1, @tmpvar);
|
||||
RETURN;
|
||||
END
|
||||
|
||||
WHILE CHARINDEX('{{&',@likeSql)>0
|
||||
BEGIN
|
||||
IF CHARINDEX('&}}',@likeSql)<1
|
||||
BEGIN
|
||||
RAISERROR(N'变量名缺少&}}号。', 16, 1);
|
||||
RETURN;
|
||||
END
|
||||
SET @tmpvar=SUBSTRING(@likeSql,CHARINDEX('{{&',@likeSql),CHARINDEX('&}}',@likeSql)-CHARINDEX('{{&',@likeSql)+2);
|
||||
RAISERROR(N'未绑定模块方案不支持字段变量:%s。', 16, 1, @tmpvar);
|
||||
RETURN;
|
||||
END
|
||||
|
||||
SET @RuleText=ISNULL(@defaultSql,N'')+CHAR(13)+CHAR(10)+ISNULL(@likeSql,N'');
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
SET @out_char='';
|
||||
IF ISNULL(@likeSql,'')<>''
|
||||
EXEC sp_executesql @likeSql,N'@SchemeId int,@out_char varchar(300) output', @SchemeId, @out_char output;
|
||||
|
||||
IF ISNULL(LTRIM(@out_char),'')<>''
|
||||
BEGIN
|
||||
SET @orderNumber=LEFT(@out_char, LEN(@out_char)-@orderlen)+
|
||||
RIGHT('0000000000'+CAST(CAST(RIGHT(@out_char,@orderlen) AS INT)+1 AS VARCHAR),@orderlen);
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
EXEC sp_executesql @defaultSql,N'@out_char varchar(300) output', @out_char output;
|
||||
SET @orderNumber=ISNULL(LTRIM(@out_char),'');
|
||||
END
|
||||
|
||||
SET @out_char='';
|
||||
IF ISNULL(@prefixSql,'')<>''
|
||||
BEGIN
|
||||
EXEC sp_executesql @prefixSql,N'@out_char varchar(300) output', @out_char output;
|
||||
SET @likePrefix=ISNULL(@out_char,'');
|
||||
END
|
||||
|
||||
IF LEN(ISNULL(@orderNumber,''))=0
|
||||
RAISERROR(N'生成编码为空,请检查方案规则。', 16, 1);
|
||||
|
||||
IF LEN(@orderNumber)>300
|
||||
RAISERROR(N'生成编码长度超过300,请检查方案规则。', 16, 1);
|
||||
|
||||
IF EXISTS (SELECT 1 FROM P_CodeSchemeRecordTab WITH (UPDLOCK, HOLDLOCK) WHERE SchemeId=@SchemeId AND CodeValue=@orderNumber)
|
||||
RAISERROR(N'生成编码重复,请检查方案规则。', 16, 1);
|
||||
|
||||
IF ISNUMERIC(RIGHT(@orderNumber,@orderlen))=1
|
||||
SET @SerialNo=CONVERT(INT,RIGHT(@orderNumber,@orderlen));
|
||||
|
||||
INSERT INTO P_CodeSchemeRecordTab
|
||||
(SchemeId, SchemeCode, SchemeName, MenuKey, SequenceKey, SerialNo, CodeValue, RuleText, CreateUserId, CreateUserName, CreateTime)
|
||||
VALUES
|
||||
(@SchemeId, @SchemeCode, @SchemeName, @MenuKey, ISNULL(@likePrefix,''), @SerialNo, @orderNumber, @RuleText, @CreateUserId, @CreateUserName, GETDATE());
|
||||
|
||||
SET @return_id=@orderNumber;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
|
||||
DECLARE @ErrorMessage NVARCHAR(4000);
|
||||
SET @ErrorMessage = ERROR_MESSAGE();
|
||||
RAISERROR(@ErrorMessage, 16, 1);
|
||||
END CATCH
|
||||
END", CodeGenerateProcedureName);
|
||||
}
|
||||
|
||||
internal static void EnsureRuleStorage()
|
||||
{
|
||||
EnsureSchemeControlRuleStorage();
|
||||
}
|
||||
|
||||
private static void EnsureNumberRuleSchemeStorage()
|
||||
{
|
||||
}
|
||||
|
||||
private static void EnsureSchemeControlRuleStorage()
|
||||
{
|
||||
if (!TableExists(SchemeControlTableName)) return;
|
||||
|
||||
foreach (TableColumnSpec column in GetNumberRuleSchemeColumns())
|
||||
{
|
||||
if (!ColumnExists(SchemeControlTableName, column.Name))
|
||||
{
|
||||
SqlHelper.ExecuteNonQuery(string.Format("ALTER TABLE {0} ADD {1} {2}", QuoteSqlIdentifier(SchemeControlTableName), QuoteSqlIdentifier(column.Name), column.Definition));
|
||||
}
|
||||
}
|
||||
|
||||
if (TableExists(NumberRuleTableName))
|
||||
{
|
||||
List<TableColumnSpec> mirrorColumns = GetNumberRuleMirrorColumns();
|
||||
foreach (TableColumnSpec column in mirrorColumns)
|
||||
{
|
||||
if (!ColumnExists(SchemeControlTableName, column.Name))
|
||||
{
|
||||
SqlHelper.ExecuteNonQuery(string.Format("ALTER TABLE {0} ADD {1} {2}", QuoteSqlIdentifier(SchemeControlTableName), QuoteSqlIdentifier(column.Name), column.Definition));
|
||||
}
|
||||
}
|
||||
|
||||
RemoveSchemeControlUnusedRuleColumns(mirrorColumns);
|
||||
}
|
||||
|
||||
EnsureIndex("IX_CodeSchemeControl_Menu", "CREATE INDEX IX_CodeSchemeControl_Menu ON P_CodeSchemeControlTab(MenuKey, SchemeId)");
|
||||
}
|
||||
|
||||
private static void RemoveSchemeControlUnusedRuleColumns(List<TableColumnSpec> mirrorColumns)
|
||||
{
|
||||
if (!TableExists(SchemeControlTableName)) return;
|
||||
|
||||
HashSet<string> keepColumns = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (TableColumnSpec column in GetNumberRuleSchemeColumns())
|
||||
{
|
||||
keepColumns.Add(column.Name);
|
||||
}
|
||||
if (mirrorColumns != null)
|
||||
{
|
||||
foreach (TableColumnSpec column in mirrorColumns)
|
||||
{
|
||||
keepColumns.Add(column.Name);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (string columnName in GetTableColumnNames(SchemeControlTableName))
|
||||
{
|
||||
if (keepColumns.Contains(columnName)) continue;
|
||||
|
||||
DropColumnIfExists(SchemeControlTableName, columnName);
|
||||
}
|
||||
}
|
||||
|
||||
private static List<string> GetTableColumnNames(string tableName)
|
||||
{
|
||||
List<string> columns = new List<string>();
|
||||
if (string.IsNullOrWhiteSpace(tableName) || !TableExists(tableName)) return columns;
|
||||
|
||||
string sql = @"SELECT name FROM sys.columns WHERE object_id = OBJECT_ID(@TableName) ORDER BY column_id";
|
||||
DataTable table = SqlHelper.ExecuteDataTable(sql, new SqlParameter[] { new SqlParameter("@TableName", tableName) });
|
||||
if (table == null) return columns;
|
||||
|
||||
foreach (DataRow row in table.Rows)
|
||||
{
|
||||
string columnName = row["name"] + "";
|
||||
if (!string.IsNullOrWhiteSpace(columnName))
|
||||
{
|
||||
columns.Add(columnName);
|
||||
}
|
||||
}
|
||||
return columns;
|
||||
}
|
||||
|
||||
private static List<TableColumnSpec> GetNumberRuleSchemeColumns()
|
||||
{
|
||||
return new List<TableColumnSpec>
|
||||
{
|
||||
new TableColumnSpec(NumberRuleSchemeIdColumn, "INT NOT NULL DEFAULT(0)"),
|
||||
new TableColumnSpec(NumberRuleSchemeCodeColumn, "VARCHAR(50) NOT NULL DEFAULT('')"),
|
||||
new TableColumnSpec(NumberRuleSchemeNameColumn, "NVARCHAR(100) NULL"),
|
||||
new TableColumnSpec(NumberRuleMenuKeyColumn, "VARCHAR(200) NULL"),
|
||||
new TableColumnSpec(NumberRuleBindModuleColumn, "BIT NOT NULL DEFAULT(0)"),
|
||||
new TableColumnSpec(NumberRuleBindModuleCodeColumn, "VARCHAR(100) NULL"),
|
||||
new TableColumnSpec(NumberRuleModIdColumn, "VARCHAR(100) NULL")
|
||||
};
|
||||
}
|
||||
|
||||
private static List<TableColumnSpec> GetNumberRuleMirrorColumns()
|
||||
{
|
||||
List<TableColumnSpec> columns = new List<TableColumnSpec>();
|
||||
string sql = @"
|
||||
SELECT
|
||||
c.COLUMN_NAME,
|
||||
c.DATA_TYPE,
|
||||
c.CHARACTER_MAXIMUM_LENGTH,
|
||||
c.NUMERIC_PRECISION,
|
||||
c.NUMERIC_SCALE,
|
||||
COLUMNPROPERTY(OBJECT_ID(c.TABLE_SCHEMA + '.' + c.TABLE_NAME), c.COLUMN_NAME, 'IsComputed') AS IsComputed
|
||||
FROM INFORMATION_SCHEMA.COLUMNS c
|
||||
WHERE c.TABLE_NAME = @TableName
|
||||
ORDER BY c.ORDINAL_POSITION";
|
||||
DataTable table = SqlHelper.ExecuteDataTable(sql, new SqlParameter[] { new SqlParameter("@TableName", NumberRuleTableName) });
|
||||
if (table == null) return columns;
|
||||
|
||||
foreach (DataRow row in table.Rows)
|
||||
{
|
||||
string columnName = row["COLUMN_NAME"] + "";
|
||||
if (string.IsNullOrWhiteSpace(columnName)) continue;
|
||||
if (string.Equals(columnName, DesignRuleUseColumn, StringComparison.OrdinalIgnoreCase)) continue;
|
||||
if (ToInt(row["IsComputed"]) == 1) continue;
|
||||
|
||||
string definition = GetColumnDefinitionFromSchemaRow(row);
|
||||
if (string.IsNullOrWhiteSpace(definition)) continue;
|
||||
|
||||
columns.Add(new TableColumnSpec(columnName, definition));
|
||||
}
|
||||
return columns;
|
||||
}
|
||||
|
||||
private static string GetColumnDefinitionFromSchemaRow(DataRow row)
|
||||
{
|
||||
string dataType = (row["DATA_TYPE"] + "").Trim();
|
||||
if (string.IsNullOrWhiteSpace(dataType)) return string.Empty;
|
||||
if (string.Equals(dataType, "timestamp", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(dataType, "rowversion", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
string typeText = dataType;
|
||||
int maxLength = ToInt(row["CHARACTER_MAXIMUM_LENGTH"]);
|
||||
if (IsLengthColumnType(dataType))
|
||||
{
|
||||
typeText += maxLength < 0 ? "(MAX)" : "(" + maxLength + ")";
|
||||
}
|
||||
else if (IsPrecisionColumnType(dataType))
|
||||
{
|
||||
int precision = ToInt(row["NUMERIC_PRECISION"]);
|
||||
int scale = ToInt(row["NUMERIC_SCALE"]);
|
||||
if (precision > 0)
|
||||
{
|
||||
typeText += "(" + precision + "," + Math.Max(0, scale) + ")";
|
||||
}
|
||||
}
|
||||
else if (IsDateTimePrecisionColumnType(dataType))
|
||||
{
|
||||
int scale = ToInt(row["NUMERIC_SCALE"]);
|
||||
if (scale > 0)
|
||||
{
|
||||
typeText += "(" + scale + ")";
|
||||
}
|
||||
}
|
||||
|
||||
return typeText + " NULL";
|
||||
}
|
||||
|
||||
private static int ToInt(object value)
|
||||
{
|
||||
int result;
|
||||
return int.TryParse(value + "", out result) ? result : 0;
|
||||
}
|
||||
|
||||
private static bool ToBool(object value)
|
||||
{
|
||||
if (value == null || value == DBNull.Value) return false;
|
||||
bool boolValue;
|
||||
if (bool.TryParse(value + "", out boolValue)) return boolValue;
|
||||
return ToInt(value) != 0;
|
||||
}
|
||||
|
||||
private static bool IsLengthColumnType(string dataType)
|
||||
{
|
||||
return string.Equals(dataType, "varchar", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(dataType, "nvarchar", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(dataType, "char", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(dataType, "nchar", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(dataType, "varbinary", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(dataType, "binary", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
private static bool IsPrecisionColumnType(string dataType)
|
||||
{
|
||||
return string.Equals(dataType, "decimal", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(dataType, "numeric", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
private static bool IsDateTimePrecisionColumnType(string dataType)
|
||||
{
|
||||
return string.Equals(dataType, "datetime2", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(dataType, "datetimeoffset", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(dataType, "time", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user