You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

185 lines
6.6 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FireBirdUtil.DataTypes;
using FireBirdUtil.SqlUtils;
using FirebirdSql.Data.FirebirdClient;
namespace FireBirdUtil.SqlHelpers
{
/// <summary>
/// 创建数据表的类。
/// <para>如果创建失败,则抛出异常(例如当数据库已经被其他程序使用时);如果已创建,则不创建</para>
/// </summary>
public class CreateTableHelper
{
string _database;
string _tableName;
List<FieldInfo> _fields;
public CreateTableHelper(string database, string tableName)
{
#if DEBUG
if (string.IsNullOrEmpty(database) || string.IsNullOrEmpty(tableName))
throw new ArgumentException("构造函数的参数不允许为空");
#endif
_database = database;
_tableName = tableName;
_fields = new List<FieldInfo>();
}
public void AddField(FieldInfo fieldInfo)
{
_fields.Add(fieldInfo);
}
private void AlterTable(string database,string tableName)
{
//if (tableName == "PSInfo")
//{
// AddColumnToTable(database, "PSINFO", "BILLSET", "varchar(100)");
// AddColumnToTable(database, "PSINFO", "WINDOWSET", "varchar(100)");
// AddColumnToTable(database, "PSINFO", "GOODSINSTORE_ID", "Integer");
//}
//else if (tableName == "ProduceBatch")
//{
// AddColumnToTable(database, "PRODUCEBATCH", "MAINNUMBER", "decimal(18,6)");
// AddColumnToTable(database, "PRODUCEBATCH", "BILLID", "Integer");
//}
//else if (tableName == "ProduceIntake")
//{
// AddColumnToTable(database, "PRODUCEINTAKE", "OUTGOODS_ID", "Integer");
// AddColumnToTable(database, "PRODUCEINTAKE", "OUTGOODSNUM", "decimal(18,6)");
// AddColumnToTable(database, "PRODUCEINTAKE", "INPUTTYPE", "varchar(100)");
//} else if (tableName == "WeightInfo") {
// AddColumnToTable(database, "WEIGHTINFO", "PRODUCTDATE", "TIMESTAMP");
// AddColumnToTable(database, "WEIGHTINFO", "BATCHNUMBER_ID", "Integer");
// AddColumnToTable(database, "WEIGHTINFO", "PRODUCTLINK", "varchar(100)");
// AddColumnToTable(database, "WEIGHTINFO", "ROUTING_ID", "Integer");
// AddColumnToTable(database, "WEIGHTINFO", "PRODUCTSHIFT_ID", "Integer");
// AddColumnToTable(database, "WEIGHTINFO", "STANDARDNUM", "decimal(18,6)");
// AddColumnToTable(database, "WEIGHTINFO", "EMPLOYEE_ID", "Integer");
// AddColumnToTable(database, "WEIGHTINFO", "DEPARTMENT_ID", "Integer");
// AddColumnToTable(database, "WEIGHTINFO", "ISIMPORT", "varchar(5)");
// AddColumnToTable(database, "WEIGHTINFO", "GOODSBATCHID", "Integer");
// AddColumnToTable(database, "WEIGHTINFO", "GOODSBATCH_NAME", "varchar(100)");
// AddColumnToTable(database, "WEIGHTINFO", "OUTDETAILID", "Integer");
//} else if (tableName == "Intake_Detail") {
// AddColumnToTable(database, "INTAKE_DETAIL", "PRODUCTDATE", "TIMESTAMP");
//}
// else if (tableName == "WpfUser")
//{
// AddColumnToTable(database, "WPFUSER", "ROWVERSION", "varchar(100)");
//} else if (tableName == "BSDetail") {
// AddColumnToTable(database, "BSDETAIL", "FIXEDNUMBER", "decimal(18,6)");
//}
}
private static void AddColumnToTable(string dataBase,string tableName, string column,string columnType)
{
SqlHelper sh = new SqlHelper(dataBase);
sh.CreateTransaction();
try
{
var table =
sh.Query(string.Format(
@"SELECT count(*) FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME='{0}' AND RDB$FIELD_NAME='{1}'", tableName, column));
if (table != null && table.Rows.Count > 0)
{
var count = (int) table.Rows[0][0];
if (count <= 0)
{
sh.ExecuteNonQuery(string.Format(@"alter table {0} add {1} {2}",tableName,column, columnType));
}
}
sh.Commit();
}
catch (Exception ex)
{
sh.Rollback();
#if DEBUG
throw new ApplicationException(ex.ToString());
#endif
}
}
/// <summary>
/// 数据表不存在,则创建
/// </summary>
public void CreateTableIfNotExist(string sqlAfterCreateTable = null)
{
if (SQLExecuteUtil.IsTableExist(_database, _tableName))
{
AlterTable(_database,_tableName);
return;
}
string selectGeneratorCountSql;
string dropGeneratorSql;
string addGeneratorSql;
string addTriggerSql;
var fieldSqls = GetFieldSqls(_tableName, _fields, out selectGeneratorCountSql, out dropGeneratorSql, out addGeneratorSql, out addTriggerSql);
SQLExecuteUtil.CreateTable(_database, _tableName, string.Join(",", fieldSqls));
//添加自增功能
AddAutoIncrease(_database, selectGeneratorCountSql, dropGeneratorSql, addGeneratorSql, addTriggerSql);
if (!string.IsNullOrEmpty(sqlAfterCreateTable))
ExecuteSqlAfterCreateTable(_database, sqlAfterCreateTable);
}
private void AddAutoIncrease(string database, string selectGeneratorCountSql, string dropGeneratorSql, string addGeneratorSql, string addTriggerSql)//添加自增功能
{
SqlHelper sh = new SqlHelper(database);
sh.CreateTransaction();
try {
var count = sh.Query<int>(selectGeneratorCountSql, obj => { return (int)obj; });
if (count > 0)
sh.ExecuteNonQuery(dropGeneratorSql);
sh.ExecuteNonQuery(addGeneratorSql);
sh.ExecuteNonQuery(addTriggerSql);
sh.Commit();
} catch (Exception ex) {
sh.Rollback();
#if DEBUG
throw new ApplicationException(ex.ToString());
#endif
}
}
private static List<string> GetFieldSqls(string tableName, List<FieldInfo> fieldInfos, out string selectGeneratorCountSql, out string dropGeneratorSql, out string addGeneratorSql, out string addTriggerSql)
{
selectGeneratorCountSql = string.Empty;
dropGeneratorSql = string.Empty;
addGeneratorSql = string.Empty;
addTriggerSql = string.Empty;
List<string> fieldSqls = new List<string>();
foreach (var item in fieldInfos) {
fieldSqls.Add(item.GetSQL());
if (item.IsAutoIncrease) {
selectGeneratorCountSql = item.GetSql_SelectGeneratorCount(tableName);
dropGeneratorSql = item.GetSql_DropGenerator(tableName);
addGeneratorSql = item.GetSql_AddGenerator(tableName);
addTriggerSql = item.GetSql_AddAutoIncreaseTrigger(tableName);
}
}
return fieldSqls;
}
private void ExecuteSqlAfterCreateTable(string database, string sqlAfterCreateTable)
{
SqlHelper sh = new SqlHelper(database);
sh.CreateTransaction();
try {
sh.ExecuteNonQuery(sqlAfterCreateTable);
sh.Commit();
} catch (Exception ex) {
sh.Rollback();
#if DEBUG
throw new ApplicationException(ex.ToString());
#endif
}
}
}
}