【问题标题】:OLEDB Jet 4.0 SQL Character LimitOLEDB Jet 4.0 SQL 字符限制
【发布时间】:2012-08-06 22:40:15
【问题描述】:

我正在尝试为 SDF(空格分隔文件)生成行。我正在使用具有扩展属性 DBASEIV 的 OLEDB 适配器从 DBASE IV DBF 文件创建这些行,以获取数据。填充后我的数据列输出为 425 个字符,我将其放入 VB.NET 中的 datagridview 中以显示它。

但是,当我运行查询时,虽然它似乎正确执行,但结果字段限制为 256 个字符。我正在阅读的最长的单个字段是 35 个字符,我正在返回一个包含 2 个字段、条形码和 SDF 行的数据集。据我了解,OLEDB Jet 4.0 尝试根据前 8 行猜测类型,但是由于数据列的所有行长度相同(425 个字符),我不明白为什么它选择较小的字段类型。我认为这是因为我的字段是使用字符串连接生成的。我在这个问题的底部包含了可怕的 SQL。所以我的问题是如何获得完整的 425 字符输出?或者有什么方法可以将我自己的字段的数据类型指定为备忘录?

SELECT scan, 
RIGHT('0000000000000' + trim(cstr(scan)), 13) + 
LEFT(trim(cstr(name)) + '                                   ', 35) + 
LEFT(trim(cstr(name)) + '                ', 16) + 
'    ' + 
'             ' + 
'      ' + 
'1   ' + 
'0.00     ' + 
'0.00     ' + 
'1' + 
'0.00 ' + 
'0.01     ' + 
'0.00     ' + 
'F' + 
'2' + 
'0.00   ' + 
'0.00   ' + 
'   ' + 
'  ' + 
'  ' +
'SALS' + 
'    ' + 
'    ' +
LEFT(trim(cstr(plof)) + '             ', 13) + 
'             ' + 
'             ' + 
'0.00     ' + 
'0.00     ' + 
'0.00     ' + 
'F' + 
'T' + 
'001' + 
'    ' + 
'T' + 
'01' + 
'    ' + 
'        ' + 
'  ' + 
'    ' + 
'F' + 
'F' + 
'        ' + 
'        ' + 
'0   ' + 
'0.00     ' + 
'             ' + 
'0   ' + 
'0.00     ' + 
'0.00   ' + 
'0.00   ' + 
'0.00   ' + 
'1    ' + 
'1    ' + 
'1    ' + 
'0.00  ' + 
'0.00  ' + 
'0.00  ' + 
'0.00 ' + 
'0.00 ' + 
'0.00 ' + 
'                ' + 
'                ' + 
'  '
as STTEMPLINE
from salus where cstr(scan) in (select distinct cstr(scan) from nonscan)

提前感谢您的帮助。

【问题讨论】:

    标签: sql oledb custom-fields


    【解决方案1】:

    这是一个已知问题,即根据前几行中的数据猜测数据类型。

    看这篇文章...

    Load Excel sheet into DataTable but only the first 256 chars per cell are imported,

    此外,有关 OLEDB 如何处理混合数据类型的说明,请参阅这篇文章...

    http://social.msdn.microsoft.com/Forums/pl-PL/csharplanguage/thread/0404d003-5bfb-44f9-8e6b-aebdfce24875

    【讨论】:

    • 啊,我以为我已经介绍过了,我的每一行都是相同的长度。从代码中可以看出,每一行只有一列是导入数据列和默认值的混合列,最长的输入列只有 35 个字符,但所有结果表行都是 425 个字符,因此读取每一行仍然无济于事,因为所有行都超过了限制,它必须对从查询生成的结果列执行不同的操作,而不是直接导入。基本上我正在尝试从 DBF 文件创建一个固定长度的记录文件。
    • 对不起,我想我读你的问题很快,但不够彻底。您是否曾经为 name 或 scan 设置过任何空值或纯空格值?这是我能想到的唯一可能会影响这一点的事情。也许一开始有一些空行?无论如何,如果是我,我只需选择名称和扫描值,然后在 VB 或 C# 代码中进行所有这些字符串连接,而不是在 select 语句中。在 OLEDB 加载数据之后而不是在查询期间操作数据应该相当简单。
    • 嗯,不,没有空格,我们用 0 将 SCAN 填充到 13 位数字,所以 SCAN 始终为 0000000000000 - 99999999999999。我想在 SQL 中执行此操作的原因是我编写了一个工具,它允许我通过提供连接字符串和查询,几乎可以对任何数据文件进行操作。几乎每次我们得到一个新客户时,我都需要做这样的事情,但是输入文件总是不同的,能够只做一个快速的 SQL 来创建我的数据文件比每次都必须编写一个新程序要好得多,到目前为止,我们有超过 100 个不必要的程序。
    • 问题是每个供应商都有自己的数据文件格式,缺少很多信息,但每个文件都缺少不同的信息。使用我的工具,可以快速复制完整的默认值列表,然后仅替换供应商为其提供数据的字段名称,从而在最坏的情况下在大约 10 分钟内生成可导入的数据! (当然是在稍微清理一下文件,删除废话等之后。)这意味着支持部门甚至可以使用我的工具,而无需求助于开发人员。
    • 目前我只需将其从中间拆分为两个输出字段,然后将它们从数据网格复制到记事本 ++ 并用另一个“,”替换所有制表符,就可以让它工作。但是这个问题仍然很重要,因为我输出的文件是我们从许多来源获取数据更改到系统中的主要方式,我的工具将允许我们编写脚本以从几乎任何只需要一个标准的数据源轻松创建我们需要的内容为我们所有的客户编译程序,简化部署、调整、动态导入等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2023-03-19
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多