用C#中实现的,调用CMD来执行BCP的代码
用c#中实现,调用cmd来执行bcp的代码,大家共享!
引用空间:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
string Conn = "data source=192.168.0.1;initial catalog=Test;user id=sa;password=1";
SqlConnection sqlConn = new SqlConnection(Conn);
SqlCommand cmd = new SqlCommand();
cmd.Connection = sqlConn;
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sqlConn.Open();
cmd.CommandText = "Select * from Files";
DataSet ds = new DataSet();
sda.Fill(ds);
if(ds.Tables[0].Rows.Count>0)
{
string BcpExec = "";
for(int i=0;i<ds.Tables[0].Rows.Count;i++)//循环取本地文件名
{
BcpExec = @"bcp Test..Data in D:\test\";
BcpExec += ds.Tables[0].Rows[i]["path"].ToString();
BcpExec += " -S192.168.0.1 -Usa -P1 -c -t,";//组合bcp命令
Response.Write(ExeCommand(BcpExec));//执行bcp命令并显示操作结果
}
}
}
/**//// <summary>
/// 执行Cmd命令
/// </summary>
/// <param name="commandText"></param>
/// <returns></returns>
public static string ExeCommand(string commandText)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
string strOutput = null;
try
{
p.Start();
p.StandardInput.WriteLine(commandText);
p.StandardInput.WriteLine("exit");
strOutput = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();
}
catch(Exception e)
{
strOutput = e.Message;
}
return strOutput;
}
加入参数 "/c " + 要执行的命令来执行一个dos命令
(/c代表执行参数指定的命令后关闭cmd.exe /k参数则不关闭cmd.exe)
2 {
3 //實例一個Process類,啟動一個獨立進程
4 Process p = new Process();
5
6 //Process類有一個StartInfo屬性,這個是ProcessStartInfo類,包括了一些屬性和方法,下面我們用到了他的幾個屬性:
7
8 p.StartInfo.FileName = "cmd.exe"; //設定程序名
9 p.StartInfo.Arguments = "/c " + command; //設定程式執行參數
10 p.StartInfo.UseShellExecute = false; //關閉Shell的使用
11 p.StartInfo.RedirectStandardInput = true; //重定向標準輸入
12 p.StartInfo.RedirectStandardOutput = true; //重定向標準輸出
13 p.StartInfo.RedirectStandardError = true; //重定向錯誤輸出
14 p.StartInfo.CreateNoWindow = true; //設置不顯示窗口
15
16 p.Start(); //啟動
17
18 //p.StandardInput.WriteLine(command); //也可以用這種方式輸入要執行的命令
19 //p.StandardInput.WriteLine("exit"); //不過要記得加上Exit要不然下一行程式執行的時候會當機
20
21 return p.StandardOutput.ReadToEnd(); //從輸出流取得命令執行結果
22
23 }
要将SQLServer中的资料导入导出,可以使用bcp.exe 。
Bcp.exe 程式为SQLServer提供的一个提供DOS的方式和SQLServer进行交互,进行导入导出资料动作。由于是SQLServer自带的工具,所以效能上还很好,测试过导入50W行的资料,效能很好。
格式说明:
Bcp.exe + 数据库名称 + ".." + 数据表名称 in 要导入资料的路径 + "-c -t, " + -U登录DB的用户名 -S服务器名称 -P密码 -R
参数说明:
-c使用char类型做为存储类型,没有前缀且以"\t"做为字段分割符,以"\n"做为行分割符。
-t,表示是用符号"," 为各个栏位的分割符号。
-U 登陆数据库的用户名称
-P 登陆数据的密码
-S 登陆数据库的IP
-R 表示使用本地区域及语言设定进行导入导出动作。
在C# 中只要将 调用Process的类就调用exe就可以了。
ProcessStartInfo psi = new ProcessStartInfo("d:\\test\\bcp.exe", "XXXX..XXXXX in d:\\test\\test_100000.log -c -t\",\" -Usa -P -S\"192.168.0.1\"");
Process proc = Process.Start(psi);
if (proc != null)
{
proc.WaitForExit();
this.ShowStatic(11, "End");
}
如果C# 写的调用程式所在的机器不包括SQLServer的话,可以找一台SQLServer 将里面的bcp.exe Copy 出来就OK了。对了,还需要一些别的文件要一起Copy出来
文件包括
Resources 文件夹\bcp.exe\sqlncli.dll 这3个就可以了。 如果程式的机器不让安装SQLServer, 这是一个很好的选择。
如果程序所在的机器可以安装SQLClient的话,又要导入大量的数据的话,也可以使用
BULK INSERT TABLE FROM '{0}' WITH (FIELDTERMINATOR = '^', ROWTERMINATOR = '\n', FIRSTROW = 1)
这个SQL。