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 { /// /// 创建数据表的类。 /// 如果创建失败,则抛出异常(例如当数据库已经被其他程序使用时);如果已创建,则不创建 /// public class CreateTableHelper { string _database; string _tableName; List _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(); } 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 } } /// /// 数据表不存在,则创建 /// 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(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 GetFieldSqls(string tableName, List 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 fieldSqls = new List(); 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 } } } }