123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525 |
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Newtonsoft.Json;
- namespace SQLHelper
- {
- /// <summary>
- /// 连接参数
- /// </summary>
- [Serializable]
- public sealed class ConnectionParameters
- {
- #region 连接串
- // 无端口号;
- private const string _msdbconnect = "Data Source={0};Initial Catalog={1};User ID={2};Password={3}";
- private const string _msdbconnect_master = "Data Source={0};Initial Catalog=master;User ID={1};Password={2}";
- // 有端口号;
- private const string _msdbconnect_port = "Data Source={0},{1};Initial Catalog={2};User ID={3};Password={4}";
- private const string _msdbconnect_master_port = "Data Source={0},{1};Initial Catalog=master;User ID={2};Password={3}";
- // windows信任连接;
- private const string _msdbconnect_trusted_master = "server={0};database=master;Trusted_Connection=SSPI";
- #endregion
- #region 私有变量;
- /// <summary>
- /// 数据库连接串;
- /// </summary>
- private string connectionString = "";
- private string masterConnectionString = "";
- private string trustedConnectionString = "";
- private string databaseServer = "127.0.0.1";
- private string databaseAccount = "sa";
- private string databasePassword = "";
- private string databaseName = "";
- private uint databasePort = 0;
- private uint maxPoolSize = 100;
- private uint minPoolSize = 5;
- private uint connectTimeout = 3000;
- #endregion
- #region 公共属性;
- /// <summary>
- /// 数据库服务器;
- /// </summary>
- public string DatabaseServer
- {
- get { return databaseServer; }
- set
- {
- databaseServer = value;
- if (IsSetParameters) InitConnectParameters();
- }
- }
- /// <summary>
- /// 数据库账号;
- /// </summary>
- public string DatabaseAccount
- {
- get { return databaseAccount; }
- set
- {
- databaseAccount = value;
- if (IsSetParameters) InitConnectParameters();
- }
- }
- /// <summary>
- /// 数据库密码;
- /// </summary>
- public string DatabasePassword
- {
- get { return databasePassword; }
- set
- {
- databasePassword = value;
- if (IsSetParameters) InitConnectParameters();
- }
- }
- /// <summary>
- /// 数据库名称;
- /// </summary>
- public string DatabaseName
- {
- get { return databaseName; }
- set
- {
- databaseName = value;
- if (IsSetParameters) InitConnectParameters();
- }
- }
- /// <summary>
- /// 数据库端口号;
- /// </summary>
- public uint DatabasePort
- {
- get { return databasePort; }
- set
- {
- databasePort = value;
- if (IsSetParameters) InitConnectParameters();
- }
- }
- /// <summary>
- /// 池最大值;
- /// </summary>
- public uint MaxPoolSize { get; set; } = 100;
- /// <summary>
- /// 池最小值;
- /// </summary>
- public uint MinPoolSize { get; set; } = 5;
- /// <summary>
- /// 连接超时值;
- /// </summary>
- public uint ConnectTimeout { get; set; } = 3000;
- [JsonIgnore]
- /// <summary>
- /// 是否设置了数据库连接参数;
- /// </summary>
- public bool IsSetParameters { get; private set; } = false;
- [JsonIgnore]
- /// <summary>
- /// 数据库连接串;
- /// </summary>
- public string ConnectionString
- {
- get
- {
- if (IsSetParameters)
- return connectionString;
- else
- return "";
- }
- }
- [JsonIgnore]
- public string MasterConnectionString
- {
- get
- {
- if (IsSetParameters)
- return masterConnectionString;
- else
- return "";
- }
- }
- [JsonIgnore]
- public string TrustedConnectionString
- {
- get
- {
- if (IsSetParameters)
- return trustedConnectionString;
- else
- return "";
- }
- }
- #endregion
- public ConnectionParameters() { }
- public ConnectionParameters(string databaseServer, string databaseName, string databaseAccount, string databasePassword, uint databasePortNumber)
- {
- try
- {
- // 标记连接参数已设置;
- IsSetParameters = true;
- // 生成默认的连接串;
- this.connectionString = DatabasePort== 0
- ? string.Format(_msdbconnect, DatabaseServer, DatabaseName, DatabaseAccount, DatabasePassword)
- : string.Format(_msdbconnect_port, DatabaseServer, DatabasePort, DatabaseName, DatabaseAccount, DatabasePassword);
- this.masterConnectionString = DatabasePort == 0
- ? string.Format(_msdbconnect_master, DatabaseServer, DatabaseAccount, DatabasePassword)
- : string.Format(_msdbconnect_master_port, DatabaseServer, DatabasePort, DatabaseAccount, DatabasePassword);
- this.trustedConnectionString = string.Format(_msdbconnect_trusted_master, DatabaseServer);
- }
- catch
- {
- throw;
- }
- }
- public void InitConnectParameters()
- {
- try
- {
- // 标记连接参数已设置;
- IsSetParameters = true;
- // 生成默认的连接串;
- this.connectionString = DatabasePort == 0
- ? string.Format(_msdbconnect, DatabaseServer, DatabaseName, DatabaseAccount, DatabasePassword)
- : string.Format(_msdbconnect_port, DatabaseServer, DatabasePort, DatabaseName, DatabaseAccount, DatabasePassword);
- this.masterConnectionString = DatabasePort == 0
- ? string.Format(_msdbconnect_master, DatabaseServer, DatabaseAccount, DatabasePassword)
- : string.Format(_msdbconnect_master_port, DatabaseServer, DatabasePort, DatabaseAccount, DatabasePassword);
- this.trustedConnectionString = string.Format(_msdbconnect_trusted_master, DatabaseServer);
- }
- catch
- {
- throw;
- }
- }
- public void InitConnectParameters(
- string databaseServer,
- string databaseName,
- string databaseAccount,
- string databasePassword,
- uint databasePortNumber)
- {
- DatabaseServer = databaseServer;
- DatabaseName = databaseName;
- DatabaseAccount = databaseAccount;
- DatabasePassword = databasePassword;
- DatabasePort = databasePortNumber;
- // 标记连接参数已设置;
- IsSetParameters = true;
- try
- {
- // 生成默认的连接串;
- this.connectionString = DatabasePort == 0
- ? string.Format(_msdbconnect, DatabaseServer, DatabaseName, DatabaseAccount, DatabasePassword)
- : string.Format(_msdbconnect_port, DatabaseServer, DatabasePort, DatabaseName, DatabaseAccount, DatabasePassword);
- this.masterConnectionString = DatabasePort == 0
- ? string.Format(_msdbconnect_master, DatabaseServer, DatabaseAccount, DatabasePassword)
- : string.Format(_msdbconnect_master_port, DatabaseServer, DatabasePort, DatabaseAccount, DatabasePassword);
- this.trustedConnectionString = string.Format(_msdbconnect_trusted_master, DatabaseServer);
- }
- catch
- {
- throw;
- }
- }
- [Obsolete("this function unfinished")]
- /// <summary>
- /// 设置连接参数;(未完成)
- /// </summary>
- /// <param name="serverIp"></param>
- /// <param name="database"></param>
- /// <param name="account"></param>
- /// <param name="password"></param>
- /// <param name="port"></param>
- public void InitConnectParameters(
- string databaseServer,
- string databaseName,
- string databaseAccount,
- string databasePassword,
- uint databasePortNumber,
- uint maxPoolSize = 100,
- uint minPoolSize = 5,
- uint connectTimeout = 3000)
- {
- DatabaseServer = databaseServer;
- DatabaseName = databaseName;
- DatabaseAccount = databaseAccount;
- DatabasePassword = databasePassword;
- DatabasePort = databasePortNumber;
- MaxPoolSize = maxPoolSize;
- MinPoolSize = minPoolSize;
- ConnectTimeout = connectTimeout;
- // 标记连接参数已设置;
- IsSetParameters = true;
- try
- {
- // 生成默认的连接串;
- this.connectionString = DatabasePort == 0
- ? string.Format(_msdbconnect, DatabaseServer, DatabaseName, DatabaseAccount, DatabasePassword)
- : string.Format(_msdbconnect_port, DatabaseServer, DatabasePort, DatabaseName, DatabaseAccount, DatabasePassword);
- this.masterConnectionString = DatabasePort == 0
- ? string.Format(_msdbconnect_master, DatabaseServer, DatabaseAccount, DatabasePassword)
- : string.Format(_msdbconnect_master_port, DatabaseServer, DatabasePort, DatabaseAccount, DatabasePassword);
- this.trustedConnectionString = string.Format(_msdbconnect_trusted_master, DatabaseServer);
- }
- catch
- {
- throw;
- }
- }
- #region 特殊的SQL执行函数
- public bool CreateDatabaseUser(string userName, string password)
- {
- try
- {
- StringBuilder sqlScript = new StringBuilder();
- sqlScript.Append("IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'" + userName + "')\r\n");
- sqlScript.Append("DROP LOGIN [" + userName + "]\r\n");
- sqlScript.Append("CREATE LOGIN [" + userName + "] WITH PASSWORD=N'" + password + "', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON\r\n");
- sqlScript.Append("EXEC master..sp_addsrvrolemember @loginame = N'" + userName + "', @rolename = N'bulkadmin'\r\n");
- sqlScript.Append("EXEC master..sp_addsrvrolemember @loginame = N'" + userName + "', @rolename = N'dbcreator'\r\n");
- sqlScript.Append("EXEC master..sp_addsrvrolemember @loginame = N'" + userName + "', @rolename = N'diskadmin'\r\n");
- sqlScript.Append("EXEC master..sp_addsrvrolemember @loginame = N'" + userName + "', @rolename = N'processadmin'\r\n");
- sqlScript.Append("EXEC master..sp_addsrvrolemember @loginame = N'" + userName + "', @rolename = N'securityadmin'\r\n");
- sqlScript.Append("EXEC master..sp_addsrvrolemember @loginame = N'" + userName + "', @rolename = N'serveradmin'\r\n");
- sqlScript.Append("EXEC master..sp_addsrvrolemember @loginame = N'" + userName + "', @rolename = N'setupadmin'\r\n");
- sqlScript.Append("EXEC master..sp_addsrvrolemember @loginame = N'" + userName + "', @rolename = N'sysadmin'\r\n");
- SqlHelper.ExecuteNonQuery(this.MasterConnectionString, CommandType.Text, sqlScript.ToString());
- }
- catch (System.Data.SqlClient.SqlException ex)
- {
- return false;
- }
- return true;
- }
- public bool DeleteDatabaseUser(string userName)
- {
- try
- {
- System.Text.StringBuilder sqlScript = new System.Text.StringBuilder();
- sqlScript.Append("IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'" + userName + "')\r\n");
- sqlScript.Append("ALTER LOGIN [" + userName + "] DISABLE\r\n");
- sqlScript.Append("IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'" + userName + "')\r\n");
- sqlScript.Append("DROP LOGIN [" + userName + "]\r\n");
- SqlHelper.ExecuteNonQuery(this.MasterConnectionString, CommandType.Text, sqlScript.ToString());
- }
- catch (System.Data.SqlClient.SqlException e)
- {
- return false;
- }
- return true;
- }
- public bool ForcedDisconnect(string databaseName)
- {
- System.Text.StringBuilder RestoreSql = new System.Text.StringBuilder();
- RestoreSql.Append("/* 结束所有对当前数据库的连接 */\r\n");
- RestoreSql.Append("if exists(select 1 from sys.sysprocesses where dbid=db_id(@databaseName)) begin\r\n");
- RestoreSql.Append("declare #cs_spid cursor -- 声明游标\r\n");
- RestoreSql.Append("for\r\n");
- RestoreSql.Append("select #cs_spid=convert(varchar,spid) from sys.sysprocesses where dbid=db_id(@databaseName)\r\n");
- RestoreSql.Append("open #cs_spid\r\n");
- RestoreSql.Append("declare @spid varchar(20)\r\n");
- RestoreSql.Append("fetch next from #cs_spid into @spid -- 赋值并前进到下一条\r\n");
- RestoreSql.Append("while(@@fetch_status=0) begin -- 在fetch失败前执行\r\n");
- RestoreSql.Append("exec ('kill '+@spid) -- 结束对操作库的连接(exec执行SQL语句1)\r\n");
- RestoreSql.Append("fetch next from #cs_spid into @spid\r\n");
- RestoreSql.Append("end\r\n");
- RestoreSql.Append("close #cs_spid\r\n");
- RestoreSql.Append("deallocate #cs_spid -- 释放游标\r\n");
- RestoreSql.Append("end");
- List<System.Data.SqlClient.SqlParameter> parameterlist = new List<System.Data.SqlClient.SqlParameter>();
- parameterlist.Add(new System.Data.SqlClient.SqlParameter("@databaseName", databaseName));
- System.Data.SqlClient.SqlParameter[] parameters = parameterlist.ToArray();
- System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
- try
- {
- SqlHelper.ExecuteNonQuery(RestoreSql.ToString(), CommandType.Text, this.masterConnectionString, parameters);
- }
- catch
- {
- return false;
- }
- return true;
- }
- public bool IsDatabaseExists(string databaseName, out string dbFilePath)
- {
- List<System.Data.SqlClient.SqlParameter> parameterlist = new List<System.Data.SqlClient.SqlParameter>();
- parameterlist.Add(new System.Data.SqlClient.SqlParameter("@databaseName", databaseName));
- string sql = "select dbid,name,filename From sysdatabases WHERE NAME=@databaseName";
- System.Data.SqlClient.SqlParameter[] parameters = parameterlist.ToArray();
- // System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
- dbFilePath = "";
- try
- {
- System.Data.DataSet ds = SqlHelper.ExecuteDataset(this.MasterConnectionString, CommandType.Text, sql, parameters);
- if (ds.Tables[0].Rows.Count > 0)
- {
- dbFilePath = ds.Tables[0].Rows[0]["filename"].ToString();
- return true;
- }
- else
- {
- return false;
- }
- }
- catch
- {
- return false;
- }
- }
- public void DatabaseLogRecoveryMode(string databaseName, string mode = "SIMPLE")
- {
- string databasePath;
- if (IsDatabaseExists(databaseName, out databasePath))
- {
- List<System.Data.SqlClient.SqlParameter> parameterlist = new List<System.Data.SqlClient.SqlParameter>();
- parameterlist.Add(new System.Data.SqlClient.SqlParameter("@databaseName", databaseName));
- parameterlist.Add(new System.Data.SqlClient.SqlParameter("@SIMPLE", databaseName));
- string sql = "ALTER DATABASE @databaseName SET RECOVERY @SIMPLE ;";
- System.Data.SqlClient.SqlParameter[] parameters = parameterlist.ToArray();
- System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
- try
- {
- SqlHelper.ExecuteNonQuery(this.MasterConnectionString, CommandType.Text, sql.ToString(), parameters);
- }
- catch
- {
- }
- }
- }
- /// <summary>
- /// 分离数据库;
- /// 注:如果有外部连接了数据库, 是没办法分离的;
- /// </summary>
- /// <param name="databaseName"></param>
- /// <returns></returns>
- public bool DetachDatabase(string databaseName)
- {
- bool bl = false;
- string databasePath;
- if (IsDatabaseExists(databaseName, out databasePath))
- {
- List<System.Data.SqlClient.SqlParameter> parameterlist = new List<System.Data.SqlClient.SqlParameter>();
- parameterlist.Add(new System.Data.SqlClient.SqlParameter("@databaseName", databaseName));
- string sql = "EXEC master.dbo.sp_detach_db @dbname = @databaseName";
- System.Data.SqlClient.SqlParameter[] parameters = parameterlist.ToArray();
- System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
- try
- {
- ForcedDisconnect(databaseName);
- SqlHelper.ExecuteNonQuery(this.MasterConnectionString, CommandType.Text, sql.ToString(), parameters);
- if (!IsDatabaseExists(databaseName, out databasePath))
- {
- bl = true;
- }
- else
- {
- bl = false;
- }
- }
- catch (Exception e)
- {
- bl = false;
- }
- }
- return bl;
- }
- /// <summary>
- /// 附加数据库;
- /// </summary>
- /// <param name="databaseFilePath"></param>
- /// <param name="databaseLogsFilePath"></param>
- /// <param name="databaseName"></param>
- /// <returns></returns>
- public bool AttachDatabase(string databaseName, string databaseFilePath, string databaseLogsFilePath)
- {
- bool bl = false;
- string databasePath;
- if (!IsDatabaseExists(databaseName, out databasePath))
- {
- List<System.Data.SqlClient.SqlParameter> parameterlist = new List<System.Data.SqlClient.SqlParameter>();
- string sql = "CREATE DATABASE [" + databaseName + "] ON ( FILENAME ='" + databaseFilePath + "' ),( FILENAME ='" + databaseLogsFilePath + "' ) FOR ATTACH";
- System.Data.SqlClient.SqlParameter[] parameters = parameterlist.ToArray();
- System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
- try
- {
- SqlHelper.ExecuteNonQuery(this.MasterConnectionString, CommandType.Text, sql.ToString(), parameters);
- if (IsDatabaseExists(databaseName, out databasePath))
- {
- DatabaseLogRecoveryMode(databaseName);
- bl = true;
- }
- else
- {
- bl = false;
- }
- }
- catch (Exception e)
- {
- //e.Message;
- bl = false;
- }
- }
- return bl;
- }
- public bool EnableDatabaseUser(string userName, bool disable)
- {
- try
- {
- SqlHelper.ExecuteNonQuery(this.TrustedConnectionString, CommandType.Text, string.Format("alter login [{0}] {1}", userName, disable ? "DISABLE" : "ENABLE"));
- }
- catch
- {
- return false;
- }
- return true;
- }
- #endregion
- }
- }
|