Code Bye

C# 异步调用 cmd.exe 执行bcp命令的问题拜托拜托

本人写了一个程序,需要大范围导出导入数据到SQL Sever中,数据量大约是400w条,上网搜了好久,最后决定使用BCP 命令。bcp命令是这么写的:
BCP  “SQL 语句” queryout  文件路径.txt  -c -k -t”\t” -r”\n” -S “服务器名” -U”用户名” -P”密码”
在cmd上直接调用木有问题,生成的也是全部的;从程序中运行,当数据量小于5w时也木有问题,
但数据量达到百万时,问题出现了
生成的txt文件只能到8M程序就停了!实际应该生成400M多的呢!
然后将本人本人的程序关闭后,,,,,它本人又把文件给生成出来了,全部的!400M多的!
本人希望达到的效果是全部生成出来,把这个不知道是什么的bug改掉~找了好久,结果,
本人用的是backgroundwoker后台调用的,然后再dowork中调用的代理,beginInvoke开始,endInvoke获取返回值,对这块不怎么太熟,想说有没有可能是内存大小限制的问题,上网搜没搜到相关的,只好讨教高手们了!
这是相关代码:
public void DoWork(object sender, DoWorkEventArgs e)
{
DialogResult dr = MessageBox.Show(“能否开始导出数据?”, “提示”, MessageBoxButtons.OKCancel);
exportOutFunc eif = new exportOutFunc(this.exportOut);
IAsyncResult IRIn = eif.BeginInvoke(dr, null, eif);
bool result = eif.EndInvoke(IRIn);
}
private bool exportOut(DialogResult dr)
{
//第二种方法
string  temp = exportData.BCPexportOut(exportData.getOutSQL(), data1_FileFolder, “txt”);
return true;
}
private string BCPexportOut(string sql,string filepath,string filetype)
{
string path = String.Format(filepath + getDBTableName() + “.” + fileType);//获取生成文件路径
string execute = “BCP  “” + sql + “” queryout “+ path +” -c -k -t”\t” -r”\n” -S “”+ sever +”” -U””+userId+”” -P””+password+”””;
string cmdInfo = cmdcon.Execute(execute);//在cmd中执行语句的函数,还是那一套,就不贴了
return cmdInfo;
}
麻烦啦~~
解决方案

30

你这里贴的程序设计,基本上都是多余的东西。没有表明只要的内容。
你搞了一个  bool result = eif.EndInvoke(IRIn); 代码在这里阻塞当前线程,是什么意义呢?在 exportOu 方法中调用 eif.EndInvoke(IRIn) 语句就可以了,而根本不需要阻塞。
由于是真正的异步回调编程,那么这里的 DoWork 也就可以删除掉了。直接放到你的主程序中去 MsgBox对话,然后直接 BeginInvoke 注册一个异步回调 exportOut 就行了。
由于 DoWork 没用、删掉,那么你的整个 backgroundwoker 也就没用了。
最后,你的这个不过是“先显示一个 MsgBox 对话框,然后启动 BCP 程序”的简单的两行代码的程序,假如它垮了,不代表着 BCP 就不往文件里写数据了。你就算是用写字板程序去打开数据文件,也不过是看到的是当前文件的一部分数据,原因是后台还在“一股脑、一股脑”地追加文件数据。
实际上你这个程序代码 cmdcon.Execute(…) 只是启动 BCP 进程而已。你没有等待 BCP 进程结束。不要纠结一堆什么“线程”之类的无关的东西,应该看到该看的地方。

20

LZ说的对!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 异步调用 cmd.exe 执行bcp命令的问题拜托拜托