苏飞论坛

标题: 一个操作Sql2005数据库的类(备份,还原,分离,附加,添加删除用户等操作) [打印本页]

作者: 站长苏飞    时间: 2012-7-2 11:57
标题: 一个操作Sql2005数据库的类(备份,还原,分离,附加,添加删除用户等操作)
导读部分
-------------------------------------------------------------------------------------------------------------
C#基类库苏飞版--系列教程导航
http://www.sufeinet.com/thread-655-1-1.html

[C#] 纯文本查看 复制代码
/* 
* 更新时间 :2011-09-01 16:06
* 更 新 人 :苏飞
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
  
namespace Sql2005
{
    /// <summary>
    /// Sql数据操作帮助类,包括数据的创建,删除,修改密码等一系统列操作
    /// </summary>
    public abstract class DBT_SqlHelper
    {
        #region 连接Sql数据部分
  
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        public static readonly string connectionString = System.Configuration.ConfigurationSettings.AppSettings["con"].ToString().Trim();
  
        #region//ExecteNonQuery方法
  
        /// <summary>
        ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
        /// 使用参数数组形式提供参数列表  
        /// </summary>
        /// <param name="connectionString">一个有效的数据库连接字符串</param>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
        public static int ExecteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                //清空SqlCommand中的参数列表
                cmd.Parameters.Clear();
                return val;
            }
        }
  
        /// <summary>
        ///存储过程专用
        /// </summary>
        /// <param name="cmdText">存储过程的名字</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
        public static int ExecteNonQueryProducts(string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecteNonQuery(DBT_SqlHelper.connectionString, CommandType.StoredProcedure, cmdText, commandParameters);
        }
  
        /// <summary>
        ///Sql语句专用
        /// </summary>
        /// <param name="cmdText">T_Sql语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
        public static int ExecteNonQueryText(string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecteNonQuery(DBT_SqlHelper.connectionString, CommandType.Text, cmdText, commandParameters);
        }
  
        #endregion
  
        /// <summary>
        /// 为执行命令准备参数
        /// </summary>
        /// <param name="cmd">SqlCommand 命令</param>
        /// <param name="conn">已经存在的数据库连接</param>
        /// <param name="trans">数据库事物处理</param>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param>
        /// <param name="cmdParms">返回带参数的命令</param>
        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
        {
            //判断数据库连接状态
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            //判断是否需要事物处理
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = cmdType;
            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }
  
        #endregion
  
        /// <summary>
        /// 根据条件创建数据库
        /// </summary>
        /// <param name="dbName">用于指定数据文件的逻辑名称</param>
        /// <param name="dbFileName">指定数据文件的操作系统文件名。其后面的参数是创建数据文件时定义的物理文件的路径名和文件名</param>
        /// <param name="dbSize">指定数据文件的大小</param>
        /// <param name="dbMaxSize">指定数据文件可以增长到的最大大小</param>
        /// <param name="dbFileGrowth">
        /// 指定数据文件的增长增量,其值不能超过maxsize设置。0表示不增长。,默认值为MB。如果指定为%,
        /// 则增量大小为发生时文件大小的指定百分比,如果没有指定,默认值为10%。
        /// </param>
        /// <param name="logName">用于指定数据日志的逻辑名称</param>
        /// <param name="logFileName">指定数据日志的操作系统文件名。其后面的参数是创建数据日志时定义的物理文件的路径名和文件名</param>
        /// <param name="logSize">指定数据日志的大小</param>
        /// <param name="logMaxSize">指定数据日志可以增长到的最大大小</param>
        /// <param name="logFileGrowth">
        /// 指定数据日志的增长增量,其值不能超过maxsize设置。0表示不增长。,默认值为MB。如果指定为%,
        /// 则增量大小为发生时文件大小的指定百分比,如果没有指定,默认值为10%。
        /// </param>
        /// <param name="isDeletedb">在创建数据库是否删除同名的现存数据库</param>
        public static void CreateDatabase(string dbName, string dbFileName, string dbSize, string dbMaxSize, string dbFileGrowth,
           string logName, string logFileName, string logSize, string logMaxSize, string logFileGrowth, Boolean isDeletedb)
        {
            #region 检查是否存在数据dbName
  
            StringBuilder dbSql = new StringBuilder();
            //设置当前数据库
            dbSql.Append("USE master ");
            dbSql.Append("  GO");
            if (isDeletedb)
            {
                dbSql.Append("IF  EXISTS(SELECT * FROM  sysdatabases WHERE  name ='@dbName')begin DROP DATABASE @dbName  end");
            }
            #endregion
  
            #region 创建数据库
  
            //开始创建数据并指定名称
            dbSql.Append("CREATE DATABASE @dbName ON  PRIMARY (");
            //数据库名
            dbSql.Append("NAME='@ dbName" + "_data',");
            //数据路经
            dbSql.Append("FILENAME='@dbFileName', ");
            //大小
            dbSql.Append("SIZE=@dbSize, ");
            //最大值
            dbSql.Append("MAXSIZE= @dbMaxSize,");
            //增长值
            dbSql.Append("FILEGROWTH=@dbFileGrowth)");
  
            #endregion
  
            #region 创建数据库日志
  
            //开始创建日志文件
            dbSql.Append("LOG ON (");
            //日志文件名
            dbSql.Append("NAME='@logName" + "_log',");
            //日志文件路经
            dbSql.Append("FILENAME='@logFileName',");
            //大小
            dbSql.Append("SIZE=@logSize,");
            //最大值
            dbSql.Append("MAXSIZE=@logMaxSize,");
            //增加值
            dbSql.Append("FILEGROWTH=@logFileGrowth ) GO");
  
            #endregion
  
            #region 开始执行创建命令
  
            //设置参数列表
            SqlParameter[] parameter =  
            {
                new SqlParameter("@dbName", dbName),  
                new SqlParameter("@dbFileName", dbFileName),
                new SqlParameter("@dbSize", dbSize),
                new SqlParameter("@dbMaxSize", dbMaxSize),
                new SqlParameter("@dbFileGrowth", dbFileGrowth),
                new SqlParameter("@logName", logName),
                new SqlParameter("@logFileName", logFileName),
                new SqlParameter("@logSize", logSize),
                new SqlParameter("@logMaxSize", logMaxSize),
                new SqlParameter("@logFileGrowth", logFileGrowth)
            };
  
            DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
  
            #endregion
        }
  
        /// <summary>
        /// 删除指定名称的数据库文件以及日志文件
        /// </summary>
        /// <param name="dbName">数据库名称</param>
        public static void DropDatabase(string dbName)
        {
            #region 构造Sql代码
  
            StringBuilder dbSql = new StringBuilder();
            //设置当前数据库
            dbSql.Append("USE master ");
            dbSql.Append("  GO  ");
            dbSql.Append("DROP DATABASE @dbName");
  
            #endregion
  
            #region 开始执行命令
  
            //设置参数列表
            SqlParameter[] parameter = { new SqlParameter("@dbName", dbName) };
            DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), parameter);
  
            #endregion
        }
  
        /// <summary>
        /// 备份数据库
        /// </summary>
        /// <param name="dbName">数据库文件名</param>
        /// <param name="dbFileName">路经包括盘符和文件名以及扩展名称一般为“_dat”</param>
        public static void BackupDatabase(string dbName, string dbFileName)
        {
            #region 构造Sql代码
  
            StringBuilder dbSql = new StringBuilder();
            //设置当前数据库
            dbSql.Append("USE master ");
            dbSql.Append("  GO  ");
            dbSql.Append("BACKUP DATABASE @dbName TO DISK ='@dbFileName'");
  
            #endregion
  
            #region 开始执行命令
  
            //设置参数列表
            SqlParameter[] parameter =  
            {
                new SqlParameter("@dbName", dbName),  
                new SqlParameter("@dbFileName", dbFileName)
            };
  
            DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), parameter);
  
            #endregion
        }
  
        /// <summary>
        /// 恢复数据库
        /// </summary>
        /// <param name="dbName">数据库名</param>
        /// <param name="dbFileName">路经包括盘符和文件名以及扩展名称一般为“_dat”</param>
        public static void RestoreDatabase(string dbName, string dbFileName)
        {
            #region 构造Sql代码
  
            StringBuilder dbSql = new StringBuilder();
            //设置当前数据库
            dbSql.Append("USE master ");
            dbSql.Append("  GO  ");
            dbSql.Append("restore database @dbName from disk='@dbFileName'  WITH REPLACE,RECOVERY");
  
            #endregion
  
            #region 开始执行命令
  
            //设置参数列表
            SqlParameter[] parameter =  
            {
                new SqlParameter("@dbName", dbName),  
                new SqlParameter("@dbFileName", dbFileName)
            };
            DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
  
            #endregion
        }
  
        /// <summary>
        /// 附加数据库文件
        /// </summary>
        /// <param name="newDbName">附加时的新名称可以是原名,也可以得新取一个新名称</param>
        /// <param name="dbFileName">数据文件的路径包括盘符和文件名以及扩展名</param>
        /// <param name="logFileName">日志文件的路径包括盘符和文件名以及扩展名</param>
        public static void OnlineDatabase(string newDbName, string dbFileName, string logFileName)
        {
            #region 构造Sql代码
  
            StringBuilder dbSql = new StringBuilder();
            //设置当前数据库
            dbSql.Append("USE master ");
            dbSql.Append("  GO  ");
            dbSql.Append("EXEC sp_attach_db @ newDbName,'@dbFileName','@logFileName'");
  
            #endregion
  
            #region 开始执行命令
  
            //设置参数列表
            SqlParameter[] parameter =  
            {
                new SqlParameter("@dbFileName", dbFileName),  
                new SqlParameter("@logFileName", logFileName)
            };
            DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
  
            #endregion
        }
  
        /// <summary>
        /// 分离数据库文件
        /// </summary>
        /// <param name="dbName">数据库名称</param>
        public static void OfflineDatabase(string dbName)
        {
            #region 构造Sql代码
  
            StringBuilder dbSql = new StringBuilder();
            //设置当前数据库
            dbSql.Append("USE master ");
            dbSql.Append("  GO  ");
            dbSql.Append(" exec  sp_detach_db '@dbName' ");
  
            #endregion
  
            #region 开始执行命令
  
            //设置参数列表
            SqlParameter[] parameter = { new SqlParameter("@dbName", dbName) };
            DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
  
            #endregion
        }
  
        /// <summary>
        /// 重新设置用户的密码
        /// </summary>
        /// <param name="newPassword">新密码</param>
        /// <param name="userName">登录用户名</param>
        public static void ResetPassword(string newPassword, string userName)
        {
            #region 构造Sql代码
  
            StringBuilder dbSql = new StringBuilder();
            //设置当前数据库
            dbSql.Append("USE master ");
            dbSql.Append("  GO  ");
            dbSql.Append("EXEC   sp_password null,'@newPassword','@userName'");
  
            #endregion
  
            #region 开始执行命令
  
            //设置参数列表
            SqlParameter[] parameter =  
            {
                new SqlParameter("@newPassword", newPassword),
                new SqlParameter("@userName", userName)  
            };
            DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
  
            #endregion
        }
  
        /// <summary>
        /// 分离数据库文件
        /// </summary>
        /// <param name="dbName">数据库名称</param>
        /// <param name="newPassword">新密码</param>
        /// <param name="userName">登录用户名</param>
        public static void CreateDbUser(string dbName, string userName, string passWord)
        {
            #region 构造Sql代码
  
            StringBuilder dbSql = new StringBuilder();
            //设置当前数据库
            dbSql.Append("USE  " + dbName);
            dbSql.Append("  GO  ");
            dbSql.Append("EXEC sp_addlogin N'@userName','@passWord'");
            dbSql.Append("EXEC sp_grantdbaccess N'@userName'");
  
            #endregion
  
            #region 开始执行命令
  
            //设置参数列表
            SqlParameter[] parameter =  
            {  
                new SqlParameter("@dbName",userName),
                new SqlParameter("@userName", userName),
                new SqlParameter("@passWord", passWord)
            };
            DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
  
            #endregion
        }
  
        /// <summary>
        /// 给指定数据的指定用户授于本数据库的所有操作权限
        /// </summary>
        /// <param name="dbName">数据库名称</param>
        /// <param name="userName">用户名称</param>
        public static void AddRoleToDbUser(string dbName, string userName)
        {
            #region 构造代码
  
            StringBuilder dbSql = new StringBuilder();
  
            //设置当前数据库
            dbSql.Append("USE " + dbName);
            dbSql.Append("GO ");
            dbSql.Append("EXEC sp_addrolemember N'@dbName', N'@userName'");
  
            #endregion
  
            #region 开始执行命令
  
            //设置参数列表
            SqlParameter[] parameter =  
            {  
                new SqlParameter("@dbName",userName),
                new SqlParameter("@userName", userName)
            };
            DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
  
            #endregion
        }
    }
}

作者: 风舞清涟    时间: 2012-12-8 11:21
不得不说,楼主很有想法。但实际意义不大,练手还是不错的。

验证码的体验不是很好。
作者: 站长苏飞    时间: 2012-12-8 11:52
风舞清涟 发表于 2012-12-8 11:21
不得不说,楼主很有想法。但实际意义不大,练手还是不错的。

验证码的体验不是很好。

这个理解一下吧,这个应该比让你1分钟发一次贴好多了,主要是这是我个人网站,没太多时间管理,你知道的垃圾广告太多,我删除都来不及,希望理解,以后会给特定用户不需要审核和验证码的,只要是技术人员,这些都好说,
作者: 幻雪丶逆时光    时间: 2013-1-6 09:46
2008 适用 不?  我正好有项目需要 代码备份
作者: 站长苏飞    时间: 2013-1-6 09:56
幻雪丶逆时光 发表于 2013-1-6 09:46
2008 适用 不?  我正好有项目需要 代码备份

你可以测试下,没多少代码
作者: youzi    时间: 2013-4-9 16:57
嗯,学习了
作者: pzw520125    时间: 2013-8-28 14:42
学习了,谢谢分享
作者: stone6600    时间: 2013-12-30 13:52
非常感谢你帮了我的大忙,真的太感谢你啦!
作者: kunkun0921    时间: 2014-1-21 16:50
站长你好,这个类在SQL2008里面好像会有点问题,因为你所有的SQL都是使用StringBuilder追加起来的,所以Use master go这样的语句就在同一行,在2008里面好像不能识别,必须use master,然后换行go,当时当时我修改您的代码,追加的时候加上换行符\r\n,但是这个换行符在SQL里面是不能被识别的,您有好的解决方法吗?
作者: 站长苏飞    时间: 2014-1-21 16:52
kunkun0921 发表于 2014-1-21 16:50
站长你好,这个类在SQL2008里面好像会有点问题,因为你所有的SQL都是使用StringBuilder追加起来的,所以Use ...

我的Sql2008都正常啊,你测试了吗?
作者: kunkun0921    时间: 2014-1-21 16:56
我测试过,那您测试下你的备份数据库的功能,我这里报出  'GO' 附近有语法错误,然后我见SQL语句提取出来之后再查询分析器里面直接执行也是不行的。麻烦你看下你那里测试时候成功。
我的SQLSERVER版本:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)   Jul  9 2008 14:43:34   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
作者: kunkun0921    时间: 2014-1-21 17:51
站长,怎么样试过吗?能解决这个问题吗?
作者: 西域情怀2010    时间: 2014-4-19 02:05
这个也是确实存在,我在创建数据库时也发现了。go与crearte连在一起了。gocreate。然后就报错。
作者: 西域情怀2010    时间: 2014-4-21 21:06
对这GO已经无语了,站长有办法没?

作者: 站长苏飞    时间: 2014-4-22 13:09
西域情怀2010 发表于 2014-4-19 02:05
这个也是确实存在,我在创建数据库时也发现了。go与crearte连在一起了。gocreate。然后就报错。

分开要,加空格或者是换行。
作者: hnl888    时间: 2014-9-12 09:50
真的不错,在实用了。
作者: gaaa1113    时间: 2015-12-14 11:57
这个类 " Go " 在SQL 语句不识别,会报错,@dbName 也会报错
作者: gaaa1113    时间: 2015-12-14 14:25
这个类不实用,很多地方都报错
作者: 竹林风    时间: 2018-12-30 22:34
顶一下




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4