直接执行SQL命令,ADO连接数据库

更新时间:2023-12-31 01:46:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

http://www.5itjob.com

ADO数据库编程-直接执行SQL命令

【ITjob课程资料】

直接执行SQL命令

上面的案例的增删改我们通过ADO智能对象帮助我们完成,ADO智能对象自动读取RecordSet中的记录,并形成对应的SQL语句。 也可以直接执行SQL语句。下面我们一一列举:

(1)、利用Connection对象的Execute方法执行SQL命令,原型如下:

_RecordsetPtr Connection15::Execute (

_bstr_t CommandText, VARIANT *RecordsAffected, long Options );

其中CommandText通常是SQL命令字符串。RecordsAffected是操作完成后所影响的行数, Options表示CommandText中内容的类型,Options可以取如下值之一:

? adCmdText:表明CommandText是SQL文本命令 ? adCmdTable:表明CommandText是一个表名 ? adCmdProc:表明CommandText是一个存储过程 ? adCmdUnknown:未知

Execute执行完后返回一个指向记录集的指针,下面我们给出示例代码并作说明:

//执行SQL命令:CREATE TABLE创建表格users,users包含四个字段: //整形ID,字符串username,整形age,日期型birthday _variant_t RecordsAffected;

m_pConnection->Execute(\

age INTEGER, birthday DATETIME)\,&RecordsAffected,adCmdText);

//往表格里面添加记录

m_pConnection->Execute(\INTO users(ID,username,age,birthday)

VALUES (1, 'Washington',25,'1970/1/1')\,&RecordsAffected,adCmdText);

//将所有记录的age字段的值加一 m_pConnection->Execute(%users SET age = age+1\,&RecordsAffected,adCmdText);

//执行SQL统计命令得到包含记录条数的记录集

m_pRecordset = m_pConnection->Execute(\

&RecordsAffected, adCmdText);

_variant_t vIndex = (long)0;

_variant_t vCount = _pRecordset->GetCollect(vIndex);//取得第一个字段的

http://www.5itjob.com

值放入vCount变量

m_pRecordset->Close(); //关闭记录集 CString message;

message.Format(\共有%d条记录\,vCount.lVal); AfxMessageBox(message); //显示当前记录条数

(2)、利用Command对象来执行SQL命令 _CommandPtr m_pCommand;

m_pCommand.CreateInstance(\_variant_t vNULL; vNULL.vt = VT_ERROR;

vNULL.scode = DISP_E_PARAMNOTFOUND; //定义为无参数 m_pCommand->ActiveConnection = m_pConnection; //非常关键,将建立的连接赋值给它

m_pCommand->CommandText = \命令字符串 m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);//执行命令,取得记录集

下面我们通过发送SQL完成一个类似oracle的SqlPlus功能,界面如下:

一个List控件,一个支持多行的Edit控件(IDC_STRSQL)。 (1) 添加一个支持该界面的对话框类,并将List控件绑定变量 (2) 在WM_INIDIALOG消息中实现数据库初始化,代码如下: m_pConnection.CreateInstance(_uuidof(Connection));

m_pConnection->Open(\Source

http://www.5itjob.com

= student.mdb;\

m_pRecordSet.CreateInstance(_uuidof(Recordset));

GetDlgItem(IDC_STRSQL)->SetFocus();

SetDlgItemText(IDC_STRSQL, \ OnQuery();

(3) 在WM_DESTORY消息中实现释放,代码如下: m_pConnection->Close(); (4) OnQuery()函数的代码如下: CString strSQL;

GetDlgItemText(IDC_STRSQL, strSQL);

if (strSQL.IsEmpty()) {

MessageBox(\不能为空!\ return ; }

const char *szsql = strSQL; try {

m_pRecordSet->Open(szsql,

m_pConnection.GetInterfacePtr(),

adOpenDynamic, adLockOptimistic, adCmdText); DisplayFields(); }

catch(...) {

MessageBox(\请检查SQL语句是否合法!\ return ; }

m_pRecordSet->Close(); (5) DisplayFields代码如下: m_list.DeleteAllItems(); int i;

//1. 删除原来所有的列标题

int nColumnCount = m_list.GetHeaderCtrl()->GetItemCount(); for (i = 0; i < nColumnCount; i++) {

m_list.DeleteColumn(0); }

http://www.5itjob.com

//2. 根据结果集,重新设置列标题

int fieldCount = m_pRecordSet->Fields->Count; //得到字段的总数 for (i = 0; i < fieldCount; i++) {

FieldPtr fieldCtl = m_pRecordSet->Fields->GetItem(long(i)); //得到字段名控件

int fieldLength = fieldCtl->DefinedSize * 4;

m_list.InsertColumn(i, fieldCtl->Name, LVCFMT_LEFT, 80); }

//3. 将新结果集加到显示列表中 while (!m_pRecordSet->EndOfFile) {

//插入第一列的值

FieldPtr fieldCtl = m_pRecordSet->Fields->GetItem(long(0)); //得到字段名控件

_variant_t varValue = fieldCtl->Value;

_bstr_t bstrValue = ((varValue.vt == VT_NULL) ? \ //注意:当值为空时,直接插入会导致异常

int nItem = m_list.InsertItem(0xffff, bstrValue); //插入第一列的值

//设置其他列的值

for (i = 1; i < fieldCount; i++) {

fieldCtl = m_pRecordSet->Fields->GetItem(long(i)); varValue = fieldCtl->Value;

bstrValue = ((varValue.vt == VT_NULL) ? \注意:当值为空时,直接插入会导致异常

m_list.SetItem(nItem, i, 1, bstrValue, NULL, 0, 0, 0); }

m_pRecordSet->MoveNext (); //准备处理下一条记录 }

(6) 最后在主界面上添加一个按钮并打开这个对话框:

相关资料与视频请访问ITjob就业培训网

本文来源:https://www.bwwdw.com/article/hjmx.html

Top