日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++ 访问数据库实例详解图解

發布時間:2025/4/14 c/c++ 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++ 访问数据库实例详解图解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 ADO 方式訪問 Access

新建一個對話框工程,添加控件,如圖;


創建Access數據庫如圖;



應用程序啟動時進行COM初始化;

BOOL CDemoApp::InitInstance()
{
if (!SUCCEEDED(CoInitialize(NULL)))
{
::AfxMessageBox(_T("Failed to initialize COM!"));
return FALSE;
}

AfxEnableControlContainer();


對話框類實現文件代碼如下;

// DemoDlg.cpp : implementation file
// Download by http://www.NewXing.com


#include "stdafx.h"
#include "Demo.h"
#include "DemoDlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/
// CAboutDlg dialog used for App About


class CAboutDlg : public CDialog
{
public:
CAboutDlg();


// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA


// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); ? ?// DDX/DDV support
//}}AFX_VIRTUAL


// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};


CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}


void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/
// CDemoDlg dialog


CDemoDlg::CDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDemoDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDemoDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);


if (!SUCCEEDED(m_pConnection.CreateInstance(__uuidof(Connection))))
{
m_pConnection = NULL;
TRACE(_T("Database CreateInstance failed"));
}


if (!SUCCEEDED(m_pRecordset.CreateInstance(__uuidof(Recordset))))
{
m_pRecordset = NULL;
TRACE(_T("Recordset CreateInstance Failed!"));
}


//打開數據庫
CString strConnect = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= Demo.mdb");
if (!OpenDatabase(strConnect))
{
AfxMessageBox(_T("數據庫打開失敗。"));
return;
}

//打開記錄集
if (!OpenRecordset(_T("SELECT * FROM DemoTable")))
{
AfxMessageBox(_T("記錄集打開失敗。"));
return;
}
}


CDemoDlg::~CDemoDlg()
{
m_pRecordset->Close();
m_pConnection->Close();
}


void CDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDemoDlg)
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDemoDlg, CDialog)
//{{AFX_MSG_MAP(CDemoDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_FIND, OnFind)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/
// CDemoDlg message handlers


BOOL CDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();


// Add "About..." menu item to system menu.


// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);


CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}


// Set the icon for this dialog. ?The framework does this automatically
// ?when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon


//初始化ListCtrl
CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST);
pListCtrl->SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
pListCtrl->InsertColumn(1, _T("序號"), LVCFMT_CENTER, 80);
pListCtrl->InsertColumn(2, _T("姓名"), LVCFMT_CENTER, 100);
pListCtrl->InsertColumn(3, _T("年齡"), LVCFMT_CENTER, 100);


return TRUE;
}


void CDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}


// If you add a minimize button to your dialog, you will need the code below
// ?to draw the icon. ?For MFC applications using the document/view model,
// ?this is automatically done for you by the framework.


void CDemoDlg::OnPaint()?
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting


SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);


// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;


// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}


// The system calls this to obtain the cursor to display while the user drags
// ?the minimized window.
HCURSOR CDemoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}


BOOL CDemoDlg::OpenDatabase(LPCTSTR lpszConnect, long nOptions)
{
ASSERT(m_pConnection != NULL);
ASSERT(lpszConnect != NULL);
ASSERT(AfxIsValidString(lpszConnect));

//打開數據庫連接
try
{
return SUCCEEDED(m_pConnection->Open(_bstr_t(lpszConnect),?
_T(""), _T(""), nOptions));
}
catch (_com_error& e)
{
TRACE(_T("%s\n"), e.ErrorMessage());
return FALSE;
}
}


BOOL CDemoDlg::CloseDatabase()
{
ASSERT(m_pConnection != NULL);


//關閉數據庫連接
try
{
if (m_pConnection->State & adStateOpen)?
{
return SUCCEEDED(m_pConnection->Close());
}
else
{
return TRUE;
}
}
catch (_com_error& e)
{
TRACE(_T("%s\n"), e.ErrorMessage());
return FALSE;
}?
}


BOOL CDemoDlg::OpenRecordset(LPCTSTR lpszSource, long nCursorType, long nLockType, long nOptions)
{
ASSERT(m_pConnection != NULL);
ASSERT(m_pRecordset != NULL);
ASSERT(lpszSource != NULL);
ASSERT(AfxIsValidString(lpszSource));


//打開記錄集
try
{
return (SUCCEEDED(m_pRecordset->Open(_variant_t(lpszSource),
m_pConnection.GetInterfacePtr(),
(CursorTypeEnum)nCursorType,?
(LockTypeEnum)nLockType,
nOptions)));
}
catch(_com_error e)
{
TRACE(_T("%s\n"), e.ErrorMessage());
return FALSE;
}
}


BOOL CDemoDlg::CloseRecorset()
{
ASSERT(m_pRecordset != NULL);


//關閉記錄集
try
{
if (m_pRecordset->State & adStateOpen)?
{
return SUCCEEDED(m_pRecordset->Close());
}
else
{
return TRUE;
}
}
catch (_com_error e)
{
TRACE(_T("%s\n"), e.ErrorMessage());
return FALSE;
}
}


void CDemoDlg::OnFind()?
{
if (!(m_pRecordset->State & adStateOpen))
{
AfxMessageBox((_T("記錄集未打開。")));
return;
}


//查找條件
CString strCriteria = _T("");
CString strName = _T("");
GetDlgItemText(IDC_NAME, strName);
strCriteria.Format(_T("NAME like '%s'"), strName);


//查找記錄集
CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST);
pListCtrl->DeleteAllItems();
if (m_pRecordset->BOF && m_pRecordset->adoEOF)
{
return;
}
m_pRecordset->MoveFirst();
int n = 0;
m_pRecordset->Find(_bstr_t(strCriteria), 0, adSearchForward);
while (!m_pRecordset->adoEOF)
{
_variant_t varValue;
CString strName = _T("");
int nAge = 0;


varValue = m_pRecordset->GetCollect(_variant_t(_T("NAME")));
if (varValue.vt != VT_NULL)
{
strName = varValue.bstrVal;
}
else
{
strName = _T("");
}


varValue = m_pRecordset->GetCollect(_variant_t(_T("AGE")));
if (varValue.vt != VT_NULL)
{
nAge = varValue.intVal;
}
else
{
nAge = 0;
}


//刷新ListCtrl
CString strText = _T("");
strText.Format(_T("%d"), n + 1);
pListCtrl->InsertItem(n, strText);
strText.Format(_T("%s"), strName);
pListCtrl->SetItemText(n, 1, strText);
strText.Format(_T("%d"), nAge);
pListCtrl->SetItemText(n, 2, strText);
n++;


m_pRecordset->Find(_bstr_t(strCriteria), 1, adSearchForward);
}
}

折疊起來看下函數;

代碼就不解釋了;函數含義比較明確;除了操作數據庫,ADO方式還有COM相關操作;

效果:


VC在調試時,Data Source= Demo.mdb,這樣的語句,訪問的不是Debug目錄下的Demo.mdb,是和Debug目錄同級;

如果Debug目錄同級沒有數據庫,則打開數據庫失敗;





工程下載

http://pan.baidu.com/s/1slEEOMD

Access工具下載

http://blog.csdn.net/bcbobo21cn/article/details/51000041

VC6下載

http://blog.csdn.net/bcbobo21cn/article/details/44200205

二 VC 訪問 sqlite3

首先用sqlite3創建一個數據庫,設備db;


創建表并插入數據;


接下來在VC6中新建一個控制臺工程;

代碼;

#include <stdio.h>?
#include <stdlib.h>?
#include <sqlite3.h>?
int column_names_printed = 0;?
void print_row(int n_values, char** values)?
{?
? ? int i;?
? ? for (i = 0; i < n_values; ++i) {?
? ? ? ? printf("%10s", values[i]);?
? ? }?
? ? printf("\n");?
}?
int print_result(void* data, int n_columns, char** column_values, char** column_names)?
{?
? ? if (!column_names_printed) {?
? ? ? ? print_row(n_columns, column_names);?
? ? ? ? column_names_printed = 1;?
? ? }?
? ??
? ? print_row(n_columns, column_values);?
? ?
? ?return 0;?
}?
int main()?
{?
? ? sqlite3 *db=NULL;?
? ? char *errMsg = NULL;?
? ? int rc;?
? ??
? ? rc = sqlite3_open("shebei.db", &db);?
? ? if( rc ){?
? ? ? ? fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));?
? ? ? ? sqlite3_close(db);?
? ? ? ? exit(1);?
? ? }?
? ? else printf("open shebei.db successfully!\n");?
? ??
? ? column_names_printed = 0;?
? ? rc = sqlite3_exec(db, "SELECT shebei.* FROM shebei;", print_result, NULL, &errMsg);?
? ? column_names_printed = 1;?
? ? printf("\n");?
? ??
? ? printf("error code: %d\n", rc);?
? ? printf("error message: %s\n", errMsg);?
? ? sqlite3_close(db);?
? ? return 0;?
}?

注意如果如下的換行語句,

rc = sqlite3_exec(db, "CREATE TABLE students(number varchar(10), name varchar(10), \?
? ? ? ? ? ? ? ? ? ? ? ? ? ?sex varchar(6), age varchar(2));", NULL, NULL, NULL);
\之后如果有空格;則會出現;
Y:\dddd20\sqlitedemo1\demo1.cpp(39) : warning C4129: ' ' : unrecognized character escape sequence

刪除空格即可;


現在我們有sqlite3.dll跟一個sqlite3.def文件,并沒有用于VC++6.0的lib文件,可以利用sqlite3.def文件生成,步驟如下:?
? 1.將sqlite3.h(D:\sqlite-amalgamation-3_6_23.zip)拷貝到C:\Program Files\Microsoft Visual Studio\VC98\Include目錄下,這時編譯可通過,但鏈接錯誤,因為沒有LIB文件()?
? 2.啟動一個命令行程序,進入VC的安裝目錄C:\Program Files\Microsoft Visual Studio\VC98\Bin,在這個目錄下面有一個LIB.exe文件,使用它就能生成sqlite3.lib文件,將sqlite3.def文件放到相同目錄,或者絕對路徑也可以, 然后在命令行輸入如下命令:?
? ?LIB /MACHINE:IX86 /DEF:sqlite3.def?
? 該命令生成兩個文件:sqlite3.lib和sqlite3.exp?
? ?運行該命令時,如果提示找不到MSPDB60.DLL文件,可從其它目錄拷貝至Bin目錄下?
? 3.將生成的sqlite3.lib拷貝到Lib目錄下,將sqlite3.dll拷貝到C:\WINNT\system32目錄下?
? ?4.將sqlite3.lib加入到工程鏈接中,Project->Settings,Link選項卡,Object/library modules最后添入sqlite3.lib?

參閱:http://mxdxm.iteye.com/blog/634772

操作過程和完成結果如下圖;



把環境配置好;編譯運行程序;效果如下;



工程下載

sqlite相關下載,包括,h、Lib、dll文件;

http://pan.baidu.com/s/1slEEOMD


三 ADO訪問數據庫出現C2146、C2501

demodlg.h(25) : error C2146: syntax error : missing ';' before identifier 'm_pConnection'
demodlg.h(25) : error C2501: '_ConnectionPtr' : missing storage-class or type specifiers
demodlg.h(25) : error C2501: 'm_pConnection' : missing storage-class or type specifiers

在stdafx.h中加入如下語句再構建;

#import "c:\Program Files (x86)\common files\system\ado\msado15.dll"\
no_namespace\
rename("EOF", "adoEOF")


另外再看是否少了};

總結

以上是生活随笔為你收集整理的VC++ 访问数据库实例详解图解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲国产精品成人无码区 | 国产视频一区二区三区在线观看 | 丰满少妇一级片 | 欧美少妇在线 | 粗大挺进潘金莲身体在线播放 | 一区在线免费观看 | 国产乱子伦精品无码码专区 | 亚洲成人观看 | 麻豆久久久久久 | 欧美亚洲自拍偷拍 | 国产精品77777 | 亚洲av无码一区二区乱子伦as | 偷偷操不一样的99 | 国产伦一区二区三区 | 色翁荡息又大又硬又粗又爽 | 综合久久久久久久 | 偷偷操不一样的99 | 亚洲精品一二三四 | 一级黄色短视频 | 视频免费观看在线 | 超碰免费在线 | 日韩精品免费在线观看 | 日韩精品一区二区三区视频在线观看 | 天天干狠狠爱 | 六月激情 | 潘金莲一级淫片免费放动漫 | 天天干天天色天天射 | 人妻熟女一区 | 久久亚洲天堂 | 激情成人av | 国产欧美精品国产国产专区 | 天海翼一二三区 | 日韩激情在线 | a级在线视频 | 成人av在线影院 | 久久精品欧美视频 | 日产亚洲一区二区三区 | 一区二区在线免费观看 | 精品黑人一区二区三区久久 | 卡一卡二在线视频 | 日本亲子乱子伦xxxx | 中文字幕第一 | 香蕉视频影院 | 91精品91| 黄色动漫免费在线观看 | 国产精品美女久久久久久久 | 亚洲精品国产精品乱码不99按摩 | 欧美精品一区二区三区久久久竹菊 | 亚洲综合在线一区二区 | 久久福利视频网 | 欧美日韩一区二区三区不卡视频 | 久久国产三级 | 国产高清一区在线观看 | 黑人和白人做爰 | 久久人久久 | 欧美专区在线观看 | 玩偶游戏在线观看免费 | 欧美日韩视频在线播放 | 欧美日韩精品一区二区三区四区 | 欧美日韩色片 | 免费毛片看片 | 国产精品国产三级国产aⅴ9色 | 日韩精品短片 | 99久久99久久精品免费看蜜桃 | 吸咬奶头狂揉60分钟视频 | 日韩诱惑 | 天堂av在线电影 | 天天艹| 强伦人妻一区二区三区视频18 | 婷婷丁香花五月天 | 高跟肉丝丝袜呻吟啪啪网站av | 91在线视频观看 | av大片在线看 | 国产一区二区三区 | 黄频在线播放 | 久久婷婷综合色 | 欧美一区亚洲 | 国产激情一区二区三区四区 | 女人叫床很黄很污句子 | 国产爽爽爽 | 亚洲美女视频 | 天天色影网| 欧美日韩高清在线观看 | 国产老熟女一区二区三区 | 91久久综合亚洲鲁鲁五月天 | 国产情侣呻吟对白高潮 | 亚洲精品久久夜色撩人男男小说 | 91啪国产 | 成人av番号网 | 国内黄色片| 亚洲综合av一区二区 | 黄色av软件 | 久久久久国产精品午夜一区 | www.久久久 | 久久久久中文字幕 | 张津瑜国内精品www在线 | 美女激情网 | 中文字幕av免费 | 少妇久久久久久被弄到高潮 |