C# 建數sqlserver據庫程序 用winform運行SQL腳本創建數據庫

需要用到2個引用:

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;

路徑大概是:C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies

只要安裝了SQL2008就行,具體百度。

http://download.csdn.net/download/qq_24554581/10040426

如果實在找不着,又沒積分下載的話,用ADO.NET分段吧...

這是直接把sql腳本的語句掛到數據庫中運行,ADO.NET有很多限制,又因爲數據庫導出的腳本又基本中槍,所以只能乳此了。

首先,界面長這樣:

弄成這樣不難...隨便搞搞就行...就不放代碼了。

時間是爲了提示用戶程序沒掛掉,別亂點。。。

構建數據庫語句,目標字符串:

這是手動拼接的


CREATE DATABASE 數據庫名
ON
(
    NAME = '數據庫名_data',
    FILENAME = 'D:\SQL\數據庫名_data.mdf',
    SIZE = 5MB,
    MAXSIZE=5,
    FILEGROWTH = 20
)
LOG ON
(
    NAME = '數據庫名_log',
    FILENAME = 'D:\SQL\數據庫名_log.ldf',
    SIZE = 2MB,
    MAXSIZE=20,
    FILEGROWTH = 1MB
);
 

注意事項:
眼號啊,逗號啊,括號啊全都不能省

直接上代碼:

註釋已經說的很明白了,就不羅嗦了,按照代碼調整好界面控件的name屬性就能用了,

   ManualResetEvent ManualEvent;
        public string _SqlFile = Directory.GetCurrentDirectory();//獲取應用程序的當前工作目錄
        public MainForm()
        {
            InitializeComponent();
 
            //初始化界面
            try
            {
                if (string.IsNullOrWhiteSpace(DbHelp.ConnStr))
                {
                    MessageShow("未找到數據庫連接字符串", "初始化出錯", MessageBoxIcon.Question);
                    return;
                }
                String[] config = DbHelp.ConnStr.Split(';');
                Service.Text = config[0].Split('=')[1];
                DbName.Text = config[1].Split('=')[1];
                UserName.Text = config[2].Split('=')[1];
                Password.Text = config[3].Split('=')[1];
            }
            catch (Exception ex)
            {
                MessageShow(ex.Message, "獲取配置數據失敗", MessageBoxIcon.Stop);
                return;
            }
        }
 
        /// <summary>
        /// 安裝庫
        /// </summary>
        private void CreateDbBtn_Click(object sender, EventArgs e)
        {
            IsEnabled(false);
            ManualEvent = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem(ThreadCreate, ManualEvent);//由線程池管理
            msg.Visible = true;
            ManualEvent.WaitOne();//無限等待
            msg.Visible = false;
            ManualEvent = null;
            //IsEnabled(true);
        }
 
        /// <summary>
        /// 安裝庫線程
        /// </summary>
        private void ThreadCreate(object objEvent)
        {
            string masterstr = GetConnStr();//連接字符串
            if (string.IsNullOrWhiteSpace(masterstr))//判空
            {
                MessageShow("請填完整", "創建失敗", MessageBoxIcon.Information);
                return;
            }
            try
            {
                #region 檢查數據
                if (!TestConnDb(masterstr))//判斷
                {
                    MessageShow("數據庫已存在", "創建失敗", MessageBoxIcon.Warning);
                    return;
                }
                DirectoryInfo folder = new DirectoryInfo(_SqlFile);
                FileInfo[] fileInfos = folder.GetFiles("*.sql");//檢索所有文件
                if (fileInfos.Length != 1)//腳本判斷
                {
                    MessageShow("未找到或有多個數據庫腳本", "創建失敗", MessageBoxIcon.Warning);
                    return;
                }
                string Sqlpath = _SqlFile + @"\" + fileInfos[0].Name;//腳本物理路徑
                string dbname = DbName.Text.Trim();//數據庫名
                string sqlcon = masterstr.Replace(";database=master;", ";database=" + dbname + ";");//連接字符串
                string dbpath = DbPath.Text.Trim();//安裝路徑
                string sqlstr = SQLCreate(Sqlpath);//讀取數據庫腳本語句
                if (string.IsNullOrWhiteSpace(sqlstr))
                    return;
                #endregion
 
                #region 創建
                StringBuilder sb = new StringBuilder();//創建庫腳本
                sb.Append("CREATE DATABASE " + dbname + @" ON ");
                sb.Append("(NAME='" + dbname + @"_data',FILENAME='" + dbpath + @"\" + dbname);
                sb.Append(@"_data.mdf',size=3," + @"FILEGROWTH = 10%)");
                sb.Append(@"LOG ON(NAME='" + dbname + @"_log',FILENAME='" + dbpath + @"\" + dbname);
                sb.Append(@"_log.ldf',size=3," + @"FILEGROWTH = 10%);");
                if (!Directory.Exists(dbpath))//創建文件夾
                {
                    Directory.CreateDirectory(dbpath);
                }
                DbHelp.ExecNonQuery(sb.ToString(), masterstr);//創建庫
                DbHelp.SqlServer(sqlstr, sqlcon);//運行庫腳本
                //DbHelp.ExecNonQuery(sqlstr, sqlcon);
                #endregion
                //UpAppconfig("ConnectionString", sqlcon);
                //UpWebconfig("ConnectionString", sqlcon);
                MessageShow("創建成功", "創建數據庫", MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                LogFile(ex.Message);
                MessageShow(ex.Message, "創建失敗", MessageBoxIcon.Error);
            }
            finally
            {
                ((ManualResetEvent)objEvent).Set();//線程結束
            }
        }
 
        /// <summary>
        /// 拼接數據庫語句
        /// </summary>
        private string SQLCreate(string Sqlpath)
        {
            try
            {
                string sqlstr = string.Empty;
                using (FileStream fsr = new FileStream(Sqlpath, FileMode.Open, FileAccess.Read))//讀
                {
                    StreamReader sr = new StreamReader(fsr, Encoding.Default);
                    sqlstr = sr.ReadToEnd();//將腳本原有數據全部讀出
                    sr.Close();
                }
                //判斷
                CompareInfo Compare = CultureInfo.InvariantCulture.CompareInfo;
                int cnum = Compare.IndexOf(sqlstr, "CREATE DATABASE ", CompareOptions.IgnoreCase);
                if (cnum >= 0)
                {
                    MessageShow("請先把腳本中的創建和USE GO語句刪除", "數據庫腳本異常", MessageBoxIcon.Warning);
                    return "";
                }
                return sqlstr;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 
        /// <summary>
        /// 測試連接
        /// </summary>
        private void TestDbBtn_Click(object sender, EventArgs e)
        {
            IsEnabled(false);
            ManualEvent = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem(ThreadTest, ManualEvent);//由線程池管理
            msg.Visible = true;
            ManualEvent.WaitOne();//無限等待
            msg.Visible = false;
            ManualEvent = null;
            //IsEnabled(true);
        }
 
        /// <summary>
        /// 測試連接線程
        /// </summary>
        private void ThreadTest(object objEvent)
        {
            string connstr = GetConnStr();
            try
            {
                if (!string.IsNullOrWhiteSpace(connstr))
                {
                    if (TestConnDb(connstr))
                    {
                        MessageShow("可以開始創建數據庫", "測試成功", MessageBoxIcon.Asterisk);
                    }
                    else
                        MessageShow("數據庫重名", "測試失敗", MessageBoxIcon.Warning);
                }
            }
            catch (Exception ex)
            {
                MessageShow(ex.Message, "獲取數據庫實例失敗", MessageBoxIcon.Error);
            }
            finally
            {
                ((ManualResetEvent)objEvent).Set();//線程結束
            }
        }
 
        /// <summary>
        /// 判斷是否能連接數據庫和重名
        /// </summary>
        private bool TestConnDb(string connstr)
        {
            try
            {
                StringBuilder DBlist = new StringBuilder();
                DataTable dt = DbHelp.Query("select name from master..sysdatabases", connstr).Tables[0];//獲取所有庫
                foreach (DataRow row in dt.Rows)
                {
                    DBlist.Append(row["name"].ToString() + "\r\n");
                }
                string dbname = DbName.Text.Trim();
                if (DBlist.ToString().IndexOf(dbname) <= 0 && !(dbname.Equals("master", StringComparison.OrdinalIgnoreCase)))//重名判斷
                {
                    return true;
                }
                else
                    return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 
        /// <summary>
        /// 獲取連接字符串
        /// </summary>
        private string GetConnStr()
        {
            string service = Service.Text.Trim();
            string dabane = DbName.Text.Trim();
            string username = UserName.Text.Trim();
            string password = Password.Text.Trim();
            if (string.IsNullOrWhiteSpace(service) || string.IsNullOrWhiteSpace(dabane)
              || string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
            {
                MessageShow("請將信息填完整", "操作停止", MessageBoxIcon.Warning);
                return "";
            }
            return "server=" + service + ";database=master;uid=" + username + ";pwd=" + password;
        }
 
        /// <summary>
        /// 是否能操作控件
        /// </summary>
        private void IsEnabled(bool istrue)
        {
            if (istrue)
            {
                Invoke((Action)(() =>
                {
                    //Enabled = true;
                    TestDbBtn.Enabled = true;
                    CreateDbBtn.Enabled = true;
                    DbPath.Enabled = true;
                    UserName.Enabled = true;
                    Service.Enabled = true;
                    Password.Enabled = true;
                    DbName.Enabled = true;
                    DbPath.Enabled = true;
                    PathBtn.Enabled = true;
                }));
            }
            else
            {
                Invoke((Action)(() =>
                {
                    //Enabled = false;
                    TestDbBtn.Enabled = false;
                    CreateDbBtn.Enabled = false;
                    DbPath.Enabled = false;
                    UserName.Enabled = false;
                    Service.Enabled = false;
                    Password.Enabled = false;
                    DbName.Enabled = false;
                    DbPath.Enabled = false;
                    PathBtn.Enabled = false;
                }));
            }
        }
 
        /// <summary>
        /// 日誌文件
        /// </summary>
        public void LogFile(string Error)
        {
            string logfile = Application.StartupPath + @"\" + DateTime.Now.ToString("yyyy-MM-dd") + " Log.txt";
            try
            {
                if (File.Exists(logfile))
                {
                    FileStream fs = new FileStream(logfile, FileMode.Open, FileAccess.Write);//存在
                    StreamWriter sw = new StreamWriter(fs);
                    long fl = fs.Length;//獲取文本字符長度
                    fs.Seek(fl, SeekOrigin.Begin);//定位開始位置
                    sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + Error);//開始寫入值
                    sw.Close();
                    fs.Close();
                }
                else
                {
                    FileStream fs = new FileStream(logfile, FileMode.Create, FileAccess.Write);//不存在
                    StreamWriter sw = new StreamWriter(fs);
                    long fl = fs.Length;//獲取文本字符長度
                    fs.Seek(fl, SeekOrigin.End);//定位末尾位置
                    sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + Error);//開始寫入值
                    sw.Close();
                    fs.Close();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 
        /// <summary>
        /// 選擇數據庫安裝路徑
        /// </summary>
        private void PathBtn_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog path = new FolderBrowserDialog();
            path.ShowDialog();
            if (path.SelectedPath.Trim() == "")
                return;
            DbPath.Text = path.SelectedPath;
        }
 
        /// <summary>
        /// 彈窗提示
        /// </summary>
        private void MessageShow(string msg, string title, MessageBoxIcon boxIcon)
        {
            //爲防阻塞,多線程彈出提示框
            new Thread(() => { MessageBox.Show(msg, title, MessageBoxButtons.OK, boxIcon); IsEnabled(true); }).Start();
            //MessageBox.Show(msg, title, MessageBoxButtons.OK, boxIcon);
        }
 
        /// <summary>
        /// 時間
        /// </summary>
        private void TipTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            
            TimeLabel.Text= DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            TimeLabel.Update();
        }
 

數據庫操作代碼:

用了個靜態類來放

  public static string ConnStr = ConfigurationManager.AppSettings["ConnectionString"];
 
        /// <summary>
        /// 執行一條SQL語句,返回影響行數,可選庫
        /// </summary>
        public static int ExecNonQuery(string strSql, string con)
        {
            try
            {
                int iResult = 0;
                using (SqlConnection cn = new SqlConnection(con))
                {
                    SqlCommand sqlCmd = new SqlCommand();
                    sqlCmd.Connection = cn;
                    sqlCmd.CommandTimeout = 300;
                    sqlCmd.CommandText = strSql;
                    cn.Open();
                    iResult = sqlCmd.ExecuteNonQuery();
                }
                return iResult;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 
        /// <summary>
        /// 執行查詢語句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查詢語句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString, string Conn)
        {
            using (SqlConnection connection = new SqlConnection(Conn))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
                    command.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
 
        /// <summary>
        /// 運行sql腳本文件
        /// </summary>
        public static void SqlServer(string sqlstr, string con)
        {
            try
            {
                SqlConnection sqlcon = new SqlConnection(con);
                Server server = new Server(new ServerConnection(sqlcon));
                server.ConnectionContext.ExecuteNonQuery(sqlstr);
            }
            catch (Exception ex)
            {
                throw ex;
            }
 
        }
 

 

可以加上進度條,我做的進度條是個水貨,沒監聽線程進行情況,就自個在那跑,

99%卡住後等待運行完關掉,就不貼出來了。。。

end.

————————————————
版權聲明:本文爲CSDN博主「浮光-掠影」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_24554581/article/details/78352728

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章