C#使用代码附加、分离数据库

一、前言

        这两天做一个从下载上传数据的程序,需求是这样的,有个单位在A地点需要搬迁到B地点,搬迁的时间为C,搬迁完毕的时间为D,他想要这两个地方同时营业,同时又想把搬迁的这段时间的A地点营业增加的数据导入到B地点所在的数据库。那么问题就很简单了,很显然我们需要一个中间库,然后从A地点的数据库中查询C到D这段时间的数据存到中间库中,然后再到B地点将中间库的数据上传到B地点的数据库。

        该单位用的数据库为sql server2000数据库,我用的开发工具为visual studio2013,中间库选用的access数据库。因为我想如果使用sql server数据库的话还要用户去附加分离这个中间库,比较麻烦,况且不是所有的用户都会操作数据库。

        既然选择了access数据库,那么首当其冲我选择了adox来做操作access数据库的媒介,但是。。。我发现数据库的每张表字段真的超多。。。一张表60+个字段,我创建access数据结构到何年何月?

        好了,那么就试试改用sql语句创建access数据库表好了,创建access的sql语句和sql server中的语法不大一样,尤其是字段类型,而且我发现access的字符串类型最大支持255个字符,而我需要超过300个字符长度的字段存储数据。查阅相关资料无果,果断选择放弃(虽然一定有解决办法,但是鉴于关于这方面的资源太少也没有十分官方的文档,还是用其他方式把)。

        正好,最近搞了搞linq to sql 这玩意,而且它十分强大,但是有些东西总是不尽人意的,服务资源管理器的数据连接功能并不支持sql 2005以下的版本,也就是说无法快捷的使用linq to sql类。entity framework实体数据模型也不支持sql 2000的数据库。。。

       难道真的要手写60+个字段的实体类?而且不只是一张表?经过不懈的折腾最终选择了直接用mdf文件,直接创建个sql 2000的数据库然后使用生成好的脚本执行一下,数据结构就创建好了。然后再分离出来,这样就可以用了。可是前面说过了, 事实总是不尽人意的。。。直连mdf没问题,关键不支持sql 2000的数据库文件直连。。(直连的意思就是不用通过附加这个mdf文件使用连接字符串直接连)

//直连mdf文件的连接字符串
Data Source=.;AttachDbFilename=D:/example.mdf;integrated Security=True;User Instance=True
 

既然不能使用连接字符串直接连接mdf文件,那么只好附加到sql server数据库上了,为了简化用户操作我使用C#代码进行了数据库的附加和分离,代码如下:

/// <summary>
        /// 附加swap数据库
        /// </summary>
        /// <param name="databaseName">数据库名</param>
        /// <param name="path">程序运行的根目录</param>
        public void AttachDB(string conStr, string databaseName, string path)
        {
            string mdfPath = path + "swap_Data.mdf";//mdf文件的路径,这里我固定写死了
            string ldfPath = path + "swap_Log.ldf";//ldf
            SqlConnection conn = new SqlConnection(conStr);//其中conStr为 Data Source=" + this.ServerAddr.Text + ";Initial Catalog=master;User ID=" + this.UserName.Text + ";Password=" + this.Password.Password + "
            conn.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            try
            {
                cmd.CommandText = "sp_attach_db";
                cmd.Parameters.Add(new SqlParameter(@"dbname", SqlDbType.NVarChar));
                cmd.Parameters[@"dbname"].Value = databaseName;
                cmd.Parameters.Add(new SqlParameter(@"filename1", SqlDbType.NVarChar));
                cmd.Parameters[@"filename1"].Value = mdfPath;
                cmd.Parameters.Add(new SqlParameter(@"filename2", SqlDbType.NVarChar));
                cmd.Parameters[@"filename2"].Value = ldfPath;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.ExecuteNonQuery();
                conn.Close();
                this.ShowMessageAsync("提示!", "附加数据库成功!");//不要管this.ShowMessageAsync是什么鬼,但你要用WPF的Mahapps.Metro的话,你会明白
            }
            catch (Exception ex)
            {
                this.ShowMessageAsync("提示!", "附加数据库失败," + ex.ToString());
                conn.Close();
            }
        }

        /// <summary>
        /// 分离数据库
        /// </summary>
        /// <param name="conStr">数据库连接字符串</param>
        /// <param name="databaseName">数据库名字</param>
        /// <param name="path">程序运行路径</param>
        public void DetachDB(string conStr, string databaseName, string path)
        {
            string mdfPath = path + "swap_Data.mdf";
            string ldfPath = path + "swap_Log.ldf";
            SqlConnection conn = new SqlConnection(conStr);
            conn.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            try
            {
                cmd.CommandText = "sp_detach_db";
                cmd.Parameters.Add(new SqlParameter(@"dbname", SqlDbType.NVarChar));
                cmd.Parameters[@"dbname"].Value = databaseName;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.ExecuteNonQuery();
                conn.Close();
                this.ShowMessageAsync("提示!", "分离数据库成功!");
            }
            catch (Exception ex)
            {
                this.ShowMessageAsync("提示!", "分离数据库失败," + ex.ToString());
                conn.Close();
            }
        }
 

其实上面的C#代码只是执行了两个存储过程,如下:

exec sp_attach_db @dbname=N'example',@filename1=N'D:\example_Data.mdf',@filename2=N'D:\example_Log.ldf'
exec sp_detach_db @dbname=N'example'


二、算了先写到这儿吧,饿了,回家

消息 5120,级别 16,状态 101,第 1 行
无法打开物理文件“D:\满组维护项目\新建文件夹\HBDataMove\HBDataMove\bin\Debug\swap_Data.mdf”。操作系统错误 5:“5(拒绝访问。)”。
消息 1802,级别 16,状态 7,第 1 行
CREATE DATABASE 失败。无法创建列出的某些文件名。请查看相关错误。

解决办法:右键文件属性>>安全>>完全控制



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值