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 );
这是一种奇怪的方式来称呼这个函数