连锁创建分店数据库方法

  连锁软件中,数据库结构不外两种,一种是所有数据都放同一个数据库,包括总部,另一种是总部独立数据库,每个分店一个数据库,而我常用的就是独立的数据库。

  这两种方法各有优势,数据放同一个数据库,各分店之间数据进行交互时会非常方便,有统计之类的,也是直接在数据库上操作,没那么多麻烦,不好的地方就是,数据一多,不便于维护,也得去考虑分页等问题。而第二个方法就是刚上和第一个的好坏相反,但是我觉得分开的话数据会非常清晰,维护方便,当然这只是针对我们软件数据库之间交互不多的情况,可能有的数据库之间交互数据比较频繁,就是用第一个方法,没有什么维护问题,也会选择第一,各有好坏,看各人使用。

  独立数据库就得处理创建分店时怎么创建数据库的问题,因为软件是一直在更新的,也就是数据库也是一直更新,所以创建分店数据库,也必须是灵活的。

  (Mssql)最早用的的方法:会在总部放一个数据库的备份文件(Bak),每次更新就是覆盖Bak文件,而创建数据库的思路,1.把model数据库备份成model.bak,2.把bak文件还原到model中,3.直接用create database 语句就可以建一个分店数据库了,4.用model.bak还原回model数据库,【注意:创建数据库时,都会以model数据库模版来创建,这里正是利用这个】

  这个方法是可以实现创建分店,但是比较笨,每次更新都要在更新文件里加个数据库bak文件,而且数据库都一直在增大,虽然是空数据库,只有表结构等这些东西,但也得8M+,这在更新时带来很多麻烦,于是后面又想到一个方法,在原有基础上改进。

  (Mssql)改进的方法:1.在安装软件时,会在mssql server上创建一个模版数据库,这个模版数据库也可以看作一个分店的数据库,软件更新时,会更新这个数据库,更新完会备份这个模版数据库,覆盖总部中的Bak文件,后面创建分店时怎么创建数据库的还是没变,和上面一样。这里改进的主要就是数据库模版问题,这样做的话,就不用每次更新带上数据库文件了。

  最初的软件就一直使用这个方法到现在。

  最近有一套新软件,在数据库的设计上又是遇到这问题,我总觉得改进过的方法也不是很方便,于是又想到下面的改进方法。

1.保持使用模版数据库,模版数据库随分店的更新一同更新,Bak文件使用不上了,作废。2.在创建分店时,先创建一个空的数据库,然后通过程序读取模版数据库的所有结构到新数据库上执行,简单点说就是通过程序来复制模版数据库的所有结构。

这样就不用再使用Bak那样的笨重文件了,而且数据库可以独立一个服务器,老方法是数据库和软件必须同一个服务器,因为要依赖放在总部里的Bak文件,而现在数据库和软件就可以脱离,模版数据库保护最新,分店创建新数据库复制模版数据库的结构,问题都解决 了。

随带说一下Mysql,因为我们软件是兼容多种数据库的,Mysql也是其中,前期mysql和mssql的思路是一样的,都是通过更新数据库文件,用数据库备份文件来创建新数据库,后面Mysql也改成这种最优的方法:1.软件安装完,自动创建一个模版数据库,2.创建新分店时,会把数据库备份成sql文件,再在程序中修改sql文件中的数据库名称,3.执行sql文件。这里mysql和mssql不一样的地方就是,mssql的复制表结构,必须一个一个去模版数据读出来再在新数据库上执行,而mysql的备份就是导出数据库的所有结构,我们只需要修改一个数据库名称为新的数据库执行。

下面附上C#里复制数据库的方法:

public void InitialData(string ModelDataBaseName, string DataBaseName)
        {
            #region 处理表和表数据
            string strSql_GetUserTable = string.Format("select * from {0}.dbo.GetUserTable order by id,columnsort ", ModelDataBaseName);
            DataTable dt_GetUserTable = dbHelper.ExecuteQuery(CommandType.Text, strSql_GetUserTable, null).Tables[0];
            if (dt_GetUserTable.Rows.Count > 0)
            {
                //id,tablename,columnsort,columnname,tablekey,columndatatype,columndatalen1
                //columndatalen2,columndatafloat,allowisnull,defaultdata
                string tableName = "";
                StringBuilder strCreateTableSql = new StringBuilder();
                StringBuilder strKeySql = new StringBuilder();
                StringBuilder strInsertData = new StringBuilder();

                foreach (DataRow dr in dt_GetUserTable.Rows)
                {
                    if (dr["tablename"].ToString() != tableName)
                    {
                        if (!string.IsNullOrEmpty(strCreateTableSql.ToString()))
                        {
                            if (strKeySql.Length > 0)
                            {
                                strKeySql.Remove(strKeySql.Length - 1, 1);
                                strCreateTableSql.AppendFormat(" PRIMARY KEY CLUSTERED ( {0} )) ON [PRIMARY] ", strKeySql.ToString());
                                strKeySql.Remove(strKeySql.Length - 1, 1);

                            }
                            else
                            {
                                if (strCreateTableSql.ToString().EndsWith(","))
                                strCreateTableSql.Remove(strCreateTableSql.Length - 1, 1);
                                strCreateTableSql.Append(" )");
                            }
                            dbHelper.ExecuteNonQuery(DataBaseName, strCreateTableSql.ToString(), null);
                            dbHelper.ExecuteNonQuery(CommandType.Text, string.Format(" insert into {0}.dbo.{1} select * from {2}.dbo.{1} ", DataBaseName, tableName, ModelDataBaseName), null);
                        }
                        tableName = dr["tablename"].ToString();
                        strCreateTableSql.Clear(); strCreateTableSql = new StringBuilder();
                        strKeySql.Clear(); strKeySql = new StringBuilder();
                        strCreateTableSql.AppendFormat(" create table {0} (", tableName);
                    }
                    strCreateTableSql.Append(dbHelper.GetDataType(dr["columnname"].ToString(),dr["columndatatype"].ToString(), dbHelper.GetInt(dr["columndatalen2"].ToString()),
                        dbHelper.GetInt(dr["columndatafloat"].ToString()), dr["allowisnull"].ToString(), dr["tablekey"].ToString(),ref strKeySql));
                }
                if (!string.IsNullOrEmpty(strCreateTableSql.ToString()))
                {
                    if (strKeySql.Length > 0)
                    {
                        strKeySql.Remove(strKeySql.Length - 1, 1);
                        strCreateTableSql.AppendFormat(" PRIMARY KEY CLUSTERED ( {0} )) ON [PRIMARY] ", strKeySql.ToString());
                        strKeySql.Remove(strKeySql.Length - 1, 1);
                    }
                    else
                    {
                        if (strCreateTableSql.ToString().EndsWith(","))
                            strCreateTableSql.Remove(strCreateTableSql.Length - 1, 1);
                        strCreateTableSql.Append(" )");
                    }
                    dbHelper.ExecuteNonQuery(DataBaseName, strCreateTableSql.ToString(), null);
                    dbHelper.ExecuteNonQuery(CommandType.Text, string.Format(" insert into {0}.dbo.{1} select * from {2}.dbo.{1} ", DataBaseName, tableName, ModelDataBaseName), null);
                }
            }
            #endregion

            #region 存储过程、视图、函数、触发器
            StringBuilder strSql = new StringBuilder();
            strSql.AppendFormat("  select name,type,definition from {0}.dbo.GetUserPV  ",ModelDataBaseName);
            DataTable dt_GetUserPV = dbHelper.ExecuteQuery(CommandType.Text, strSql.ToString(), null).Tables[0];
            if (dt_GetUserPV.Rows.Count > 0)
            {
                StringBuilder strTest = new StringBuilder();
                foreach (DataRow dr in dt_GetUserPV.Rows)
                {
                    dbHelper.ExecuteNonQuery(DataBaseName, string.Format("{0}", dr["definition"].ToString()), null);
                }

            }
            #endregion
        }
时间: 2024-11-07 05:16:45

连锁创建分店数据库方法的相关文章

Oracle数据库视图创建与处理方法教程

有关Oracle数据库视图创建与处理方法教程. 分享下oracle中创建视图与处理视图的方法,学习oracle视图的使用方法. 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词. 视图是存储在数据字典里的一条select语句.通过创建视图可以提取数据的逻辑上的集合或组合. oracle视图的优点:1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分.2.用

如何在aix环境下创建DB2数据库

创建DB2(DB2认证 DB2培训 )数据库(数据库培训 数据库认证 )应该是每个DB2使用者都需要掌握的知识,下面就为您介绍在AIX(AIX认证考试 IBM AIX培训 )环境下创建DB2数据库的方法,如果您在创建DB2数据库方面遇到过问题,不妨一看. 查看环境变量 db2set 如果发现db2set中db2codepage不是819,执行 以下是代码片段: db2set db2codepage=819 db2 create database test05 on /home/db2inst1

QTP连接MYSQL数据库方法

1.首先安装mysql数据驱动,qtp在windows系统下操作连接mysql,所以下载mysql-connector-odbc-   5.1.8-win32.msi 下载地址:http://mysql.mirrors.pair.com/Downloads/Connector-ODBC/5.1/mysqlconnector-odbc-5.1.8-win32.msi 2.安装mysql驱动 ,默认安装即可. 3. 添加默认数据源 控制面板->管理工具->数据源ODBC->系统DNS->

创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添加一个User类: namespace MyFirstApp.Models { public class User { public int ID { get; set; } public string Name { get; set; } public string Email { get; se

Android入门(十)SQLite创建升级数据库

原文链接:http://www.orlion.ga/603/ 一.创建数据库 Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, 借助这个类就可以非常简单地对数据库进行创建和升级. SQLiteOpenHelper是一个抽象类,其中有两个抽象方法分别是onCreate()和onUpgrade(),分别在这两个方法中实现创建和升级数据库的逻辑 SQLiteOpenHelper还有两个十分重要的实例方法,getReadableDatabase(

ADOX创建ACCESS数据库列名的数据类型

Type   属性             指示   Parameter.Field   或   Property   对象的操作类型或数据类型. 设置和返回值 设置或返回下列   DataTypeEnum   值之一.相应的   OLE   DB   类型标识符在下表的说明栏的括号中给出.有关   OLE   DB   数据类型的详细信息,请参阅第   10   章和<OLE   DB   程序员参考>的附录   A. 常量   说明   AdArray   与其他类型一起加入逻辑   OR

使用Python创建MySQL数据库实现字段动态增加以及动态的插入数据

应用场景: 我们需要设计一个数据库来保存多个文档中每个文档的关键字.假如我们每个文档字符都超过了1000,取其中出现频率最大的为我们的关键字. 假设每个文档的关键字都超过了300,每一个文件的0-299号存储的是我们的关键字.那我们要建这样一个数据库,手动输入这样的一个表是不现实的,我们只有通过程序来帮我实现这个重复枯燥的操作. 具体的示意图如下所示: 首先图1是我们的原始表格: 图1 这个时候我们需要程序来帮我们完成自动字段的创建和数据的插入. 图2 上图是我们整个表的概况.下面我们就用程序来

MySQL函数不能创建的解决方法

MySQL函数不能创建,是一个很麻烦的问题,下面就为您提供了一个解决此问题的方法,如果您也遇到过类似的问题,不妨一看. http://database.51cto.com/art/201010/229918.htm 在使用MySQL数据库时,有时会遇到MySQL函数不能创建的情况.下面就教您一个解决MySQL函数不能创建问题的方法,供您借鉴参考. 出错信息大致类似: ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO S

使用Entity Framework Core Code First创建SQLite数据库

Entity Framework Core(以下简称"EF Core")支持多种数据库.在这篇文章中,我们看看如何使用EF Core的Code First方式创建SQLite数据库 下载SQLite,解压后会得到三个文件,放到c:\sqlite目录下 我们先创建一个.NET Core控制台程序 添加EF Core for SQLite组件库 "dependencies": { "Microsoft.EntityFrameworkCore.Sqlite&qu