Sql server UMN在这里 // ... hr=spIRowset->ReleaseRows(1,phRow,NULL,NULL); hr=spIRowset->GetNextRows(DB\u NULL\u HCHAPTER、0、1、cRows和phRow); } 返

Sql server UMN在这里 // ... hr=spIRowset->ReleaseRows(1,phRow,NULL,NULL); hr=spIRowset->GetNextRows(DB\u NULL\u HCHAPTER、0、1、cRows和phRow); } 返,sql-server,sql-server-ce,oledb,Sql Server,Sql Server Ce,Oledb,UMN在这里 // ... hr=spIRowset->ReleaseRows(1,phRow,NULL,NULL); hr=spIRowset->GetNextRows(DB\u NULL\u HCHAPTER、0、1、cRows和phRow); } 返回人力资源; } 问题是我是否得到DBCOLUMNINFO对象,这些对象将所有列元数据方便地打包在每列的一个结构中,还是我必须访问行集、获取列并解析它们。例如,如果列的类型为I4,那么字段DBCOLUMNINFO.wType等于3-不需要解析。

UMN在这里 // ... hr=spIRowset->ReleaseRows(1,phRow,NULL,NULL); hr=spIRowset->GetNextRows(DB\u NULL\u HCHAPTER、0、1、cRows和phRow); } 返回人力资源; }
问题是我是否得到
DBCOLUMNINFO
对象,这些对象将所有列元数据方便地打包在每列的一个结构中,还是我必须访问行集、获取列并解析它们。例如,如果列的类型为I4,那么字段
DBCOLUMNINFO.wType
等于3-不需要解析。我对数据库没有太多经验。指定
where 1=0
是否会导致数据库检查每一行是否满足此条件,或者数据库是否足够聪明,能够理解没有行会满足此条件?它将知道返回一个空记录集。是的,但它如何到达空记录集?它是否预先知道记录集是空的,还是通过对每一行测试条件来了解它?问题是我是否得到
DBCOLUMNINFO
对象,这些对象将所有列元数据方便地打包在每一列的一个结构中,还是我必须访问行集,获取列并解析它们。例如,如果列的类型为I4,那么字段
DBCOLUMNINFO.wType
等于3-不需要解析。我对数据库没有太多经验。指定
where 1=0
是否会导致数据库检查每一行是否满足此条件,或者数据库是否足够聪明,能够理解没有行会满足此条件?它将知道返回一个空记录集。是的,但它如何到达空记录集?它是否预先知道记录集是空的,或者通过对每一行测试条件来艰难地学习它?它是否比使用
进行选择(其中1=0
)然后从返回的
IRowset
对象获取
icoluminfo
引用更快?因为这样我就得到了
dbcolumnifo
对象,这显然比从行集中提取相同的数据(以及解析类型名称——如果有
dbcolumnifo
对象可供使用,则不必这样做)更方便这一决定最终取决于您,因为这两种技术在某些应用程序中可能存在微不足道的差异。从最纯粹的角度来看,在IColumnInfo可用之前,必须通过SQL解析器处理SQL SELECT,而IDBSchemaRowset是对数据库内部的直接访问,因此,它应该更快。一般来说,我对IDBSchemaRowset有很好的性能体验,因此,毫无疑问,这是值得掌握的。它是否比使用
1=0
进行选择,然后从返回的
IRowset
对象获取
icolumnifo
引用更快?因为这样我就得到了
dbcolumnifo
对象,这显然比从行集中提取相同的数据(以及解析类型名称——如果有
dbcolumnifo
对象可供使用,则不必这样做)更方便这一决定最终取决于您,因为这两种技术在某些应用程序中可能存在微不足道的差异。从最纯粹的角度来看,在IColumnInfo可用之前,必须通过SQL解析器处理SQL SELECT,而IDBSchemaRowset是对数据库内部的直接访问,因此,它应该更快。一般来说,我在IDBSchemaRowset方面有很好的性能体验,因此,毫无疑问,这是值得掌握的。
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ?
#include <windows.h>
#include <atlbase.h>
#include <oleauto.h>
#include <oledb.h>

HRESULT OpenDatabase(LPOLESTR szPath, IDBInitialize **ppIDBInitialize)
{
    HRESULT hr = S_OK;
    CComPtr<IDBInitialize> spIDBInitialize;
    hr = spIDBInitialize.CoCreateInstance(OLESTR("Microsoft.SQLLITE.MOBILE.OLEDB.3.0"));
    CComPtr<IDBProperties> spIDBProperties;
    spIDBProperties = spIDBInitialize;
    CComVariant vDataSource(szPath);
    DBPROP dbProp = { DBPROP_INIT_DATASOURCE, DBPROPOPTIONS_REQUIRED, 0, DB_NULLID, vDataSource };
    DBPROPSET dbPropSet = { &dbProp, 1, DBPROPSET_DBINIT };
    hr = spIDBProperties->SetProperties(1, &dbPropSet);
    hr = spIDBInitialize->Initialize();
    *ppIDBInitialize = spIDBInitialize.Detach();
    return hr;
}

HRESULT GetSchemaColumns(IUnknown *pDataSource, LPOLESTR pTableName, IRowset **ppIRowset)
{
    HRESULT hr = S_OK;
    CComPtr<IDBCreateSession> spIDBCreateSession;
    hr = pDataSource->QueryInterface(IID_IDBCreateSession, (void**) &spIDBCreateSession);
    CComPtr<IDBCreateCommand> spIDBCreateCommand;
    hr = spIDBCreateSession->CreateSession(NULL, IID_IDBCreateCommand, (IUnknown**) &spIDBCreateCommand);
    CComPtr<IDBSchemaRowset> spIDBSchemaRowset;
    hr = spIDBCreateCommand->QueryInterface(IID_IDBSchemaRowset, (void**) &spIDBSchemaRowset);
    CComVariant vRestrictions[CRESTRICTIONS_DBSCHEMA_COLUMNS];
    vRestrictions[2] = pTableName;
    CComPtr<IRowset> spIRowset;
    hr = spIDBSchemaRowset->GetRowset(NULL, DBSCHEMA_COLUMNS, CRESTRICTIONS_DBSCHEMA_COLUMNS, vRestrictions, IID_IRowset, NULL, NULL, (IUnknown**) &spIRowset);
    *ppIRowset = spIRowset.Detach();
    return hr;
}

HRESULT Run()
{
    HRESULT hr = S_OK;
    CComPtr<IDBInitialize> spIDBInitialize;
    hr = OpenDatabase(OLESTR("MyDatabase.sdf"), &spIDBInitialize);
    CComPtr<IRowset> spIRowset;
    hr = GetSchemaColumns(spIDBInitialize, OLESTR("MyTableName"), &spIRowset);
    DBCOUNTITEM cRows = 0;
    HROW hRow = NULL;
    HROW *phRow = &hRow;
    hr = spIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRows, &phRow);
    while (SUCCEEDED(hr) && cRows > 0)
    {
        // Do handling of a row fetched from INFORMATION_SCHEMA.COLUMN here
        // ...
        hr = spIRowset->ReleaseRows(1, phRow, NULL, NULL, NULL);
        hr = spIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRows, &phRow);
    }
    return hr;
}