/*
* 更新時(shí)間 :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數據操作幫助類(lèi),包括數據的創(chuàng )建,刪除,修改密碼等一系統列操作
/// </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>
///執行一個(gè)不需要返回值的SqlCommand命令,通過(guò)指定專(zhuān)用的連接字符串。
/// 使用參數數組形式提供參數列表
/// </summary>
/// <param name="connectionString">一個(gè)有效的數據庫連接字符串</param>
/// <param name="cmdType">SqlCommand命令類(lèi)型 (存儲過(guò)程, T-SQL語(yǔ)句, 等等。)</param>
/// <param name="cmdText">存儲過(guò)程的名字或者 T-SQL 語(yǔ)句</param>
/// <param name="commandParameters">以數組形式提供SqlCommand命令中用到的參數列表</param>
/// <returns>返回一個(gè)數值表示此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))
{
//通過(guò)PrePareCommand方法將參數逐個(gè)加入到SqlCommand的參數集合中
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
//清空SqlCommand中的參數列表
cmd.Parameters.Clear();
return val;
}
}
/// <summary>
///存儲過(guò)程專(zhuān)用
/// </summary>
/// <param name="cmdText">存儲過(guò)程的名字</param>
/// <param name="commandParameters">以數組形式提供SqlCommand命令中用到的參數列表</param>
/// <returns>返回一個(gè)數值表示此SqlCommand命令執行后影響的行數</returns>
public static int ExecteNonQueryProducts(string cmdText, params SqlParameter[] commandParameters)
{
return ExecteNonQuery(DBT_SqlHelper.connectionString, CommandType.StoredProcedure, cmdText, commandParameters);
}
/// <summary>
///Sql語(yǔ)句專(zhuān)用
/// </summary>
/// <param name="cmdText">T_Sql語(yǔ)句</param>
/// <param name="commandParameters">以數組形式提供SqlCommand命令中用到的參數列表</param>
/// <returns>返回一個(gè)數值表示此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">已經(jīng)存在的數據庫連接</param>
/// <param name="trans">數據庫事物處理</param>
/// <param name="cmdType">SqlCommand命令類(lèi)型 (存儲過(guò)程, T-SQL語(yǔ)句, 等等。)</param>
/// <param name="cmdText">Command text,T-SQL語(yǔ)句 例如 Select * from Products</param>
/// <param name="cmdParms">返回帶參數的命令</param>
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{
//判斷數據庫連接狀態(tài)
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>
/// 根據條件創(chuàng )建數據庫
/// </summary>
/// <param name="dbName">用于指定數據文件的邏輯名稱(chēng)</param>
/// <param name="dbFileName">指定數據文件的操作系統文件名。其后面的參數是創(chuàng )建數據文件時(shí)定義的物理文件的路徑名和文件名</param>
/// <param name="dbSize">指定數據文件的大小</param>
/// <param name="dbMaxSize">指定數據文件可以增長(cháng)到的最大大小</param>
/// <param name="dbFileGrowth">
/// 指定數據文件的增長(cháng)增量,其值不能超過(guò)maxsize設置。0表示不增長(cháng)。,默認值為MB。如果指定為%,
/// 則增量大小為發(fā)生時(shí)文件大小的指定百分比,如果沒(méi)有指定,默認值為10%。
/// </param>
/// <param name="logName">用于指定數據日志的邏輯名稱(chēng)</param>
/// <param name="logFileName">指定數據日志的操作系統文件名。其后面的參數是創(chuàng )建數據日志時(shí)定義的物理文件的路徑名和文件名</param>
/// <param name="logSize">指定數據日志的大小</param>
/// <param name="logMaxSize">指定數據日志可以增長(cháng)到的最大大小</param>
/// <param name="logFileGrowth">
/// 指定數據日志的增長(cháng)增量,其值不能超過(guò)maxsize設置。0表示不增長(cháng)。,默認值為MB。如果指定為%,
/// 則增量大小為發(fā)生時(shí)文件大小的指定百分比,如果沒(méi)有指定,默認值為10%。
/// </param>
/// <param name="isDeletedb">在創(chuàng )建數據庫是否刪除同名的現存數據庫</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 創(chuàng )建數據庫
//開(kāi)始創(chuàng )建數據并指定名稱(chēng)
dbSql.Append("CREATE DATABASE @dbName ON PRIMARY (");
//數據庫名
dbSql.Append("NAME='@ dbName" + "_data',");
//數據路經(jīng)
dbSql.Append("
FILENAME='@dbFileName', ");
//大小
dbSql.Append("
SIZE=@dbSize, ");
//最大值
dbSql.Append("MAXSIZE= @dbMaxSize,");
//增長(cháng)值
dbSql.Append("
FILEGROWTH=@dbFileGrowth)");
#endregion
#region 創(chuàng )建數據庫日志
//開(kāi)始創(chuàng )建日志文件
dbSql.Append("LOG ON (");
//日志文件名
dbSql.Append("
NAME='@logName" + "_log',");
//日志文件路經(jīng)
dbSql.Append("
FILENAME='@logFileName',");
//大小
dbSql.Append("
SIZE=@logSize,");
//最大值
dbSql.Append("
MAXSIZE=@logMaxSize,");
//增加值
dbSql.Append("
FILEGROWTH=@logFileGrowth ) GO");
#endregion
#region 開(kāi)始執行創(chuàng )建命令
//設置參數列表
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>
/// 刪除指定名稱(chēng)的數據庫文件以及日志文件
/// </summary>
/// <param name="dbName">數據庫名稱(chēng)</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 開(kāi)始執行命令
//設置參數列表
SqlParameter[] parameter = { new SqlParameter("@dbName", dbName) };
DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), parameter);
#endregion
}
/// <summary>
/// 備份數據庫
/// </summary>
/// <param name="dbName">數據庫文件名</param>
/// <param name="dbFileName">路經(jīng)包括盤(pán)符和文件名以及擴展名稱(chēng)一般為“_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 開(kāi)始執行命令
//設置參數列表
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">路經(jīng)包括盤(pán)符和文件名以及擴展名稱(chēng)一般為“_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 開(kāi)始執行命令
//設置參數列表
SqlParameter[] parameter =
{
new SqlParameter("@dbName", dbName),
new SqlParameter("@dbFileName", dbFileName)
};
DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
#endregion
}
/// <summary>
/// 附加數據庫文件
/// </summary>
/// <param name="newDbName">附加時(shí)的新名稱(chēng)可以是原名,也可以得新取一個(gè)新名稱(chēng)</param>
/// <param name="dbFileName">數據文件的路徑包括盤(pán)符和文件名以及擴展名</param>
/// <param name="logFileName">日志文件的路徑包括盤(pán)符和文件名以及擴展名</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 開(kāi)始執行命令
//設置參數列表
SqlParameter[] parameter =
{
new SqlParameter("@dbFileName", dbFileName),
new SqlParameter("@logFileName", logFileName)
};
DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
#endregion
}
/// <summary>
/// 分離數據庫文件
/// </summary>
/// <param name="dbName">數據庫名稱(chēng)</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 開(kāi)始執行命令
//設置參數列表
SqlParameter[] parameter = { new SqlParameter("@dbName", dbName) };
DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
#endregion
}
/// <summary>
/// 重新設置用戶(hù)的密碼
/// </summary>
/// <param name="newPassword">新密碼</param>
/// <param name="userName">登錄用戶(hù)名</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 開(kāi)始執行命令
//設置參數列表
SqlParameter[] parameter =
{
new SqlParameter("@newPassword", newPassword),
new SqlParameter("@userName", userName)
};
DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
#endregion
}
/// <summary>
/// 分離數據庫文件
/// </summary>
/// <param name="dbName">數據庫名稱(chēng)</param>
/// <param name="newPassword">新密碼</param>
/// <param name="userName">登錄用戶(hù)名</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 開(kāi)始執行命令
//設置參數列表
SqlParameter[] parameter =
{
new SqlParameter("@dbName",userName),
new SqlParameter("@userName", userName),
new SqlParameter("@passWord", passWord)
};
DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
#endregion
}
/// <summary>
/// 給指定數據的指定用戶(hù)授于本數據庫的所有操作權限
/// </summary>
/// <param name="dbName">數據庫名稱(chēng)</param>
/// <param name="userName">用戶(hù)名稱(chēng)</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 開(kāi)始執行命令
//設置參數列表
SqlParameter[] parameter =
{
new SqlParameter("@dbName",userName),
new SqlParameter("@userName", userName)
};
DBT_SqlHelper.ExecteNonQueryText(dbSql.ToString().Trim(), null);
#endregion
}
}
}