是否可以从 C# 创建 SQL Server 本机文件(如 BCP 本机格式)
-
05-07-2019 - |
题
我们正在升级一个已有 15 年历史的代码库,需要创建一些本机 BCP 格式的数据文件。
在新系统中,我们理想地希望利用 C# DataTable 对象中的数据来创建本机 BCP 格式的数据文件。
这可以做到吗?如果可以,最好的方法是什么?
解决方案
不,它无法完成,我们发现创建本机BCP文件的唯一方法是使用SQL Server。如果有人开发或找到另一种方式,请在此发布!
其他提示
如果它是旧的,那么BCP部分可能看起来非常像Sybase BCP部分。在Sybase中,我开始查看客户端库,并使用BCP API提供代码示例。相应API的CTLib和/或Java jar。对于Microsoft,可能存在涉及BCP的本机C或基本API的类似部分。您可能不需要API的通信部分,只需逐个记录准备和读/写文件。
如果没有这样的话,那么我会考虑使用手工制作的FMT文件和原始BCP程序生成/使用的文本类数据文件的非原生格式。
有一种类似的方法可以做到这一点,但你必须引用SQLDMO,它将像BCP一样创建一个等效的格式。通过使用SQLDMO的BulkCopy对象,您可以执行您要查找的内容。这是vbscript中使用SQLDMO库的例程的链接,此处。
希望这有帮助, 最好的祝福, 汤姆。
您可以将数据表中的数据放入 SQL Server 上的暂存区吗?如果是这样,您可以生成 BCP 进程。
业务流程: http://msdn.microsoft.com/en-us/library/aa174646%28SQL.80%29.aspx
例如,我使用:
BCP Database.Schema.TableName OUT FileName.Ext -S ServerName -T -n
开关:
- -S 用于服务器
- -T 用于可信连接
- -n 表示本机格式
编辑+新想法:
如果您有权访问填充数据表的查询,则可以使用 BCP 或 SQLDMO 来导出本机格式文件。以下查询使用 QUERYOUT 开关而不是 OUT 开关,因为它们包含内联查询
从视图中导出特定列:
BCP "SELECT Column1, Column2 FROM MyViewName" QUERYOUT FileName.Ext -S ServerName -T -n
从 JOIN 导出特定列:
BCP "SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 on Table1.Column33 = Table2.Column33" QUERYOUT FileName.Ext -S ServerName -T -n
假设你只修复了目标表中的列类型,没有任何可空,没有unicode字符串,并且愿意处理字节序,那么原生文件格式只是类型的字节。
我最近通过逐字节写入一个登台文件并使用BCP来批量导入c#脚本中的数据
bcp destTable in model.raw -T -S _serverName -n
model.raw是按字节顺序创建的:
fileBytes = new byte[theLength * 4]; // * 4 bytes per element for int and float
var offset =0;
foreach (var element in outputDimensions)
{
// fastCopy is a faster and "Unsafe" equivelent of BlockCopy , faster because it doesn't create an intermediate byte array.
//Buffer.BlockCopy(BitConverter.GetBytes(profileid), 0, fileBytes, offset, 4);
Utilities.fastCopy(profileid, fileBytes, offset);
offset += 4;
Utilities.fastCopy(element.index, fileBytes, offset);
offset += 4;
for (var i = 0; i < TimeSlices; i++, offset += 4)
{
float target = GetDataForTime(i,...);
Utilities.fastCopy(target, fileBytes, offset);
}
}
FileStream dataWriter.Write(fileBytes , 0, byteArray.Length);