Api SQLTables返回SQL\u NO\u数据

Api SQLTables返回SQL\u NO\u数据,api,odbc,Api,Odbc,以下代码: ret = SQLTables( m_hstmt, (SQLWCHAR *) SQL_ALL_CATALOGS, SQL_NTS, (SQLWCHAR *) SQL_ALL_SCHEMAS, SQL_NTS, (SQLWCHAR *) SQL_ALL_TABLE_TYPES, SQL_NTS, L"", SQL_NTS ); if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) { GetErrorM

以下代码:

ret = SQLTables( m_hstmt, (SQLWCHAR *) SQL_ALL_CATALOGS, SQL_NTS, (SQLWCHAR *) SQL_ALL_SCHEMAS, SQL_NTS, (SQLWCHAR *) SQL_ALL_TABLE_TYPES, SQL_NTS, L"", SQL_NTS );
if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
{
    GetErrorMessage( errorMsg, 1 );
    result = 1;
}
else
{
    for( ret = SQLFetch( m_hstmt ); ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO ); ret = SQLFetch( m_hstmt ) )
    {
        if( catalog[0].StrLen_or_Ind != SQL_NULL_DATA )
            catalogName = (SQLWCHAR *) catalog[0].TargetValuePtr;
        if( catalog[1].StrLen_or_Ind != SQL_NULL_DATA )
            schemaName = (SQLWCHAR *) catalog[1].TargetValuePtr;
        if( catalog[2].StrLen_or_Ind != SQL_NULL_DATA )
            tableName = (SQLWCHAR *) catalog[2].TargetValuePtr;
    }
}
ret = SQLTables( m_hstmt, (SQLWCHAR *) SQL_ALL_CATALOGS, SQL_NTS, L"", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS );
if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
{
    GetErrorMessage( errorMsg, 1 );
    result = 1;
}
else
{
    for( ret = SQLFetch( m_hstmt ); ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO ); ret = SQLFetch( m_hstmt ) )
    {
        if( catalog[0].StrLen_or_Ind != SQL_NULL_DATA )
            catalogName = (SQLWCHAR *) catalog[0].TargetValuePtr;
        if( catalog[1].StrLen_or_Ind != SQL_NULL_DATA )
            schemaName = (SQLWCHAR *) catalog[1].TargetValuePtr;
        if( catalog[2].StrLen_or_Ind != SQL_NULL_DATA )
            tableName = (SQLWCHAR *) catalog[2].TargetValuePtr;
    }
}
返回SQLTables调用的SQL\u NO\u数据,而以下代码:

ret = SQLTables( m_hstmt, (SQLWCHAR *) SQL_ALL_CATALOGS, SQL_NTS, (SQLWCHAR *) SQL_ALL_SCHEMAS, SQL_NTS, (SQLWCHAR *) SQL_ALL_TABLE_TYPES, SQL_NTS, L"", SQL_NTS );
if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
{
    GetErrorMessage( errorMsg, 1 );
    result = 1;
}
else
{
    for( ret = SQLFetch( m_hstmt ); ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO ); ret = SQLFetch( m_hstmt ) )
    {
        if( catalog[0].StrLen_or_Ind != SQL_NULL_DATA )
            catalogName = (SQLWCHAR *) catalog[0].TargetValuePtr;
        if( catalog[1].StrLen_or_Ind != SQL_NULL_DATA )
            schemaName = (SQLWCHAR *) catalog[1].TargetValuePtr;
        if( catalog[2].StrLen_or_Ind != SQL_NULL_DATA )
            tableName = (SQLWCHAR *) catalog[2].TargetValuePtr;
    }
}
ret = SQLTables( m_hstmt, (SQLWCHAR *) SQL_ALL_CATALOGS, SQL_NTS, L"", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS );
if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
{
    GetErrorMessage( errorMsg, 1 );
    result = 1;
}
else
{
    for( ret = SQLFetch( m_hstmt ); ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO ); ret = SQLFetch( m_hstmt ) )
    {
        if( catalog[0].StrLen_or_Ind != SQL_NULL_DATA )
            catalogName = (SQLWCHAR *) catalog[0].TargetValuePtr;
        if( catalog[1].StrLen_or_Ind != SQL_NULL_DATA )
            schemaName = (SQLWCHAR *) catalog[1].TargetValuePtr;
        if( catalog[2].StrLen_or_Ind != SQL_NULL_DATA )
            tableName = (SQLWCHAR *) catalog[2].TargetValuePtr;
    }
}
只提供目录名,架构/表名为空

这是不是意味着我不能一次就把所有的东西都找回来


谢谢。

我正在更新我的答案,下面是旧内容(从删除的段落开始)。正如伊戈尔在他的回答中所显示的那样,可以一次列出所有内容

在文档站点上,关于
SQLTables()
的链接是:

本文开头有一个明确的条目,说明调用
SQLTables(hstmt1,NULL,0,NULL,0,NULL,0,NULL,0)

[…]返回包含所有表信息的结果集

关于属性
SQL\u ATTR\u METADATA\u ID
的影响以及如何将目录函数中的参数用作

目录函数字符串参数分为四种不同类型:普通参数(OA)、模式值参数(PV)、标识符参数(ID)和值列表参数(VL)

我添加了上面的链接作为参考

是的,我认为不能一次列出所有模式、所有目录和所有类型。从microsoft的文档中:

要支持目录、架构和表类型的枚举,请 为CatalogName定义了以下特殊语义:, SQLTables的SchemaName、TableName和TableType参数:

如果CatalogName是SQL\u ALL\u目录,SchemaName和TableName是空字符串,则结果集包含有效目录的列表 对于数据源。(除TABLE_CAT列外的所有列都包含 空值。)

如果SchemaName是SQL\u ALL\u模式,CatalogName和TableName是空字符串,则结果集包含 数据源。(除TABLE_SCHEM列之外的所有列都包含 空值。)

如果TableType是SQL\u ALL\u TABLE\u类型,CatalogName、SchemaName和TableName是空字符串,则结果集包含 数据源的有效表类型。(所有列中除 表_类型列包含空值。)

网址:

如果我理解正确,就不能组合这些值:只有当CatalogName是
SQL\u ALL\u Catalogs
并且所有其他参数都是空字符串时,才迭代目录,SchemaName也是如此,以此类推

SQL\u ALL\u目录
SQL\u ALL\u架构
SQL\u ALL\u表格类型
在我的系统中定义为
%


因此,如果您将所有三个参数都设置为
SQL\u all\u foobar
进行查询,您将使用
%
作为所有字符串的值进行查询,这不是其他两个参数所期望的空字符串,因此您将不会得到任何结果。

我正在更新我的答案,下面您将看到旧内容(从删除的段落开始)。正如伊戈尔在他的回答中所显示的那样,可以一次列出所有内容

在文档站点上,关于
SQLTables()
的链接是:

本文开头有一个明确的条目,指出调用
SQLTables(hstmt1,NULL,0,NULL,0,NULL,0);

[…]返回包含所有表信息的结果集

关于属性
SQL\u ATTR\u METADATA\u ID
的影响以及如何将目录函数中的参数用作

目录函数字符串参数分为四种不同类型:普通参数(OA)、模式值参数(PV)、标识符参数(ID)和值列表参数(VL)

我添加了上面的链接作为参考

是的,我认为您不能一次列出所有架构、所有目录和所有类型。从microsoft的文档中:

要支持目录、架构和表类型的枚举,请 为CatalogName定义了以下特殊语义:, SQLTables的SchemaName、TableName和TableType参数:

如果CatalogName是SQL\u ALL\u目录,SchemaName和TableName是空字符串,则结果集包含有效目录的列表 用于数据源。(除TABLE_CAT列外的所有列都包含 空值。)

如果SchemaName是SQL\u ALL\u模式,CatalogName和TableName是空字符串,则结果集包含 数据源。(除TABLE_SCHEM列外的所有列都包含 空值。)

如果TableType是SQL\u ALL\u TABLE\u类型,CatalogName、SchemaName和TableName是空字符串,则结果集包含 数据源的有效表类型。(除 表_类型列包含空值。)

网址:

如果我理解正确,就不能组合这些值:只有当CatalogName是
SQL\u ALL\u Catalogs
并且所有其他参数都是空字符串时,才迭代目录,SchemaName也是如此,以此类推

SQL\u ALL\u目录
SQL\u ALL\u架构
SQL\u ALL\u表格类型
在我的系统中定义为
%


因此,如果查询时将所有三个参数都设置为
SQL\u all\u foobar
,则将使用
%
作为所有字符串的值进行查询,这不是其他两个参数所期望的空字符串,因此不会得到任何结果。

显然,以下代码是有效的:

ret = SQLTables( m_hstmt, NULL, 0, NULL, 0, NULL, 0, NULL, 0 );
这是一种奇怪的调用函数的方式

Microsoft需要在文档中的某个地方提到这种情况,因为如果开发人员看到SQL_ALL_目录、SQL_ALL_模式和SQL_ALL_TABLE_类型参数,他会假定需要传递这些值才能从服务器获取所有信息

在easysoft网站上找到了解决方案


感谢大家的阅读。

显然以下代码很有用:

ret = SQLTables( m_hstmt, NULL, 0, NULL, 0, NULL, 0, NULL, 0 );
这是一种奇怪的方式来称呼这个函数