使用 ODBC 从 SQL 访问数据时遇到问题

发布于 2024-10-31 19:09:38 字数 833 浏览 2 评论 0原文

我正在使用 MFC 使用 ODBC 从 SQL 数据源检索数据。
我在获取表中“id”字段以外的数据字段时遇到问题。
在随后的迭代中,发现除“id”之外的字段的 varValue 为空。

请指导我访问表中的所有数据字段,

Table data: 

     **id**(nchar)     name(varchar)     age(varchar)

0    **11**                 john            24
1    **22**                 troy            25
2    **33**                 bill            21


only ids are fetched.


    CDatabase db;
    db.OpenEx( NULL, CDatabase::forceOdbcDialog );
    CRecordset rs( &db );
    rs.Open( CRecordset::forwardOnly,
             _T( "SELECT * FROM REPDB.dbo.fellas" ) );

CDBVariant varValue;

short nFields = rs.GetODBCFieldCount( );
while( !rs.IsEOF( ) )
{
   for( short index = 0; index < nFields; index++ )
   {
      rs.GetFieldValue( index, varValue,DEFAULT_FIELD_TYPE );
   }
}

谢谢。

I am using MFC to retrieve data from a SQL data source using ODBC.
I am having problem in getting data fields other than the "id" field in the table.
The varValue is found to be null for the fields other than "id", in sunsequent iterations.

Please guide me in accessing all the data fields in the table

Table data: 

     **id**(nchar)     name(varchar)     age(varchar)

0    **11**                 john            24
1    **22**                 troy            25
2    **33**                 bill            21


only ids are fetched.


    CDatabase db;
    db.OpenEx( NULL, CDatabase::forceOdbcDialog );
    CRecordset rs( &db );
    rs.Open( CRecordset::forwardOnly,
             _T( "SELECT * FROM REPDB.dbo.fellas" ) );

CDBVariant varValue;

short nFields = rs.GetODBCFieldCount( );
while( !rs.IsEOF( ) )
{
   for( short index = 0; index < nFields; index++ )
   {
      rs.GetFieldValue( index, varValue,DEFAULT_FIELD_TYPE );
   }
}

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别想她 2024-11-07 19:09:38

这是猜测:问题可能出在 DEFAULT_FIELD_TYPE 上。使用普通的 CRecordset,ODBC API 可能无法确定字段的类型。您可以尝试省略该参数并查看是否获得所有字段的字符数组表示形式,或者使用 SQL_C_CHAR 而不是 DEFAULT_FIELD_TYPE,因为所有字段都是字符串类型。

您还缺少在 while 循环末尾对 rs.MoveNext 的调用。

另一种可能性是使用游标库:请参阅 GetFieldValue MSDN 页面上的此注释:

注意:如果声明一个记录集对象
不从 CRecordset 派生,执行
没有 ODBC 游标库
已加载。游标库需要
该记录集至少有一个
绑定列;但是,当您使用
直接CRecordset,没有一个
列已绑定。会员
函数 CDatabase::OpenEx 和
CDatabase::Open 控制是否
将加载光标库。

This is a guess: the issue may be with DEFAULT_FIELD_TYPE. Using a plain CRecordset, the ODBC API may not be able to determine the type of the field. You can try omitting that parameter and see if you get char array representations of all of the fields, or use SQL_C_CHAR instead of DEFAULT_FIELD_TYPE, since all of your fields are string types.

You are also missing a call to rs.MoveNext at the end of the while loop.

Another possibility is the use of the cursor library: see this note on the GetFieldValue MSDN page:

Note: If you declare a recordset object
without deriving from CRecordset, do
not have the ODBC Cursor Library
loaded. The cursor library requires
that the recordset have at least one
bound column; however, when you use
CRecordset directly, none of the
columns are bound. The member
functions CDatabase::OpenEx and
CDatabase::Open control whether the
cursor library will be loaded.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文