Masimaro's blog - SQL Server 2008
type: channel
link: https://www.masimaro.top/tag/SQL-Server-2008/
items: ADO对SQL Server 2008数据库的基础操作

ADO对SQL Server 2008数据库的基础操作
type: item
date: 2015-09-03T10:48:00+08:00
description: ​最近在学习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：这个参数是系统保留的必须为NULLlevel：参数用于指明返回参数的结构体的版本，主要有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("\tV…