C# .NET Core调用BCP导入CSV到本地SQL Server出现0行复制问题
C#调用BCP导入CSV到SQL Server异常问题分析
前提说明:已提前在SQL Server的master库中创建了名为AzureBlob的空表,共2列,无存量数据,待导入的CSV文件为2列测试数据。
问题现象
原有代码运行后输出Starting Copy,提示0 rows copied,目标SQL表无数据写入。
问题原因
- BCP方向参数使用错误:
out是将SQL表数据导出到文件的参数,从CSV导入到SQL表需要使用in参数 - 数据库实例地址格式错误:
-S .\\参数不完整,本地默认实例直接写-S .即可,命名实例需要补全为-S .\\实例名(如-S .\\SQLEXPRESS) - 缺少分隔符指定:BCP默认使用制表符作为列分隔符,若CSV为逗号/空格分隔,需要显式指定分隔符参数
- 未跳过表头行:CSV第一行是表头,BCP默认从第一行开始导入,表头行字段类型和表不匹配会被丢弃
修复后的代码示例
static void Main(string[] args) { // 参数说明:in表示文件导入到表,-t , 指定逗号分隔,-F 2 跳过表头行 string strCmdText = "/C bcp master..AzureBlob in C:\\data\\blbTest.csv -S . -c -C RAW -T -t , -F 2"; Process process = new Process(); ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.FileName = "cmd.exe"; startInfo.Arguments = strCmdText; // 开启输出重定向方便排查错误 startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; startInfo.UseShellExecute = false; process.StartInfo = startInfo; process.Start(); // 读取运行日志便于排查 string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); Console.WriteLine(output); if(!string.IsNullOrEmpty(error)) Console.WriteLine("错误信息:"+error); process.WaitForExit(); process.Close(); process.Dispose(); }
额外排查要点
- 确认CSV文件路径正确,程序运行身份拥有该路径的读取权限、SQL库的写入权限
- 确认SQL表的字段顺序、数据类型和CSV列完全匹配,避免类型转换失败导致行被丢弃
- 若CSV列之间是多空格分隔,建议先预处理为逗号/制表符等统一分隔符后再执行导入
- 可以先在cmd窗口直接运行修改后的BCP命令验证导入逻辑正确,再放到C#代码中执行,降低排查复杂度
内容的提问来源于stack exchange,提问作者Auo
相关产品推荐
相关产品推荐

