我正在尝试将数据批量插入SQL Server express数据库。从Windows XP命令提示符执行bcp时,我收到以下错误:
C:\temp>bcp in -T -f -S Starting copy... SQLState = S1000, NativeError = 0 Error = [Microsoft][SQL Native Client]Unexpected EOF encountered in BCP data-file 0 rows copied. Network packet size (bytes): 4096 Clock Time (ms.) Total : 4391
因此,EOF存在问题。如何使用Perl或Python将正确的EOF字符附加到此文件?
答案 0 :(得分:3)
EOF是文件结束。可能发生的是文件不完整;该软件需要数据,但没有任何数据可用。
这些事情发生在:
这些事情。
顺便说一下,虽然EOF通常只是文件的结尾,但确实存在EOF字符。这是因为终端(命令行)输入并不像文件那样真正结束,但有时需要将EOF传递给这样的实用程序。我不认为它在真实文件中使用,至少不表示文件结束。文件系统在文件结束时非常清楚,它不需要指示器来查找文件。
编辑 从John Machin提供的评论中无耻地复制
它可以在(实际上)在真实文件中发生。它所需要的只是(1)一个数据输入用户错误地输入Ctrl-Z,屏幕上什么也看不到,输入预定的Shift-Z,继续前进和(2)验证软件(例如公司总裁的侄子写的) )在文本字段中愉快地接受Ctrl-anykey,并且您的数据库中有一个小炸弹,只是等待有人对平面文件进行查询。
答案 1 :(得分:3)
意外的EOF意味着bcp阅读器在期待更多数据时发现了EOF。这个EOF可以是:
(1)实际的物理文件结束(不再需要读取的字节数)。这意味着您的数据格式错误。检查文件末尾附近是否有不完整的记录。
OR
(2)在Windows上,你在哪里,以文本模式读取文件的程序遵守从CP-M通过MS-DOS继承的古老约定关于Ctrl-Z(又名^ Z又名'x1A'又名SUB aka SUBSTITUTE)作为从ANY文件读取时的文件结束标记,而不仅仅是终端。这包括Python - 行为由C stdlib决定。检查数据中的“\ x1A”。
更新以清晰易读的方式回复评论:
在Notepad ++中,您可以通过执行查看/显示符号/显示所有字符来显示异常字符。您可以通过执行Ctrl-F搜索,在“查找内容”框中键入\ x1a,然后在“搜索”面板中选择“扩展”单选按钮。
或者你可以用一点点Python得到第一个Ctrl-Z的行号:
bytes = open('bcp.dat', 'rb').read()
zpos = bytes.find('\x1a')
# if zpos is -1, no Ctrl-Z in file
print 1 + bytes[:zpos].count('\r\n')
创建.dat的地方并不重要。无意的Ctrl-Z可能发生在任何操作系统上创建的文件中的任何位置。它是作为重要的文本文件读取的地方 - Windows?砰!
答案 2 :(得分:1)
这不是缺少EOF的问题,但是有了EOF,而bcp并不期望这样做。
我不是bcp工具专家,但看起来数据文件格式存在问题。