2013-08-16 111 views
1

我有2種形式,首先收集數據源,數據庫名稱,用戶名和密碼等細節。第二種形式收集要執行的sql腳本文件和要連接到的數據庫名稱。c#執行sql腳本

我想要實現的是我應該能夠在所選數據庫中執行sql腳本文件。

在第二形式中使用的代碼是這樣的:

private void comboBox1_TextChanged(object sender, EventArgs e) 
{ 
string sel = comboBox1.SelectedItem.ToString(); //Here "sel" is the database selected 
if (sel == "master") 
{ 
    comboBox2.Items.Clear(); 
    //Selects a default file 
    DirectoryInfo dinfo = new DirectoryInfo(@"D:\Testpgm"); 
    FileInfo[] Files = dinfo.GetFiles("master.sql", SearchOption.AllDirectories); 
    foreach (FileInfo file in Files) 
    { 
    comboBox2.Items.Add(file.Name); 
    } 
} 
else 
{ 
    comboBox2.Items.Clear(); 
    //Selects a default file 
    DirectoryInfo dinfo = new DirectoryInfo(@"D:\Testpgm"); 
    FileInfo[] Files = dinfo.GetFiles("dbscript.sql", SearchOption.AllDirectories); 
    foreach (FileInfo file in Files) 
    { 
    comboBox2.Items.Add(file.Name); 
    } 
} 
} 

而在組合框2中使用的代碼是:

private void comboBox2_TextChanged(object sender, EventArgs e) 
{ 
string textsel = comboBox2.SelectedItem.ToString(); //textsel is used to select the sql file selected 
if (textsel == "master.sql") 
{ 
    richTextBox1.Clear(); 
    //Read the selected sql file and display it in richtextbox 
    System.IO.StreamReader myFile = new System.IO.StreamReader(@"D:\Testpgm\master.sql"); 
    string textentry = myFile.ReadToEnd(); 
    richTextBox1.AppendText(textentry); 
} 
else 
{ 
    richTextBox1.Clear(); 
    //Read the selected sql file and display it in richtextbox 
System.IO.StreamReader myFile = new System.IO.StreamReader(@"D:\Testpgm\dbscript.sql"); 
    string textentry = myFile.ReadToEnd(); 
    richTextBox1.AppendText(textentry); 
} 
} 

現在,我要連接到哪個我所選擇的數據庫在組合框1中,然後通過單擊按鈕,優化包含在組合框2中選擇的sql文件中的sql腳本。

這可能嗎?我怎樣才能做到這一點?

任何評論都將是很有益的,並感激..

回答

3

使用

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

你可以做如下

SqlConnection conn = new SqlConnection(sqlConnectionString); 
Server server = new Server(new ServerConnection(conn)); 
server.ConnectionContext.ExecuteNonQuery(script); 
0

這可能嗎?我怎樣才能做到這一點?

如果你有數據庫和腳本文件執行,那麼是的,這是可能的。

首先,您需要獲取所選數據庫的連接字符串並建立連接。然後你可以使用SMO對象來執行你的批量查詢。

string connectionString = "YourConnectionString"; 
//make a sql connection 
using (var sqlConnection = new SqlConnection(connectionString)) 
    { 
     var serverConnection = new ServerConnection(sqlConnection); 
     var server = new Server(serverConnection); 
     server.ConnectionContext.ExecuteNonQuery(textentry); 
    } 

注意:您應該考慮使用正常的查詢,如果您還沒有批statments執行。正如你可以使用smo對象進入許多問題

+0

但腳本會在選定的數據庫中執行嗎?因爲一些腳本不能在master數據庫中執行。我有兩個腳本一個用於master數據庫,另一個用於其他數據庫。如果我選​​擇master數據庫,它應該在master數據庫中執行。如果我選擇了其他的,那麼它應該在我選擇的數據庫中執行。通過上面的代碼,這是否可能? –

+0

@VysakhVenugopal你需要連接到你選擇的數據庫。根據選定的數據庫構建連接字符串 – Ehsan

+0

我對所有數據庫都有相同的連接字符串。我有一個憑證登錄master.I通常用於腳本執行。所以,在這裏我也會使用相同的,但是需要在組合框1中指定數據庫時執行腳本。 –