方法一:
private string connStr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
/// <summary>
/// 用insert方法從文本文件中批量導入到資料庫表中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnInsert_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文檔|*.txt";
//如果用戶沒有選擇文件並確定則直接返回
if (ofd.ShowDialog() != true)
{
return;
}
//獲得文件名包括路徑
string fileName = ofd.FileName;
try
{
//定義一個開始時間
DateTime startTime = DateTime.Now;
//因為文件比較大,所有使用StreamReader的效率要比使用File.ReadLines高
using (StreamReader sr = new StreamReader(fileName, Encoding.Default))
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
while (!sr.EndOfStream)
{
string readStr = sr.ReadLine();//讀取一行數據
if (readStr.StartsWith("1"))//去掉標題行
{
string[] strs = readStr.Split(new char[] { '\t', '"' }, StringSplitOptions.RemoveEmptyEntries);//將讀取的字元串按"製表符/t「和」」「分割成數組
string startNum = strs[0];
string numArea = strs[1];
string numType = strs[2];
cmd.CommandText = "insert into T_PhoneInfo(FStartNum,FNumArea,FNumType) values(@startNum,@numArea,@numType)";
cmd.Parameters.Clear();//清除上一次的參數
cmd.Parameters.Add(new SqlParameter("@startNum", startNum));
cmd.Parameters.Add(new SqlParameter("@numArea", numArea));
cmd.Parameters.Add(new SqlParameter("@numType", numType));
cmd.ExecuteNonQuery();
}
}
}
}
}
//結束時間-開始時間=總共花費的時間
TimeSpan ts = DateTime.Now - startTime;
MessageBox.Show("導入數據成功!共花費時間:" + ts.ToString());
}
catch (IOException ex)
{
MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
方法二:
private void btnSqlBulkCopy_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文檔|*.txt";
//如果用戶沒有選擇文件並確定則直接返回
if (ofd.ShowDialog() != true)
{
return;
}
//獲得文件名包括路徑
string fileName = ofd.FileName;
try
{
//定義一個開始時間
DateTime startTime = DateTime.Now;
//創建內存臨時數據表來存儲從文本文件中讀取出來的數據
using (DataTable table = new DataTable())
{
//為數據表創建相對應的數據列
table.Columns.Add("startNum");
table.Columns.Add("numArea");
table.Columns.Add("numType");
//因為文件比較大,所有使用StreamReader的效率要比使用File.ReadLines高
using (StreamReader sr = new StreamReader(fileName, Encoding.Default))
{
while (!sr.EndOfStream)
{
DataRow dr = table.NewRow();//創建數據行
string readStr = sr.ReadLine();//讀取一行數據
if (readStr.StartsWith("1"))//去掉標題行
{
string[] strs = readStr.Split(new char[] { '\t', '"' }, StringSplitOptions.RemoveEmptyEntries);//將讀取的字元串按"製表符/t「和」」「分割成數組
string startNum = strs[0];
string numArea = strs[1];
string numType = strs[2];
//往對應的 行中添加數據
dr["startNum"] = startNum;
dr["numArea"] = numArea;
dr["numType"] = numType;
table.Rows.Add(dr);//將創建的數據行添加到table中
}
}
}
SqlBulkCopy bulkCopy = new SqlBulkCopy(connStr);
bulkCopy.DestinationTableName = "T_PhoneInfo";//設置資料庫中對象的表名
//設置數據表table和資料庫中表的列對應關系
bulkCopy.ColumnMappings.Add("startNum", "FStartNum");
bulkCopy.ColumnMappings.Add("numArea", "FNumArea");
bulkCopy.ColumnMappings.Add("numType", "FNumType");
bulkCopy.WriteToServer(table);//將數據表table復制到資料庫中
TimeSpan ts = DateTime.Now - startTime;
MessageBox.Show("共導入" +table.Rows.Count+ "條數據,總共花費時間:" + ts.ToString());
}
}
catch (IOException ex)
{
MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
『貳』 winform如何備份文件夾及文件夾里的所有東西比如從D盤備份到E盤,路徑自己選擇 求具體代碼~界面如下圖
做一個遞歸循環,不斷查找原路徑下的所有文件,然後復制到目標路徑(先創建路徑再復制文件)。
『叄』 C# Winform 安裝怎麼包含資料庫
C#的c/s的winform,資料庫為sql2k,
應用程序包括如下文件:
1.exe,1.dll,1.jpg,1.xml,donetsetup.exe以及資料庫文件1.mdf,1.ldf(或資料庫安裝文件1.sql)。
打包要求:
(1)自動檢測是否安裝donet環境,如沒安裝,則提示自動安裝。
(2)安裝時自動安裝資料庫(附加mdf或運行1.sql)。
(3)在安裝界面上能自定義一些安裝圖片或提示。
安裝項目:
六個子項:文件系統、注冊表、文件類型、用戶界面、自定義操作、啟動條件。
其中我們在打包過程中經常要用到的有文件系統、注冊表、用戶界面和自定義操作。
文件系統:向應用程序文件夾、用戶的程序菜單、用戶桌面下輸出項目文件(四種類型:文件夾、項目輸出、文件和程序集),還可以創建快捷方式(一般是放在桌面或程序菜單中)文件系統編輯器表示目標計算機上的文件系統,使用該工具可以指定應用程序文件安裝的位置。在大多數情況下,希望將應用程序文件放在 Application Folder 中或在 Application Folder 下創建的子文件夾中。安裝在目標計算機上以後,來自 Application Folder 的文件將位於 Program Files\Manufacturer\ProctName文件夾中,其中 Manufacturer 是安裝 Visual Studio 時使用的公司名,而 ProctName 是用於部署項目的名稱。可以在安裝項目的屬性窗口中重寫這兩個設置。
注冊表:可以向注冊表中插入鍵,在安裝應用程序的同時創建注冊表項。
用戶界面:系統自動提供一組在安裝期間顯示的默認對話框。根據正在構建的項目的類型,所提供的這組對話框有所不同。使用用戶界面編輯器,可以將對話框重新排序或刪除對話框。在編輯器中顯示的對話框樹包含兩部分:安裝與管理員安裝。安裝部分包括終端用戶運行安裝程序時顯示的對話框,而管理員安裝部分包含系統管理員將安裝程序上傳到某個網路位置時顯示的對話框。如果想構建一個沒有用戶界面的安裝,只需在對話框樹上刪除安裝部分中的所有對話框。或者,可以從一組可用的模板將對話框添加到安裝項目中。
啟動條件:使用啟動條件編輯器來定義成功運行安裝所必須滿足的條件。例如,可以檢查特定版本的操作系統。如果用戶嘗試在一個不滿足條件的系統上安裝,安裝將中止。還可以配置啟動條件來搜索目標計算機上的某個特定文件、注冊表項或組件。在開始安裝時,Windows Installer 執行搜索和條件評估,並按啟動條件編輯器中所示的順序執行。
自定義操作:自定義操作提供了一種在安裝結束時執行任務的機制。例如,您可能希望在安裝應用程序之前先配置好資料庫,此時您可以用自定義操作來完成資料庫的創建。自定義操作構建為單獨的 .dll 或 .exe 文件,然後使用自定義操作編輯器添加到項目中,其中這些操作與不同的安裝階段有關。自定義操作編輯器包括幾個單獨的文件夾,用於放置執行 Install、Commit、Rollback 或 Uninstall 任務的二進制文件。
InstallerClass屬性:如果添加的自定義操作是繼承自Installer類(注意放在哪個文件夾下就要重載哪個相應的方法),該屬性設為True,否則該屬性設為False(注意:為False時要指定.dll文件的入口——EntryPoint屬性)。
卸載:可以在安裝應用程序中提供一個卸載的快捷方式,藉助於系統提供的卸載程序msiexec.exe(在c:\windows\system32目錄下),並把安裝程序項目的ProctCode屬性值賦給快捷方式的Arguments屬性(注意:在屬性值前加/x)
安裝程序類:System.Configuration.Install命名空間下
Installer類有四個可以重載的方法,分別是Install,Commit,Rollback,Uninstall。
分別對應於自定義操作中的四個文件夾:安裝、提交、回滾、卸載。
資料庫安裝:
1、 附加資料庫
2、 執行創建資料庫的Sql語句
3、 完全備份的資料庫文件還原
可以將能生成資料庫的的文件(分離的資料庫文件、Sql腳本文件或完全備份文件)部署到應用程序文件夾下,然後在重載的Install方法里加入生成資料庫代碼(注意:生成資料庫的代碼應該在調用基類的Install方法後)。
資料庫的卸載:首先刪除資料庫,再調用基類的Uninstall方法刪除應用程序文件夾里的文件(順序不能亂)。
幾個特殊點:
1、 文件系統中的AlawaysCreate屬性:本屬性可以指定為False,然後Condition屬性為空時相當於AlawaysCreate屬性為True(Transitive屬性必須為True才計算Condition屬性的值)。Condition 屬性可用於向安裝程序添加條件邏輯,例如,僅為特定的操作系統版本安裝某個文件。它還可以與文件搜索、注冊表搜索或組件搜索一起使用,以在找不到指定項時使安裝過程終止。可以是 Windows Installer 條件或屬性,Property 屬性中包含的值,文件、注冊表或組件搜索中的 Name 屬性,也可以是使用邏輯運算符的上述語句的組合。
2、 創建快捷方式(在程序中創建,可以有作為附加任務,根據用戶的選擇情況,有選擇的創建):
添加引用:COM 選項卡並選擇 Windows Script Host Object Model
創建對象:創建一個 WshShell 的實例對象,接著通過該對象的 CreateShortcut 方法來創建 IWshShortcut 介面的實例對象,傳遞給 CreateShortcut 方法的參數是將要創建的快捷方式的完整路徑(包括該快捷方式的名字)。
設置屬性:TargetPath、WorkingDirectory、WindowStyle、Description、IconLocation
生成快捷方式:調用 IWshShortcut.Save 方法生成快捷方式文件。
『肆』 C#/winform程序打包部署 如何把SQL 資料庫 一起打包進去
打包資料庫到安裝程序中
方法1. 備份/恢復
先備份資料庫:
backup database 資料庫 to disk='c:\備份.bak'
將備份文件打包到安裝程序中.
在第一次運行程序的時候,進行資料庫恢復(或專門做一個系統配置的程序,來控制完成此工作)
restore database 資料庫 from disk='c:\備份.bak'
方法2. 分離/附加
先分離資料庫:
sp_detach_db '資料庫名'
將數據文件(.mdf)和日誌文件(.ldf)打包到安裝程序中
在第一次運行程序的時候,進行資料庫附加(或專門做一個系統配置的程序,來控制完成此工作)
sp_attach_db '資料庫名','數據文件名(.mdf)','日誌文件名(.ldf)'
方法3. 用資料庫腳本
生成資料庫腳本:
sql200企業管理器
--右鍵要導出的資料庫
--所有任務
--生成SQL腳本
--<常規>里選擇"生成全部對象腳本"","在腳本文件中包含說明性標題"選上
--<設置格式>里,將"包含擴展屬性",選上
--<選項>中,將"表腳本選項"中的內容全部選擇上
--<選項>中,"安全性選項"是決定是否要包含創建資料庫及用戶許可權等的設置,根據你的需要選擇
--其他所有的選項保持默認值
--然後確定,將其保存成一個.sql文件
生成數據腳本(借用第三方工具):
SQL Server 資料庫SQL腳本導出器1.0
(1) 支持所有數據類型(如binary,text,image)
(2) 支持表結構、索引、所有記錄到SQL腳本
(3) 支持資料庫、表的瀏覽
(4) SQL語句的編輯、執行
(5) 可備份資料庫、表結構、記錄
將腳本文件打包到安裝程序中.
在第一次運行程序的時候,執行腳本(或專門做一個系統配置的程序,來控制完成此工作),通過調用isql.exe文件完成.
exec master..xp_cmdshell 'isql /E /i".sql文件"'
也可以直接在程序中調用isql.exe文件.或直接將isql.exe文件集成到程序安裝包中
很明確的。
=================================================================
補充
=================================================================
你的sql文件里要先創建資料庫,然後再創建表,創建表的時候要往該資料庫里創建表。
『伍』 通過c# winform程序如何對資料庫進行備份和還原
給你個代碼 能看懂就行 看不懂再問我吧(1) 通過調用osql來執行資料庫腳本文件
(2) 通過把相應的腳本文件作為資源文件嵌入到項目中,然後通過ADO.net來執行
(3) 通過調用SQL Server的sp_attach_db的存儲過程來直接附加資料庫。2.1 通過調用osql來執行資料庫腳本文件 從上面的例子我們已經知道了如何傳遞值,那麼我們只要在項目文件中程序段中執行osql即可。
這里有一個問題就是從什麼地方找到資料庫的腳本文件。我們可以把腳本文件放到文件系統中,直接安裝到用戶機器上,並可以通過如下方法獲得到該文件的位置。
Assembly asm=Assembly.GetExecutingAssembly();
String setuppath=asm.Location;
這樣我們就可以知道腳本文件的位置了,下面的文件就是如何啟動osql程序了。我們可以通過如下的代碼段來完成:
Process sqlprocess=new Process(); sqlprocess.StartInfo.FileName="osql.exe";
sqlprocess.StartInfo.Arguments=String.Format("-U {0} -P {1} -S {2} -i {3}",this.uid,this.pwd,this.serverip,this.spath); //uid 為用戶名,pwd為密碼,serverip為目標伺服器的ip,spath為資料庫腳本所在的路徑
sqlprocess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
sqlprocess.Start();
sqlprocess.WaitForExit(); //等待程序執行
sqlprocess.Close();
從上面可以知道,該方法必須要求安裝程序的客戶機以及安裝好了SQL Server才能使用(osql為安裝了SQL Server後提供的命令行下的程序).同時在實際的測試過程中,我們發現如果對於用戶在安裝程序是選擇帶有空格的路徑,如;C:\program files\yourappliaction\時,安裝失敗。這個是一個比較嚴重的問題。2.2 通過把腳本文件作為資源文件載入 從前面的討論中我們可以看到,直接使用ADO.net執行時比較麻煩,需要一句句執行,如果使用腳本,資料庫中生成的腳本中有」GO」命令,在ADO.net中執行時會出問題。因此,根據對資料庫安裝腳本的分析,我們可以採用如下替代方案。
在資料庫的安裝過程中,無外乎如下幾個部分:
(1) 創建資料庫
(2) 創建表
(3) 創建試圖或者存儲過程
並且這三個部分是有先後順序的,順序不能顛倒,但是每個過程中沒有順序關系。在測試過程中我們發現可以在一條語句中創建多個表或者多個存儲過程。也就是說,我們可以把執行過程按照上面的順序執行就行了。並且我們把資料庫腳本作為資源文件嵌入,只要調入執行就可以了,這樣就達到了簡化創建一條條命令的過程。
獲得資源文件代碼如下:
Assembly Asm=Assembly.GetExecutingAssembly();
StreamReader str;
str=new StreamReader(Asm.GetManifestResourceStream(Asm.GetName().Name+"."+filename))// filename為你需要摘入的資源文件。作為資源文件時,只要把文件導入到您的項目中,並且把生成操作改為嵌入的資源即可。
這里我們是直接獲得了該文件的文件流,因此直接把該流中的內容讀入即可。
我們可以通過如下操作完成:
(1) 建立一個資料庫的鏈接,創建資料庫. 比如: connectionstring=」server=127.0.0.1,uid=sa,pwd=pwd」;
(2) 重新創建一個資料庫鏈接,該鏈接指向創建的資料庫。connectionstring=」server=127.0.0.1,uid=sa,pwd=pwd,database=yourdatabase」;
(3) 在新的鏈接中執行創建數據表和數據存儲過程的代碼即可。需要注意的是:不要在你的腳本中有GO命名,其他命令都可以直接執行。
該方法的好處在於: 可以不要求安裝的目標機上有SQL Server,也不存在因為文件路徑中有空格的問題而倒是安裝程序失敗。當然,如果您的資料庫為Oracle或者DB2等,您也可以採用類似的方法來實現。2.3 通過sp_attach_db來創建資料庫通過上面的討論我們已經很清楚如何安裝資料庫了。在安裝資料庫的過程中,我們除了可以通過資料庫腳本來創建資料庫之外,我們也可以通過SQL Server的系統存儲過程sp_attach_db來附加資料庫。
這里我們解決兩個問題即可:
(1) 確定資料庫文件(.mdf和.ldf)的位置。
(2) 執行存儲過程。對於問題1我們可以借鑒安裝數據的第一種方法,即把.mdf和.ldf通過文件系統安裝到目標機上,然後通過
Assembly asm=Assembly.GetExecutingAssembly();
String setuppath=asm.Location;
獲得文件的路徑。最後通過調用sp_attach_db 加上相應的參數即可完成。
需要注意的是: 該方法也只能針對資料庫安裝在本機的情況下進行安裝。