using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using Forks.EnterpriseServices.BusinessInterfaces; using Forks.EnterpriseServices.DomainObjects2; using Forks.Utils.Data; namespace BO { public class UpdateDb { public static string CreateTables(string conStr, string dbName) { string s; using (ISqlUtil sqlUtil = new SqlUtil(conStr)) { var hasDb = (string)sqlUtil.ExecuteScalar("select '1' from master..sysdatabases where name='" + dbName + "'"); if (hasDb == "1") { s = ChangeDatabase(conStr, dbName); return s; } sqlUtil.ExecuteNonQuery("create database [" + dbName + "] COLLATE Chinese_PRC_CI_AS"); sqlUtil.ExecuteNonQuery("alter database [" + dbName + "] set recovery simple"); if (GetSqlServerMainVersion(sqlUtil) >= 9) { SetSql2000Comptable(sqlUtil, dbName); } s = ChangeDatabase(conStr, dbName); } try { using (ISqlUtil sqlUtil = new SqlUtil(s)) { Dmo.CreateTables(sqlUtil, GetTypes()); return s; } } catch { SqlConnection.ClearAllPools(); using (var sqlUtil = new SqlUtil(conStr)) { sqlUtil.ExecuteNonQuery("drop database [" + dbName + "]"); } throw; } } static int GetSqlServerMainVersion(ISqlUtil sqlUtil) { string s = (string)sqlUtil.ExecuteScalar("SELECT SERVERPROPERTY('ProductVersion')"); return int.Parse(s.Split(new[] { '.' }, 2)[0]); } static void SetSql2000Comptable(ISqlUtil sqlUtil, string dbName) { using (var cmd = sqlUtil.Connection.CreateCommand()) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "sp_dbcmptlevel"; cmd.Parameters.Add(CreateParameter(cmd, "@dbname", DbType.String, dbName)); cmd.Parameters.Add(CreateParameter(cmd, "@new_cmptlevel", DbType.Int32, 80)); cmd.ExecuteNonQuery(); } } static IDbDataParameter CreateParameter(IDbCommand cmd, string name, DbType type, object value) { var result = cmd.CreateParameter(); result.DbType = type; result.ParameterName = name; result.Value = value; return result; } static string ChangeDatabase(string conString, string db) { var con = SqlConnectionString.Parse(conString); con.Database = db; return con.ToString(); } public static void UpdateTables(string conStr) { using (var context = new TransactionContext(Dmo.NewSession(conStr))) { AddDefaultUser(context); } using (ISqlUtil sqlUtil = new SqlUtil(conStr)) { Dmo.UpdateTables(sqlUtil, GetTypes()); } } private static void AddDefaultUser(TransactionContext context) { const string sql = "select * from LoginUser"; var obj = context.Session.ExecuteSqlScalar(sql); if (obj != null) return; //-- 创建默认登陆用户 const string insert = "insert dbo.LoginUser(UserName, PassWord, RoleSchema) values('{0}', cast('' as binary), '{1}')"; context.Session.ExecuteSqlNonQuery(string.Format(insert, "system", "system")); context.Session.ExecuteSqlNonQuery(string.Format(insert, "user1", "operator")); context.Session.ExecuteSqlNonQuery(string.Format(insert, "set", "operator")); context.Commit(); } private static IEnumerable GetTypes() { return BOClassAttribute.GetBoClasses(); } } }