0

我正在尝试将数据批量插入 SQL Server Express 数据库。从 Windows XP 命令提示符执行 bcp 时,出现以下错误:

C:\temp>bcp in -T -f -S

开始复制...
SQLState = S1000,NativeError = 0
错误 = [Microsoft][SQL Native Client]在 BCP 数据文件中遇到意外的 EOF

0 行已复制。
网络数据包大小(字节):4096
时钟时间(毫秒)总计:4391

因此,EOF 存在问题。如何使用 Perl 或 Python 将正确的 EOF 字符附加到此文件?

4

3 回答 3

3

Unexpected EOF 意味着 bcp 读取器在期望更多数据时发现了 EOF。此 EOF 可以是:

(1) 实际的物理文件结尾(没有更多字节要读取)。这意味着您的数据格式错误。检查文件末尾附近是否有不完整的记录。

或者

(2) 在您所在的 Windows 上,以文本模式读取文件的程序尊重通过 MS-DOS 从 CP/M 继承的关于 Ctrl-Z(又名 ^Z aka \'x1A' aka SUB aka SUBSTITUTE)的古老约定从任何文件读取时的文件结束标记,而不仅仅是终端。这包括 Python——行为由 C 标准库决定。检查数据中的“\x1A”。

更新以清晰的方式回复评论:

在记事本++中,您可以通过查看/显示符号/显示所有字符使其显示不寻常的字符。您可以通过 Ctrl-F 进行搜索,在 Find What 框中键入 \x1a,然后在 Search 面板中选择 Extended 单选按钮。

或者你可以用一点 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?砰!

于 2010-03-03T14:08:18.903 回答
3

EOF 是文件结束。可能发生的是文件不完整;该软件需要数据,但现在没有数据了。

在以下情况下会发生此类事情:

  • 导出中断(转储时退出转储软件)
  • 复制转储文件时中止复制
  • 转储期间磁盘已满

这些东西。

顺便说一句,虽然 EOF 通常只是文件的结尾,但确实存在 EOF 字符。这是因为终端(命令行)输入并不像文件那样真正结束,但有时需要将 EOF 传递给这样的实用程序。我不认为它用于真实文件,至少不表示文件结束。文件系统非常清楚文件何时结束,它不需要指示器来找出它。

编辑 从 John Machin 提供的评论中无耻地复制

它可能(无意地)在真实文件中发生。它所需要的只是 (1) 数据输入用户误按 Ctrl-Z,屏幕上什么也看不到,按预期的 Shift-Z,然后继续; (2) 验证软件(例如,由公司总裁的侄子编写) 它很乐意在文本字段中接受 Ctrl-anykey 并且您的数据库中有一个小炸弹,只是在等待某人对平面文件产生查询。

于 2010-03-03T13:44:38.267 回答
1

这不是缺少 EOF 的问题,而是存在 EOF 且 bcp 不希望出现的问题。

我不是 bcp 工具专家,但您的数据文件格式似乎存在问题。

于 2010-03-03T13:39:17.643 回答