最近在学习ADO与数据库的相关知识,现在我将自己学到的东西整理写出来,也算是对学习的一种复习。

这篇文章主要说明如何遍历某台机器上所有的数据库服务,遍历某个服务中所有的数据库,遍历数据库中的所有表以及表中所有字段字段,最后再说明如何通过ADO操作数据库中的表。

一、遍历所有数据库服务:

遍历数据库服务我们通过函数NetServerEnum来实现,该函数可以 遍历局域网中所有的服务可以通过指定服务类型来有筛选的进行枚举,以达到遍历所有数据库服务的目的,该函数的原型如下:

NET_API_STATUS NetServerEnum(
_In_opt_ LPCWSTR servername,
_In_ DWORD level,
_Out_ LPBYTE *bufptr,
_In_ DWORD prefmaxlen,
_Out_ LPDWORD entriesread,
_Out_ LPDWORD totalentries,
_In_ DWORD servertype,
_In_opt_ LPCWSTR domain,
_Inout_opt_ LPDWORD resume_handle
);

各个参数的说明如下:

servername:这个参数是系统保留的必须为NULL

level:参数用于指明返回参数的结构体的版本,主要有100和101两个值,分别对应SERVER_INFO_100和SERVER_INFO_100;

bufptr:是一个返回参数,系统在这个指针所指向的区域中填充一个SERVER_INFO_100或SERVER_INFO_100的结构体,具体使用哪一种由上一个参数指定;

prefmaxlen:返回值的最大长度,以字节为单位,一般我们设置为MAX_PREFREED_LENGHT,这个参数表明,具体需要多大的缓冲由函数指定

entriesread:由函数返回,表示当前获取的枚举的数量

totalentries:由函数返回,表示当前机器上所有的服务的总数

servertype:获取的服务的类型;(具体类型请参阅MSDN,我们这里主要用的是SV_TYPE_SQLSERVER获取数据库服务)

domain:一个常量字符串,用于指定要返回服务器列表域的名称,如果这个值为NULL则域名是隐含的

resume_handle:保留参数,该参数必须为NULL;

以下是实现的代码,大部分是从MSDN上Copy下来的,只是修改了小部分代码:

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <lm.h>
using namespace std;
#pragma comment(lib, "netapi32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
LPSERVER_INFO_101 pBuf = NULL;
LPSERVER_INFO_101 pTmpBuf; DWORD dwLevel = 101;
DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
DWORD dwEntriesRead = 0;
DWORD dwTotalEntries = 0;
DWORD dwTotalCount = 0;
DWORD dwServerType = SV_TYPE_SQLSERVER; // SQL SERVER
DWORD dwResumeHandle = 0;
NET_API_STATUS nStatus;
LPWSTR pszServerName = NULL;
LPWSTR pszDomainName = NULL;
DWORD i; nStatus = NetServerEnum(pszServerName, dwLevel, (LPBYTE *)&pBuf, dwPrefMaxLen, &dwEntriesRead, &dwTotalEntries, dwServerType,
pszDomainName, &dwResumeHandle); if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
{
if ((pTmpBuf = pBuf) != NULL)
{
for (i = 0; i < dwEntriesRead; i++) //成功则依次输出结果
{
assert(pTmpBuf != NULL);
printf("\tPlatform: %d\n", pTmpBuf->sv101_platform_id);
wprintf(L"\tName: %s\n", pTmpBuf->sv101_name);
printf("\tVersion: %d.%d\n",pTmpBuf->sv101_version_major, pTmpBuf->sv101_version_minor);
printf("\tType: sql server");
printf("\n");
wprintf(L"\tComment: %s\n\n", pTmpBuf->sv101_comment); pTmpBuf++;
dwTotalCount++;
}
}
else
{
printf("No servers were found\n");
printf("The buffer (bufptr) returned was NULL\n");
printf(" entriesread: %d\n", dwEntriesRead);
printf(" totalentries: %d\n", dwEntriesRead);
} }
else//函数执行错误
{
fprintf(stderr, "NetServerEnum failed with error: %d\n", nStatus);
}
if (pBuf != NULL)
{
NetApiBufferFree(pBuf);//释放内存空间
}
}




二、遍历数据库中服务器中所有数据库:

通过上一步我们可以遍历局域网中所有数据库服务,这个时候我们更进一步来遍历数据库服务中所有的数据库,实现这个功能没有什么特殊的函数,主要是对系统表的应用,我们用的是系统表master.sys.database,该表中记录了服务中所有的数据库,通过ADO的方式来进行操作:

//初始化COM组件库
CoInitialize(NULL);
_ConnectionPtr pConnect;
HRESULT hErr;
try
{
//创建Connection对象
hErr = pConnect.CreateInstance("ADODB.Connection");
if (SUCCEEDED(hErr))
{
pConnect->Open("Driver={SQL Server};Server=LIUHAO-PC;Uid = sa;Pw = 1234", "", "", adModeUnknown);
}
}
catch (_com_error &e)
{
cout << e.Description() << endl;
} try
{
//创建RECORD, COMMAND对象
_RecordsetPtr pRecord;
pRecord.CreateInstance("ADODB.Recordset");
_CommandPtr pCommand;
pCommand.CreateInstance("ADODB.Command");
//遍历服务器中所有数据库
cout << "服务器中所有数据库:" << endl;
pRecord->Open("select * from master.sys.databases", pConnect.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdText);
_variant_t vName;
while (!pRecord->adoEOF)
{
vName = pRecord->GetCollect(_variant_t("name"));
wcout << (TCHAR*)_bstr_t(vName) << endl;
pRecord->MoveNext();
}
pRecord->Close();
}
catch
{
cout << e.Description() << endl;
}


三、遍历某个数据库中所有的表:

该操作也是使用系统表的内容,代码如下:

//遍历test数据库中所有表
cout << "数据库中所有表:" << endl;
pRecord->Open("use test SELECT name FROM sys.sysobjects WHERE type='U' ORDER BY name", pConnect.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdText);
while (!pRecord->adoEOF)
{
vName = pRecord->GetCollect(_variant_t("name"));
wcout << (TCHAR*)_bstr_t(vName) << endl;
pRecord->MoveNext();
}
pRecord->Close();

sql语句中前面的"use test"表示在test数据库中查找表后面的“type = 'U' ”表示我们遍历的是用户表此外type 还可以是一下值:

U = 用户表

= 视图,

TF = 表函数,

P = 存储过程,

L = 日志

四、遍历某个表中的所有字段:

//显示表中所有的字段名
cout << "test表中所有字段:" << endl;
FieldsPtr fields;//用于保存字段信息
pRecord->Open("SELECT * FROM users", pConnect.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdText);
fields = pRecord->GetFields();//获取字段信息
long nCount = fields->GetCount();//获取遍历到的字段总数
for (int i = 0; i < nCount; i++)
{//获取到的字段信息是放到field对象的item结构体数组中,利用GetItem可以获取该结构体数组中的某一项,利用GetName函数可以获取结构体中存储的字段名
bstr_t bstrName = (fields->GetItem(_variant_t((long)i)))->GetName();
TCHAR *pText = static_cast<TCHAR*>(bstrName);//将字段名转化为字符串输出
wcout << pText << endl;
}

利用以上所有代码,用户可以根据获取到局域网中所有SQL SERVER数据库服务器,遍历其中的所有数据库,根据获取到的数据库获取数据库中所有表,进到某一个表中遍历所有字段,有了字段用户就可以通过SQL语句操作某个表或者其中的某个字段了

ADO对SQL Server 2008数据库的基础操作的更多相关文章

  1. SQL Server 2012 - 数据库的基础操作

    数据库基本操作 --新建数据库卡 use master go create database SchoolDB on ( Name=SchoolDB, FileName='D;\DB\SchoolDB ...

  2. SQL Server 2008 数据库镜像部署实例之三 配置见证服务器

    SQL Server 2008 数据库镜像部署实例之三 配置见证服务器 前面已经完成了镜像数据库的配置,并进行那个了故障转移测试.接下来将部署见证服务器,实现自动故障转移. 一.关于见证服务器 1.若 ...

  3. 如何转换SQL Server 2008数据库到SQL Server 2005

        背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...

  4. SQL SERVER 2008数据库各版本功能对比

    微软SQL SERVER 2008数据库有6个版本,分别是数据中心版.企业版.标准版.Web版.工作组版.简易版,有时候购买的时候或需要使用某项功能时,需要了解各个版本的区别,功能差异,很多时候,大部 ...

  5. 通过SQL Server 2008数据库复制实现数据库同步备份

    SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步,正常情况下只使用主 ...

  6. SQL Server 2008 数据库镜像部署实例之二 配置镜像,实施手动故障转移

    SQL Server 2008 数据库镜像部署实例之二 配置镜像,实施手动故障转移 上一篇文章已经为配置镜像数据库做好了准备,接下来就要进入真正的配置阶段 一.在镜像数据库服务器上设置安全性并启动数据 ...

  7. SQL Server 2008 数据库镜像部署实例之一 数据库准备

    SQL Server 2008 数据库镜像部署实例之一 数据库准备 一.目标 利用Sql Server 2008 enterprise X64,建立异步(高性能)镜像数据库,同时建立见证服务器实现自动 ...

  8. SQL Server 2008 数据库同步的两种方式 (发布、订阅)

    参考转载: SQL Server 2008 数据库同步的两种方式 (发布.订阅) 使用Sqlserver事务发布实现数据同步

  9. [转]实战 SQL Server 2008 数据库误删除数据的恢复

    实战 SQL Server 2008 数据库误删除数据的恢复 关键字:SQL Server 2008, recover deleted records 今天有个朋友很着急地打电话给我,他用delete ...

随机推荐

  1. C language 模拟 win的经典游戏——扫雷

    让我们在terminal下愉快的...扫雷 昨天跟奇葩霖聊起"雷区"这个敏感词汇,然后非常荣幸的... 应该轰炸不到我.. . 后来百无聊赖的去玩了把扫雷.然后发现我之前都是乱扫的 ...

  2. C语言之——文件操作模式

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47450667 "rt" 仅仅读打开一个文本文件.仅仅同意读数据 ...

  3. SharePoint 集成OWA概述

    简介 OWA服务,也就是Office Web Application,微软提供的可以在线查看和编辑Office系列文档的服务,包括Word/Excel/PPT/OneNote.我们可以通过OWA服务和 ...

  4. oracle实现主键自增

    首先,创建一张表: CREATE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME VARCHAR(25)); 然后,自定义一个序列(seq ...

  5. 自学Python5.2-类、模块、包

    类.模块.包  一.类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 二.模块module 通常模块为一个文件,直接使用import来导入就好了.可以作为module ...

  6. [CSS]第一项和最后一项样式

    列表项的第一项距离顶部0.2rem,最后一项距离底部0.5rem .item:first-child { padding-top: .2rem; } .item:last-child { paddin ...

  7. spark-submit参数说明--on YARN

    示例: spark-submit [--option value] <application jar> [application arguments] 参数名称 含义 --master M ...

  8. Angular 非父子组件间的service数据通信

    完成思路:以service.ts(主题subject---订阅sbuscribe模式)为数据中转中间件,通过sku.ts的数据更改监测机制,同步更改service.ts中的数据,同时buy.ts组件实 ...

  9. 微信小程序使用场景延伸:扫码登录、扫码支付

    微信小程序使用场景延伸:扫码登录.扫码支付 小程序最适合的使用场景有哪些?相比大家能列举出来很多,但这个场景,大家可能多数没想到_^ 笔者团队近期接到了一个PC项目:转转游戏租号PC官网,该项目要求在 ...

  10. 创建、设置和安装Windows服务

    文章大部分内容转自:http://www.cnblogs.com/greatandforever/archive/2008/10/14/1310504.html:和:http://www.cnblog ...