需要用到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