1. 程式人生 > >VC 操作ACCESS的建立資料庫,表,新增修改刪除記錄等

VC 操作ACCESS的建立資料庫,表,新增修改刪除記錄等

#import "C:\Program Files\Common Files\System\ado\msadox.dll"
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\
 rename("EOF","adoEOF")rename("BOF","adoBOF") //匯入ADO動態連結庫


class ADO 
{
public:
    _ConnectionPtr m_pConnection;     //連線物件指標
 _RecordsetPtr  m_pRecordset;     //記錄集物件指標

public:
 ADO();
 virtual ~ADO();
 BOOL CreateDB(LPCTSTR lpszFileName);
 void OnInitADOConn();       //連線資料庫
 _RecordsetPtr&  OpenRecordset(CString sql);  //開啟記錄集
 void CloseRecordset();       //關閉記錄集
 void CloseConn();        //關閉資料庫連線
 UINT GetRecordCount(_RecordsetPtr pRecordset); //獲得記錄數 
};

ADO::ADO()
{
 CoInitialize(NULL);
}

ADO::~ADO()
{
 CoUninitialize();
}
BOOL ADO::CreateDB(LPCTSTR lpszFile)
//{
// BOOL CPassportDoc::CreateDB(LPCTSTR lpszFile)
{
 
 _ConnectionPtr tempConnn;
 ADOX::_CatalogPtr pCatalog = NULL;
 ADOX::_TablePtr  pTable = NULL;
 ADOX::_IndexPtr pIndexNew  = NULL;
 ADOX::_IndexPtr pIndex  = NULL;
 _variant_t d;
 HRESULT hr;
 CString strConnect;
 CString strDBPath=lpszFile;
 strConnect.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"),strDBPath);
 COleVariant Connect(strConnect);
 try{
  
  hr = pCatalog.CreateInstance(__uuidof(ADOX::Catalog));
   if (FAILED(hr))
  {
   _com_issue_error(hr);
  // return FALSE;
  }
  if (GetFileAttributes(lpszFile) == INVALID_FILE_ATTRIBUTES)  
  {
   
   hr = pCatalog->Create((LPCTSTR)strConnect);//建立資料庫
  }
  tempConnn.CreateInstance(_T("ADODB.Connection"));
  tempConnn->PutCommandTimeout(30);
  tempConnn->PutConnectionTimeout(30);
  tempConnn->put_CursorLocation(adUseClient);
  tempConnn->Open(_bstr_t(strConnect),_bstr_t(),_bstr_t(),adConnectUnspecified);
  pCatalog->PutActiveConnection(_variant_t((IDispatch *) tempConnn));
  pTable.CreateInstance(_T("ADOX.Table"));
  pTable->ParentCatalog =pCatalog;
  pTable->Name="Passport1";
  ADOX::ColumnsPtr pCols =pTable->Columns;
  pCols->Append(_T("RecordID")  ,ADOX::adInteger,0);//自動編號欄位
  pCols->Append(_T("Name")   ,ADOX::adWChar,255);//文字欄位
  pCols->Append(_T("DateOfBirth")  ,ADOX::adDate,0);//日期欄位
  pCols->Append(_T("OtherInfo"),ADOX::adLongVarWChar,0);//備註欄位
  pCatalog->Tables->Refresh();
  long lCount=pCols->Count;
  for(long i=0;i<lCount;i++)
  {
   pCols->GetItem(i)->ParentCatalog =pCatalog;//重要!設定Catalog,參見Q201826 PRB: Error 3265 When You Access Properties Collection
   ADOX::PropertiesPtr pProperties=pCols->GetItem(i)->Properties;
   if(pProperties)
   {//這裡是用於除錯的屬性顯示程式碼
    long lp=pProperties->Count;
    TRACE("Properties for Col %s\r\n",(LPCTSTR)pCols->GetItem(i)->Name); 
   }
  }
  //設定說明
  pCols->GetItem(_T("RecordID"))->Properties->GetItem(_T("Description"))->Value=_T("記錄編號");//註釋
  pCols->GetItem(_T("RecordID"))->Properties->GetItem(_T("AutoIncrement"))->Value=true;//自動編號
  pCols->GetItem(_T("Name"))->Properties->GetItem(_T("Jet OLEDB:Compressed UniCode Strings"))->Value=true;
  pCols->GetItem(_T("Name"))->Properties->GetItem(_T("Description"))->Value=_T("姓名");
  pCols->GetItem(_T("DateOfBirth"))->Properties->GetItem(_T("Description"))->Value=_T("出生日期");
  pCols->GetItem(_T("OtherInfo"))->Properties->GetItem(_T("Jet OLEDB:Compressed UniCode Strings"))->Value=true;
  pCols->GetItem(_T("OtherInfo"))->Properties->GetItem(_T("Description"))->Value=_T("其他資訊");
  //--
  pCatalog->Tables->Append(_variant_t ((IDispatch*)pTable));//新增表
  pCatalog->Tables->Refresh();//重新整理
  pIndexNew.CreateInstance(_T("ADOX.Index"));
  pIndexNew->Name = "RecordID";//索引名稱
  pIndexNew->Columns->Append("RecordID",ADOX::adInteger,0);//索引欄位
  pIndexNew->PutPrimaryKey(-1);//主索引
  pIndexNew->PutUnique(-1);//唯一索引
  pTable->Indexes->Append(_variant_t ((IDispatch*)pIndexNew));//建立索引
  pIndexNew=NULL;
  pCatalog->Tables->Refresh();//重新整理
  tempConnn->Close();
  return TRUE;
 }
 catch(_com_error &e)
 {
  AfxMessageBox(e.Description()); //彈出錯誤處理
  return FALSE;
 }
 catch(...)
 {
 }
 return FALSE;
}

 
// return TRUE;
//}

void ADO::OnInitADOConn()
{
 ::CoInitialize(NULL);
 try
 {
       m_pConnection.CreateInstance("ADODB.Connection");  //建立連線物件例項
    _bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\
   uid=;pwd=;DBQ=DataBase.mdb;";
    m_pConnection->Open(strConnect,"","",adModeUnknown); //開啟資料庫
 }
 catch(_com_error e)
 {
  AfxMessageBox(e.Description()); //彈出錯誤處理
 }
}

_RecordsetPtr&  ADO::OpenRecordset(CString sql)
{
 ASSERT(!sql.IsEmpty());          //SQL語句不能為空
 try
 {
  m_pRecordset.CreateInstance(__uuidof(Recordset)); //建立記錄集物件例項
  m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),
   adOpenDynamic, adLockOptimistic, adCmdText);  //執行SQL得到記錄集
 }
 catch(_com_error e)           //捕獲可能的異常
 {
  AfxMessageBox(e.Description());
 }
 return m_pRecordset;
}

void ADO::CloseRecordset()
{
 if(m_pRecordset->GetState() == adStateOpen) //判斷當前的記錄集狀態
  m_pRecordset->Close();     //關閉記錄集
}

void ADO::CloseConn()
{
 m_pConnection->Close();         //關閉資料庫連線
 ::CoUninitialize();          //釋放COM環境
}

UINT ADO::GetRecordCount(_RecordsetPtr pRecordset)
{
 int nCount = 0;           //宣告儲存記錄數的變數
 try{
  pRecordset->MoveFirst();        //將記錄集指標移動到第一條記錄
 }
 catch(...)            //捕捉可能出現的錯誤
 {
  return 0;           //產生錯誤時返回0
 }
 if(pRecordset->adoEOF)         //判斷記錄集中是否沒有記錄
  return 0;           //無記錄時返回0
 while (!pRecordset->adoEOF)        //當記錄集指標沒有指向最後時
 {
  pRecordset->MoveNext();        //將記錄集指標移動到下一條記錄
  nCount = nCount + 1;        //記錄個數的變數加1
 }
 pRecordset->MoveFirst();         //將記錄集指標移動到第一條記錄
 return nCount;           //返回記錄數
}

//用例
void CUseAdoDlg::AddToGrid()
{
 ADO m_Ado;
 m_Ado.OnInitADOConn();//連線資料庫
 CString SQL = "select * from employees order by 編號 desc"; //設定查詢字串
 m_Ado.m_pRecordset = m_Ado.OpenRecordset(SQL);//開啟記錄集
 while(!m_Ado.m_pRecordset->adoEOF)
 {
  m_Grid.InsertItem(0,"");
  m_Grid.SetItemText(0,0,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("編號"));
  m_Grid.SetItemText(0,1,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("姓名"));
  m_Grid.SetItemText(0,2,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("學歷"));
  m_Ado.m_pRecordset->MoveNext();//將記錄集指標移動到下一條記錄
 }
 m_Ado.CloseRecordset();
 m_Ado.CloseConn();//斷開資料庫連線
}

void CUseAdoDlg::OnButadd()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);
 if(m_ID.IsEmpty() || m_Name.IsEmpty() || m_Culture.IsEmpty())
 {
  MessageBox("基礎資訊不能為空!");
  return;
 }
 ADO m_Ado;
 m_Ado.OnInitADOConn();
 CString sql = "select * from employees";
 m_Ado.m_pRecordset = m_Ado.OpenRecordset(sql);
 try
 {
  m_Ado.m_pRecordset->AddNew(); //新增新行
  m_Ado.m_pRecordset->PutCollect("編號",(_bstr_t)m_ID);
  m_Ado.m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);
  m_Ado.m_pRecordset->PutCollect("學歷",(_bstr_t)m_Culture);
  m_Ado.m_pRecordset->Update(); //更新資料表記錄
  m_Ado.CloseRecordset();
  m_Ado.CloseConn();
 }
 catch(...)
 {
  MessageBox("操作失敗");
  return;
 }
 MessageBox("新增成功");
 m_Grid.DeleteAllItems(); //刪除列表控制元件
 AddToGrid(); 
}
void CUseAdoDlg::OnButmod()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);
 if(m_ID.IsEmpty() || m_Name.IsEmpty() || m_Culture.IsEmpty())
 {
  MessageBox("基礎資訊不能為空!");
  return;
 }
 int pos   = m_Grid.GetSelectionMark();
 ADO m_Ado;
 m_Ado.OnInitADOConn();
 CString sql = "select * from employees";
 m_Ado.m_pRecordset = m_Ado.OpenRecordset(sql);
 try
 {
  m_Ado.m_pRecordset->Move((long)pos,vtMissing);
  m_Ado.m_pRecordset->PutCollect("編號",(_bstr_t)m_ID);
  m_Ado.m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);
  m_Ado.m_pRecordset->PutCollect("學歷",(_bstr_t)m_Culture);
  m_Ado.m_pRecordset->Update();
  m_Ado.CloseRecordset();
  m_Ado.CloseConn();
 }
 catch(...)
 {
  MessageBox("操作失敗");
  return;
 }
 MessageBox("修改成功");
 m_Grid.DeleteAllItems();
 AddToGrid();
}

void CUseAdoDlg::OnButdel()
{
 // TODO: Add your control notification handler code here
 int pos   = m_Grid.GetSelectionMark();
 ADO m_Ado;
 m_Ado.OnInitADOConn();
 CString sql = "select * from employees";
 m_Ado.m_pRecordset = m_Ado.OpenRecordset(sql);
 try
 {
  m_Ado.m_pRecordset->Move(pos,vtMissing);
  m_Ado.m_pRecordset->Delete(adAffectCurrent);
  m_Ado.m_pRecordset->Update();
  m_Ado.CloseRecordset();
  m_Ado.CloseConn();
 }
 catch(...)
 {
  MessageBox("操作失敗");
  return;
 }
 MessageBox("刪除成功");
 OnButclear();
 m_Grid.DeleteAllItems();
 AddToGrid();
}

相關推薦

VC 操作ACCESS建立資料庫,,新增修改刪除記錄

#import "C:\Program Files\Common Files\System\ado\msadox.dll" #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\  rename("EOF","

程式設計實現順序的以下基本操作建立順序修改順序,插入順序刪除順序

#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef int ElemType; typedef int Statu

Django下mysql資料庫的相關操作建立資料、以及增刪查改)

如有疑惑或錯誤之處可評論或郵箱聯絡博主:[email protected] 本文主要記錄了在django下使用mysql資料庫時的相關操作,包括建立資料庫、資料表、以及增刪查改。 博主開發環境:Ubuntu16.04,python2.7,d

Zookeeper客戶端基本操作java實現——建立連線、建立節點、新增修改節點內容、獲取子節點、獲取節點資料、刪除節點

一、引入Zookeeper包,新增pom依賴 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper<

用VB程式碼在SQL SERVER 中建立資料庫,,列.以及對資料庫操作

前面看了一編用VB程式碼建立ACCESS資料庫的文章,寫的很好.根據思路,寫下建立SQL 資料庫的方法,供大家參考.1:引用ADO2.5lib2:在窗體上新增一個按鈕COMMAND13:按鈕程式碼如下:Private Sub Command1_Click()Dim cnn A

關於PyCharm 中使用sqlite建立資料庫不顯示的問題。

1.問題: 在pycharm中將爬取的資料通過sqlite3儲存在資料庫表中,資料庫名稱為:film.sqlite3,建立表名為:filmtop250。過程為 import sqlite3 film = sqlite3.connect('film.sqlite3') create_table

think PHP建立資料庫資料庫更名

引用 use think\Db; 建立表方法 public function createTable($tableName) { $sql = "CREATE TABLE IF NOT EXISTS `$tableName` ( `id` in

python django建立資料庫並連線mysql資料庫(附mysql 8.0.12安裝)

先寫下mysql zip安裝方式,在環境變數中加入mysql/bin路徑,把zip解壓到C:\program files下,在最外層資料夾建立my-default.ini 寫入內容: [mysqld]  basedir=C:\Program Files\MySQL data

Shell 指令碼批量建立資料庫

使用 Shell 指令碼批量建立資料表 系統:Centos6.5 64位 MySQL版本:5.1.73  比如下面這個指令碼: #!/bin/bash #批量新建資料表 for y in {0..199};do mysql -uroot -proot -e "use mysql; cr

按日期建立資料庫--美美美美菜菜菜菜

<?php class TOrderBaseModel extends DbModel { const BASE_TABLE_NAME = 't_order_base'; private static $db_connection; private static

python django建立資料庫並連線mysql資料庫(附mysql安裝)

先寫下mysql zip安裝方式,在環境變數中加入mysql/bin路徑,把zip解壓到C:\program files下,在最外層資料夾建立my-default.ini 寫入內容: [mysqld]  basedir=C:\Program Files\MySQL d

springBoot下java自動建立資料庫

####SpringBoot環境啟動專案建立資料庫表 ####使用環境 windows+eclipse+mysql+navicat ####步驟 1.建立SpringBoot專案 2.新建資料庫,配置連線資訊 3.編寫初始化資料庫表類 4.執行檢視結果 1.建立

Linux C++ 單鏈新增刪除,輸出,逆序操作

/*單鏈表操作*/#include <iostream>using namespace std; class Node{ public: Node(){ next=0; } Node(int el, Node *ptr=0) { info=el; next=ptr;

C#對資料庫新增刪除修改

string str = "server=NO1;database=SuperMarket;integrated security=true"; SqlConnection c

Python學習筆記(2)通過sqlalchemy建立資料庫

在之前的學習筆記中講了如何通過sqlalchemy來連線資料庫,那麼以此為前提我們通過sqlalchemy來建立資料庫表,如果不知道的話請看Python學習筆記(1) 使用sqlalchemy連線mysql # encoding: utf-8 from sqlalchem

SQL_3th_T-SQL語句建立刪除資料庫新增刪除約束

在SQL Server 2008 R2中點選新建查詢,輸入如下程式碼,選中程式碼段,並點選執行,就能執行選中區域程式碼: --使用數T-SQL語句來建立資料庫 create database Students on ( name='Students', --這是資料檔案的邏

java程式碼建立資料庫

 package com.soft.share.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.util.Ar

為學生運動會比賽資訊建立資料庫

需要儲存的資料如下: 運動員sporter(運動員編號sporterid,運動員姓名name,運動員性別sex,所屬系號department)專案item(專案編號itemid,專案名稱itemname,專案比賽地點location)成績grade(運動員編號id,專案編號i

解決Hibernate不能自動建立資料庫的問題

HibernateTest(測試類):package club.mochunrong.hibernate.test; import java.io.PrintStream; import club.mochunrong.hibernate.bean.User; impor

sqlite3建立資料庫

1、建立一個新的資料庫:sqlite3     檔名 先建立一個 Db 目錄,並在 Db 目錄中建立一個 test.db 資料庫檔案,開啟控制檯視窗,命令如下: mkdir Db cd Db sqlite3 test.db 2、開啟一個已經存在的資料庫:sql