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<Type> GetTypes() {
|
|
return BOClassAttribute.GetBoClasses();
|
|
}
|
|
|
|
}
|
|
}
|