|
|
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
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|