您的位置:首页 > 数据库

初学VC+数据库的总结

2006-09-26 20:40 197 查看
       我用了近三周的时间才摸清了VC与数据库结合的来龙去脉,期间由于参考书的错误便我走了不少弯路,现在虽然只还是不能有很深的理解,但是已基本上能对简单的数据库进行控制,现借CSND之宝地记我的学习历程。以便给自己和后学者一点警告和启示!

         一、添加ADO Data控件与DataGrid控件:

        ADO Data 控件是使用ADO技术访问数据库的具体实现。首先,可以用ADO Data 控件快速地建立一个到数据库的连接;其次,ADO Data控件使用RECORDSET对象对存储在数据库中数据的访问;第三,ADO Data控件可以执行大部分数据库访问操作,不过它不能显示数据库中的数据,要与其它控制结合来使用。而DataGrid以表格的形式显示结果,它要ADO  Data控件提供数据源。更详细的信息可以找相关的资料。

        这两个控件都要手动加到控件工具栏上,从工具栏上选择这两个控件放到对话框中后要对它们进行设置,要重点注意以下几点:1、ADO Data 只是用来连接数据库,所以选择不可见;2、ADO Data要设置连接属性,这里要对数据库与登录方式进行选择,因此这里要稍加注意;3、DataGrid控件要与ADO Data相连接。

         到目前我认为ADO Data与DataGrid主要用来进行数据库数据的显示。如有不对,请指正。谢谢!

        二、对数据显示的处理:

        数据显示时往往要对其进行处理才能达到用户的满意。首先,ADO Data的属性中记录源中的命令类型中选择1-adCmdText,然后在SQL编辑框中输入SQL语句,注意在这要把SQL语句写正确,我在这里因为少写了个GO而困扰了N久!(CommandType:指明形成记录集的命令的类型,为1-adCmdText表示形成记录集的是SQL命令,为2-adCmdTable表示记录集由表构成,为4-adCmdStoredProc由存储过程生成记录集,为8-adCmdUnknown未知命令类型。)

           然后在对话框初始化时对显示进行控制,可以添加初始化函数,SetRecordSource()函数功能是设置ADO Data控件的数据源,参数为SELECT语句,因此可以用AS关键字设置显示标题,接着用Refresh()函数据刷新结果集。 GetColumns()函数可以返回相应的Columns对象,使用GetItem(vIndex)可以返回指定列对应的Columns对象。 
             当然,这以上几步可以写成一个REFRES函数,方便调用。代码类似如下所列:

 m_adodc.SetRecordSource("SELECT Emp_id,Dep_name as 员工姓名,sex as 性别,title as 职务,wage as 工资 FROM Employees");
 m_adodc.Refresh();

 _variant_t vIndex;
 vIndex=long(0);
 m_datagrid.GetColumns().GetItem(vIndex).SetWidth(0);

 vIndex=long(1);
 m_datagrid.GetColumns().GetItem(vIndex).SetWidth(100);
 
 vIndex=long(2);
 m_datagrid.GetColumns().GetItem(vIndex).SetWidth(80);
 
 vIndex=long(3);
 m_datagrid.GetColumns().GetItem(vIndex).SetWidth(100);
 
 vIndex=long(4);
 m_datagrid.GetColumns().GetItem(vIndex).SetWidth(90);

           三、使用ADO访问数据库:
 
          1、导入ADO库文件。

          用#import引入ADO库文件
          #import "c:/program files/common files/system/ado/msado15.dll"no_namespaces rename("EOF" adoEOF")

  这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。

           2、添加类:这个类现对数据库的连接、执行、退出连接等函数据,以便在以后应用。代码如下:

#if !defined(AFX_ADOCONN_H__2BC07DB1_94D0_43A9_8C59_B5E14FBD430B__INCLUDED_)
#define AFX_ADOCONN_H__2BC07DB1_94D0_43A9_8C59_B5E14FBD430B__INCLUDED_

//#include "C:/Program Files/Common Files/System/ado/msader15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")

#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class ADOConn 
{
public:
 _RecordsetPtr m_pRecordset;//指向CONNECTION对象的指针
 _ConnectionPtr m_pConnection;//返回查询结果
public:
 void ExitConnect();//关闭记录集与连接
 BOOL ExecuteSQL(_bstr_t bstrSQL);//执行没有返回结果的SQL语句
 _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);//执行查询语句可以返回结果
 void OnInitADOConn();//初始化连接数据库
 ADOConn();
 virtual ~ADOConn();

};
具体的函数据如下:

请细细地看这些代码,看代码比看注释好上几倍!

void ADOConn::OnInitADOConn()
{
 ::CoInitialize(NULL);
// AfxOleInit();
 try
 {
  m_pConnection.CreateInstance(__uuidof(Connection)); //"ADODB.Recordset");//问题就在这了
 _bstr_t strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial

Catalog=HrMan;Data Source=BB";
  //Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=HrMan;Data

Source=BB
  // m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security

Info=False;Initial Catalog=HrMan";
 
 // m_pConnection->Open("","","",adConnectUnspecified);
  
  m_pConnection->Open(strConnect,"","",adModeUnknown);
 }
 catch(_com_error e)
 {
  AfxMessageBox("连接有问题");//
  AfxMessageBox(e.Description());
 }
 

}

_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
 try
 {
  if(m_pConnection==NULL)
   OnInitADOConn();
  m_pRecordset.CreateInstance(_uuidof(Recordset));
  m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 
 }
 catch(_com_error e)
 {
  AfxMessageBox("查询有错误");
  AfxMessageBox(e.Description());
 }
 return m_pRecordset;

}

BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
 try
 {
  if(m_pConnection==NULL)
   OnInitADOConn();
   //OnInitADOConn
  m_pConnection->Execute(bstrSQL,NULL,adCmdText);
  return true;
 }
 catch(_com_error e)
 {
  AfxMessageBox("插入有问题");
  AfxMessageBox(e.Description());
  return false;
 }

}

void ADOConn::ExitConnect()
{
 if(m_pRecordset!=NULL)
  m_pRecordset->Close();
 m_pConnection->Close();
 ::CoUninitialize();
}

             四、对数据库操作的过程:

            1、定义ADOCONN对象
            2、执行SQL语句
            3、关闭连接

              关于这一步可以参照以下代码理解,这是一个INSERT语句的执行过程:

 ADOConn m_AdoConn;
 m_AdoConn.OnInitADOConn();
 _bstr_t vSQL; vSQL="INSERT INTO Employees(Dep_Name,Sex,Title,Wage,Dep_id)VALUES('"+m_EmpName+"','"+strSex+"','"+m_Title+"','"+strWage+"',1)";
 m_AdoConn.ExecuteSQL(vSQL);
 m_AdoConn.ExitConnect();

            五、控件与ADO访问的区别:

           控件的访问只是对数据进行输出,而并没有对之旱灾行具体的操作、而ADO是对数据旱灾行操作而不对之进行显示,二者结合能很好地实现VC中使用数据库。

            六、心得:

           这是我用了近三周的时间所理解的,真的很慢,但是我真是学到了一些东西,虽然我也知我以上总结的有很多不足,但我会坚持下去的,我会用一定的时间对VC进行全面学了,这只是一个开始。万事开头难,我相信随着知识的增加我以后会以更快的速度学,以更高效的方法向VC进军,以后我的BLOG会陆续记录我的学习总结,我也相信在大家的帮助下我的总结会越写越好!谢谢你们的批评指正!

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息