我有一个旧的应用程序(使用Visual C ++ 6.0构建),使用MFC和RecordSets使用SQL ODBC驱动程序访问SQL Server 2016。该代码使用许多MFC函数来动态检索有关要访问的表的信息。打开ColumnSet时,完成以下步骤。
...
SQLColumns(...);
AllocAndCacheFieldInfo();
AllocRowset();
MoveNext();
m_bBOF = m_bEOF;
...
在MoveNext()之后,m_bEOF的值为true。但是,以下代码在检索表列的情况下正常运行应该是错误的。
此(旧)代码与MS Access数据库和Postgres数据库一起运行良好。所以我认为我的代码应该没问题。现在我会考虑配置数据库或ODBC驱动程序。但是:使用MS Access使用相同的数据源链接到SQL数据库表工作正常。所有表都已成功列出。这意味着数据库工作正常,数据源也正常工作。
现在我有点困惑。我的代码工作正常,我该怎么办?我检查了MSDN站点的MFC函数,但没有找到任何更新代码的提示。
你们对我有什么帮助吗?我真的很感激。如果您需要更多信息,我会发布。
亲切的问候
答案 0 :(得分:0)
我使用SQL分析器找出任何差异,我得到了这些结果。
我的代码:
exec [MyDatabase].[sys].sp_columns_100 N'MyTable',N'sys',N'MyDatabase',NULL,@fUsePattern=1
MS Access:
exec [sys].sp_columns_100 N'MyTable',N'dbo',NULL,NULL,@fUsePattern=1
所以我将SQLColumns()的参数更改为仅提供表名,而不再提供数据库和所有者。
旧代码:
SQLColumns(m_hstmt,
(UCHAR FAR *)(const char*)m_strQualifierParam,
SQL_NTS,
(UCHAR FAR *)(const char*)m_strOwnerParam,
SQL_NTS,
(UCHAR FAR *)(const char*)m_strTableNameParam,
SQL_NTS,
NULL,
SQL_NTS)
新代码:
SQLColumns(m_hstmt,
(UCHAR FAR *)NULL,
SQL_NTS,
(UCHAR FAR *)NULL,
SQL_NTS,
(UCHAR FAR *)(const char*)m_strTableNameParam,
SQL_NTS,
NULL,
SQL_NTS)
现在,当使用我的新代码时,探查器结果如下:
exec [sys].sp_columns_100 N'MyTable',NULL,NULL,NULL,@fUsePattern=1
它有效。它仍适用于MS Access和PostgreSQL。