Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2005325
  • 博文数量: 960
  • 博客积分: 52560
  • 博客等级: 大将
  • 技术积分: 13131
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-31 14:15
文章分类

全部博文(960)

文章存档

2011年(1)

2008年(959)

我的朋友

分类: C/C++

2008-08-01 16:54:25

下载本文示例代码
下载本文配套工程

我最近正在学习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; iGetErrors()->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;iFields ->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 (fieldLengthName.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;iFields ->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关系不大,在此就不做介绍了。有兴趣的朋友可以直接看代码。
如果还有什么疑问,请直接和我联系,非常希望和各位朋友一起探讨,共同进步。

作者邮箱:gaochun@ec.necsi-sh.nec.com.cn 或 firstyi2002@yahoo.com.cn

下载本文示例代码
阅读(376) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~