日韩性视频-久久久蜜桃-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++ 访问数据库实例详解图解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产日韩欧美精品在线观看 | 51人人看 | 黄色一级黄色片 | 国产精品免费网站 | 欧美黄色xxx | 人妻丰满熟妇岳av无码区hd | 一级片麻豆| 青青草久久爱 | 免费在线看污视频 | 伊人网狼人| 成人做爰9片免费视频 | 久久成年人| 国产一级一片 | 操到喷水 | 动漫大乳美女 | 久久激情网 | 在线爱情大片免费观看大全 | 91成人在线播放 | 无码人妻少妇色欲av一区二区 | 天降女子在线 | 精品一区二区三区视频 | 99国产精品99久久久久久粉嫩 | 国产精品伦一区二区 | 中文字幕成人 | 亚洲高h| 久久影音 | 免费国产一级 | 在线香蕉 | 国产农村妇女毛片精品 | 怡红院成人网 | 户外露出一区二区三区 | 美女福利视频网 | 国产对白刺激视频 | 七仙女欲春2一级裸体片 | 免费成人在线看 | 欧美日韩视频 | 日韩精品人妻一区二区中文字幕 | 久热这里只有精品在线 | 亚洲成人精品在线 | 少妇高潮灌满白浆毛片免费看 | 91免费视频大全 | 国产精品亚洲天堂 | 日本福利视频一区 | 国产一级片 | 亚洲第四页 | 好男人www社区 | 欧美精品一级二级 | 女人的毛片 | 国产youjizz| 国产麻豆一级片 | 人人爱爱 | 无码久久精品国产亚洲av影片 | 超碰伊人网 | 视频污在线观看 | 亚洲一区二区三区成人 | 狠狠爱av| 99久久久无码国产精品性黑人 | 热热色原网址 | 欧美在线视频网站 | 欧美一级片在线看 | 91在线免费视频 | 国产精品久久一 | 欧美在线a | 欧美一区二区人人喊爽 | 爱爱免费网址 | 欧美精品1区2区3区 精品成人一区 | 黑人操亚洲美女 | 凹凸国产熟女精品视频 | 蜜桃在线一区 | 亚洲乱码精品 | 91青青草视频 | 国产色秀 | 欧美色图狠狠干 | 国产亚洲精品一区二区三区 | 成人精品一区二区三区在线 | 国产 日韩 欧美 精品 | 美女天天操 | 国产欧美一区二区三区另类精品 | 亚洲国产精品自拍 | 欧美日韩成人一区二区 | av最新天堂| 视频在线 | 久久久午夜影院 | 91爱爱.com| 色哟哟网站入口 | 亚洲精品性视频 | 国产精品久久久久9999 | 久久国产精品久久久久久电车 | 国产精品视频免费网站 | 日本精品视频在线播放 | 亚洲熟妇av一区二区三区漫画 | 久久精品国产99国产 | 日本男男激情gay办公室 | 国产一在线观看 | 又黄又爽视频在线观看 | 激情宗合网 | 美女日批网站 | 国产精品无码中文 | 插入综合网 |