【问题标题】:How to Determine the Size of MSADO Command Parameters如何确定 MSADO 命令参数的大小
【发布时间】:2010-05-27 17:41:02
【问题描述】:

我是 MS ADO 的新手,并试图了解如何设置由创建的命令参数的大小

command.CreateParameter (Name, Type, Direction, Size, Value)

documentation 表示如下:

尺寸
可选。一个 Long 值 指定最大长度 字符中的参数值或 字节。

...

如果你指定一个可变长度的数据 在 Type 参数中键入,您必须 传递一个 Size 参数或设置 Parameter 对象的 Size 属性 在将其附加到参数之前 收藏;否则,错误 发生。

1.) 固定大小的参数应该传递什么?是“不在乎”吗?

我对找到的示例 here 有点困惑,其中他们将 adInteger 参数的 size 设置为 3,而 Value 设置为 VT_I2 类型的变体

pPrmByRoyalty->Type = adInteger;
pPrmByRoyalty->Size = 3;
pPrmByRoyalty->Direction = adParamInput;
pPrmByRoyalty->Value = vtroyal;

VT_I2 意味着两个字节。 tagVARIANT 结构是 16 个字节。他们是如何降落在三个上的?我看到 adInteger 的枚举值恰好是 3,但我怀疑这只是巧合。

因此,为固定大小的参数传递什么有点令人困惑。我正在与之合作的团队总是将 sizeof(int) 传递给 adInteger,并且它似乎有效。对吗?

现在,对于“可变长度”参数:文档指示我们传递“最大长度......以字符或字节为单位”。

2.) 对于 adVarChar,传递数据库中定义的最大宽度是否足够?

3.) Wide 类型(例如 adVarWChar)呢?是字符还是字节?

4.) 可以包含固定长度或可变长度数据的 adVariant 怎么样?

5.) 数组在这里发挥作用吗? (我们不将它们作为参数传递,只是好奇)

欢迎任何参考或个人见解。

【问题讨论】:

  • 很久没用这个接口了,不过我相信我用sizeof(type)来做固定大小的args。我怀疑这个库实际上会丢弃大小,所以你可能会在那里放任何值。无论宽/窄,我都会传递字符串的字符数。它更安全,如果你错了,你会通过数据截断而不是隐藏在深堆栈下的莫名其妙的插入失败来发现。

标签: c++ visual-c++ parameters ado


【解决方案1】:

1) size 对于固定长度参数是可选的,所以你可以传递 vtMissing (comutil.h)。顺便说一句,我的 adInteger 大小(连接到 SQL Server)是 4,类型是 VT_I4,VT_I2 是大小 2,adSmallInt。

2) 我猜应该可以。提醒采用数据库中定义的参数的最大宽度,而不是您与之比较的任何表列。该大小可能用于分配,因此您必须确保该大小足够大,以便可能填充的任何值都适合。

3) 可能是字符。

关于 4 和 5,我不知道在哪种情况下需要将 adVariant 或数组传递给数据库引擎。

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2014-01-07
    • 2011-08-11
    • 2014-04-17
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多