SQL資料庫的腳本 我已做好.是建立一個存盤程序
原來我都 是直接打開資料庫執行.
現在我想做成EXE,直接讓用戶在本地執行 就直接執行SQL腳本.我不用把腳本直接發給用戶.
我現在手頭上就有這樣一個EXE,但是反編譯不了.
我現在想法是 將資源中的檔案存出來,然后執行,執行完再洗掉. 這種做法有些傻
但報如圖錯誤

類似下面這個檔案

uj5u.com熱心網友回復:
請問下面這種方法如何讀取資源中的SQL腳本?string sqlpath = txt_Path.Text;
string sql1 = @"-S " + sysset.sqlserver + " -d " + sysset.dbname + " -i \"" +sqlpath + "\"";
// 呼叫sqlcmd
// -u sa ,
ProcessStartInfo info = new ProcessStartInfo("sqlcmd", sql1);
//禁用OS Shell
info.UseShellExecute = false;
//禁止彈出新視窗
info.CreateNoWindow = true;
//隱藏windows style
info.WindowStyle = ProcessWindowStyle.Hidden;
//標準輸出
info.RedirectStandardOutput = true;
Process proc = new Process();
proc.StartInfo = info;
//啟動行程
proc.Start();
MessageBox.Show("SQL升級完成!", "提示");
}
uj5u.com熱心網友回復:
將SQL 腳本寫在資源里,怪怪的(我是第一次看到)建議可寫在button 事件里,這樣有問題也可debug
uj5u.com熱心網友回復:
可以的。以前用批處理執行過資料庫備份。完全沒問題uj5u.com熱心網友回復:
第一步先把 SQL 檔案 復制到 專案中,右鍵屬性設定 為嵌入的資源。然后用如下代碼基本就可以了。using System.IO;
using System.Reflection;
using System.Text;
namespace RockfallDbScriptResources
{
/// <summary>
/// 落石監測資料庫腳本資源管理器
/// </summary>
public static class RockfallDbScriptManager
{
/// <summary>
/// 資料庫名
/// </summary>
public static string DatabaseName { get; set; }
/// <summary>
/// 獲取資料庫腳本資源的結果
/// </summary>
/// <param name="resourceTypeFullName">資源型別的全名稱</param>
/// <returns></returns>
private static string GetDbScriptResource(string resourceTypeFullName)
{
string resourceResult = null;
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceTypeFullName);
if (stream != null)
{
using (StreamReader sr = new StreamReader(stream, Encoding.Default))
{
resourceResult = sr.ReadToEnd().Replace("#_$_DBNAME_$_#", DatabaseName);
}
}
return resourceResult;
}
public static string GetDropDatabaseCommandText()
{
return GetDbScriptResource("RockfallDbScriptResources.DropDatabase.sql");
}
public static string GetCreateDatabaseCommandText()
{
return GetDbScriptResource("RockfallDbScriptResources.Atian_Taiwan_Demo_CreateDB.sql");
}
public static string GetCreateTableCommandText()
{
return GetDbScriptResource("RockfallDbScriptResources.Atian_Taiwan_Demo_CreateTable.sql");
}
public static string[] GetCreateViewCommandText()
{
return GetDbScriptResource("RockfallDbScriptResources.Atian_Taiwan_Demo_CreateView.sql").Replace("\r\nGO\r\n","?").Split('?');//處理SQL中的常量值
}
public static string[] GetCreateTriggerCommandText()
{
return GetDbScriptResource("RockfallDbScriptResources.Atian_Taiwan_Demo_CreateTrigger.sql").Replace("\r\nGO\r\n", "?").Split('?');//處理SQL中的常量值
}
public static string[] GetCreatePagingCommandText()
{
return GetDbScriptResource("RockfallDbScriptResources.SQLSERVER-PROCEDURE_COMMONPAGING_V1.1.sql").Replace("\r\nGO\r\n", "?").Split('?');//處理SQL中的常量值
}
public static string GetInitializeCommandText()
{
return GetDbScriptResource("RockfallDbScriptResources.Atian_Taiwan_Demo_Init data.sql");
}
}
}
說明:資料庫 和 表 是可以批量的。 視圖 ,觸發器 ,存盤程序,每次只能執行一個,你可以用 GO 分開,然后 替換成 多個陣列,然后回圈執行即可,也可以直接 寫在不通的 SQL 檔案中,注意一點 不能包含 GO 關鍵字,ADO.NET 是不允許有這個的。你可以用 replace 替換掉。
uj5u.com熱心網友回復:
還有一種方法呼叫 OSQL 行程。不過這個會收到環境影響。uj5u.com熱心網友回復:
