SQL 服务器没有 return table 的所有列
SQL Server does not return all columns of a table
我有一个旧应用程序(使用 Visual C++ 6.0 构建)使用 MFC 和 RecordSets 使用 SQL ODBC 驱动程序访问 SQL Server 2016。该代码使用大量 MFC 函数来动态检索有关要访问的 table 的信息。打开 ColumnSet 时完成以下步骤。
...
SQLColumns(...);
AllocAndCacheFieldInfo();
AllocRowset();
MoveNext();
m_bBOF = m_bEOF;
...
在 MoveNext() 之后 m_bEOF 的值为真。但是下面的代码应该是错误的 运行 正确地检索了 table 列。
此(旧)代码运行与 MS Access 数据库和 Postgres 数据库配合得很好。所以我认为我的代码应该没问题。现在我会考虑配置数据库或 ODBC 驱动程序。但是:使用 MS Access link 到 SQL 数据库 table 使用相同的数据源工作正常。所有 table 都已成功列出。这意味着数据库工作正常,数据源也工作正常。
现在我有点困惑。我该怎么做才能让我的代码正常工作?我检查了 MFC 函数的 MSDN 站点,但没有找到任何更新代码的提示。
你们对我有什么帮助吗?我真的很感激。如果您需要更多信息,我会 post 提供。
亲切的问候
我使用 SQL 探查器找出任何差异,并得到了这些结果。
我的代码:
exec [MyDatabase].[sys].sp_columns_100 N'MyTable',N'sys',N'MyDatabase',NULL,@fUsePattern=1
MS 访问:
exec [sys].sp_columns_100 N'MyTable',N'dbo',NULL,NULL,@fUsePattern=1
所以我更改了 SQLColumns() 的参数以仅提供 table 名称,不再提供数据库和所有者。
旧代码:
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.
我有一个旧应用程序(使用 Visual C++ 6.0 构建)使用 MFC 和 RecordSets 使用 SQL ODBC 驱动程序访问 SQL Server 2016。该代码使用大量 MFC 函数来动态检索有关要访问的 table 的信息。打开 ColumnSet 时完成以下步骤。
...
SQLColumns(...);
AllocAndCacheFieldInfo();
AllocRowset();
MoveNext();
m_bBOF = m_bEOF;
...
在 MoveNext() 之后 m_bEOF 的值为真。但是下面的代码应该是错误的 运行 正确地检索了 table 列。
此(旧)代码运行与 MS Access 数据库和 Postgres 数据库配合得很好。所以我认为我的代码应该没问题。现在我会考虑配置数据库或 ODBC 驱动程序。但是:使用 MS Access link 到 SQL 数据库 table 使用相同的数据源工作正常。所有 table 都已成功列出。这意味着数据库工作正常,数据源也工作正常。
现在我有点困惑。我该怎么做才能让我的代码正常工作?我检查了 MFC 函数的 MSDN 站点,但没有找到任何更新代码的提示。
你们对我有什么帮助吗?我真的很感激。如果您需要更多信息,我会 post 提供。
亲切的问候
我使用 SQL 探查器找出任何差异,并得到了这些结果。
我的代码:
exec [MyDatabase].[sys].sp_columns_100 N'MyTable',N'sys',N'MyDatabase',NULL,@fUsePattern=1
MS 访问:
exec [sys].sp_columns_100 N'MyTable',N'dbo',NULL,NULL,@fUsePattern=1
所以我更改了 SQLColumns() 的参数以仅提供 table 名称,不再提供数据库和所有者。
旧代码:
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.