程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 用ADO編制SQLPlus程序

用ADO編制SQLPlus程序

編輯:關於VC++

我最近正在學習ADO,並試著做了一個簡單的SQL Plus,在此過程中有一些經驗希望和大家分享。

代碼運行效果圖如下:

編譯時要在stdafx.h中指定正確的路徑:

#import "msado15.dll" no_namespace rename("EOF","adoEOF")

一、連接數據庫

在此例子中我連接了3種常用的數據庫:Access,Oracle,Sql server。關鍵是連接字符

串的不同,如下所示:

HRESULT hr;
_ConnectionPtr m_pConnTemp;
UpdateData();
//Oracle 的連接:
CString strConnection = "Provider=MSDAORA;Data Source=" + m_dbserver +
    ";User ID=" + m_username + "; Password=" + m_passwd;
//Sql server的連接:
CString strConnection = "Provider=SQLOLEDB.1;Data Source=" + m_dbserver +
    ";Initial Catalog=" + m_initDb +  //初始時連接的數據庫
    ";User ID=" + m_username + "; PWD=" + m_passwd;
//Access 的連接:
CString strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
m_filename;
try
{
 hr = m_pConnTemp.CreateInstance("ADODB.Connection");
 if(SUCCEEDED(hr))
 {
  hr=m_pConnTemp->Open((_bstr_t)strConnection,"","",-1);
  OnOK();
 }
}
catch(_com_error e)
{
 CCommon common;
 AfxMessageBox(common.DisplayAdoError(m_pConnTemp));
}

二 、錯誤消息的獲得

當連接或操作ADO時發生錯誤,可以利用_ConnectionPtr對象得到錯誤信息:

CString CCommon::DisplayAdoError(_ConnectionPtr m_pConnection)
{
  long errorcount = m_pConnection->GetErrors()->GetCount();
  _bstr_t add;
  CString ErrorMessage,temp;
  for(short i=0; i<errorcount; i++)
  {
    add = m_pConnection->GetErrors()->GetItem(_variant_t((short)i))->GetDescription();
    temp = (char *)add;
    ErrorMessage += temp;
  }
  return ErrorMessage;
}

三、得到"update","insert"操作的記錄數:

_variant_t fieldCount;
VariantInit (&fieldCount);
MainFrame->m_pUserSet = MainFrame->m_commandptr->Execute(&fieldCount,NULL,adCmdUnknown);
if(!MainFrame->m_pUserSet ->State) //當是Select操作時此條件為假
{
  //fieldCount.lVal中保存的就是"update","insert"操作的記錄數
  View->ShowResult(fieldCount.lVal);
}
VariantClear(&fieldCount);

四、"select"操作的處理:

首先得到所有的字段名作為列表的標題,然後再顯示每一條記錄。

listTable.ShowWindow (SW_SHOW);
listTable.DeleteAllItems();
int nColumnCount = listTable.GetHeaderCtrl()->GetItemCount();
// 刪除所有的列
for (i=0;i < nColumnCount;i++)
{
   listTable.DeleteColumn (0);
}
int fieldCount=Rsc->Fields ->Count; //得到字段的總數
int fieldLength = 0;
FieldPtr m_fieldCtl;
for(i=0;i<fieldCount;i++)
{
 m_fieldCtl = Rsc->Fields ->GetItem(long(i));  //得到字段名
 fieldLength = m_fieldCtl->DefinedSize*10;
 if (fieldLength >500)  //when field is very long then trim it
 {
    fieldLength = 500;
 }
 else if (fieldLength < 50)
 {
    fieldLength = 50;
 }
 if (fieldLength<m_fieldCtl->Name.length ()*12)
 {
    fieldLength = m_fieldCtl->Name.length ()*12;
 }
 listTable.InsertColumn(i,m_fieldCtl->Name,LVCFMT_LEFT,fieldLength);
}
int nItem = 0;
_variant_t varValue;
_bstr_t bstrValue;
while(!Rsc->adoEOF)
{
 m_fieldCtl = Rsc->Fields ->GetItem(long(0));  //得到字段的值
 varValue = m_fieldCtl->Value;
 if (varValue.vt == VT_NULL) //注意:當值為空時,直接插入會導致異常
 {
    bstrValue = "";
 }
 else
 {
    bstrValue=varValue;
 }
 nItem=listTable.InsertItem(0xffff,bstrValue); //fisrt value
 for(i=1;i<fieldCount;i++) //next all value
 {
    m_fieldCtl = Rsc->Fields ->GetItem(long(i));
    varValue = m_fieldCtl->Value;
    if (varValue.vt == VT_NULL)
    {
      bstrValue = "";
    }
    else
    {
      bstrValue=varValue;
    }
    listTable.SetItem(nItem,i,1,bstrValue,NULL,0,0,0);
 }
 Rsc->MoveNext ();
}

五、其它

其它的就是一些和界面顯示有關的內容,和ADO關系不大,在此就不做介紹了。有興趣的朋友可以直接看代碼。

如果還有什麼疑問,請直接和我聯系,非常希望和各位朋友一起探討,共同進步。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved