在ado和access的情况下,用INSERT INTO语句插入到数据库中

一、条件情况:1、多文档工程,

                  2、在App中的.h中定义 _ConnectionPtr   m_pConnection;

                 3、在App中的.cpp中在初始化函数中进行了数据库的连接和创建一个表和在标准添加数据

int CDrawYunApp::ADOInit(void)
{ 
	//AfxOleInit();//初始化com,创建ado连接等操作,调用之后函数里面会自动进行
                   // AfxOleInit()在前面已经调用过了,所以注释掉 
	             //AfxOleInit()初始化COM库的优点就在于资源的释放也是自动进行的,所以不必担心资源泄漏的问题
	m_pConnection.CreateInstance(__uuidof(Connection)); //创建Connection对象,通过uuid创建对象,这个uuid是唯一的.比过名字创建对象好,后者可能会出现冲突.

	//////////////打开本地Access库DrawYun.mdb////////////////
	 try     
	 {              //打开本地Access库Demo.mdb          
		   m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=access\\DrawYun.mdb",            
		   "","",adModeUnknown);//注意代码的拼写错误!!! 
		   //解释://Microsoft.Jet.OLEDB.4.0为数据库驱动引擎或微软接入口版本,Data Source后面是连接的数据库存放的位置。 两个""的意义是:第一个""是用户名,第二个""是密码,
		   //由于你没有用户名和密码,所以这两项均为空;adModeUnknown 表示目前用ado连接数据库的方式
		   //还不知道ad--ADO Mode-方式模式 Unknown-不知道,这种方式以后可以在程序中
		   //以表、视图、查询、SQL、过程等方式提取数据
	 }      
	 catch(_com_error e)   ////捕捉异常   
	 {       
		// AfxMessageBox(_T("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!"));    
	    // return FALSE; 

		 CString strError;                     
         strError.Format( _T("连接数据库发生异常! \r \n错误信息:%s"), e.ErrorMessage( ) );  

        //显示错误信息
        AfxMessageBox(strError); 
	 } 

	 //创建表
	 _variant_t RecordsAffected;
	 try
       {
          CString strCommand;

            /*

           执行SQL命令:CREATE TABLE创建表格

           该表包含三个字段:记录编号 INTEGER,姓名 TEXT,出生年月 DATETIME

           SQL语言中的create table语句被用来建立新的数据库表格。

           create table语句的使用格式如下:

           create tablename (column1 data type,column2 data type,column3 data type);

           如果用户希望在建立新表格时规定列的限制条件,可以使用可选的条件选项

           create table tablename 
               (column1 data type[constraint],
              column2 data type[constraint],
              column3 data type[constraint]);

       

            举例:

           create table employee
           (firstname varchar(15),
           lastname varchar(20),
           age number(3),
           address varchar(30),
           city varchar(20));
           简单来说,创建新表格时,在关键词create table后面加入所要建立的表格的名称,
           然后在括号内顺次设定各列的名称,数据类型,以及可选的限定条件等。
           

           使用SQL语句创建的数据库表格和表格中列的名称必须以字母开头,
           后面可以使用字母,数字或下划线,名称的长度不能超过30个字符,
           注意,用户在选择表格名称时不要使用SQL语言中的保留关键字,
           如select,create,insert等,作为表格或列的名称
            */

           strCommand.Format(_T("CREATE TABLE %s(记录编号 INTEGER,姓名 TEXT,出生年月 DATETIME)"),_T("student"));

           //Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)
           //其中CommandText是命令字串,通常是SQL命令,
           //参数RecordsAffected是操作完成后所影响的行数
           //参数Options表示CommandText中内容的类型,可以取下列值之一:
           //adCmdText 表明CommandText是文本命令
           //adCmdTable 表明CommandText是一个表名
           //adCmdProc 表明CommandText是一个存储过程
           //adCmdUnknown 未知

		   //_bstr_t:_variant_t和_bstr_t这两个类分别封装并管理VARIANT和BSTR这两种数据类型,VARIANT和BSTR这两种类型是COM中使用的数据类型。
		   //通过_variant_t和_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了

          m_pConnection->Execute(_bstr_t(strCommand),&RecordsAffected,adCmdText);//创建表
		    

           //if(m_pConnection->State)
           //   m_pConnection->Close();/////如果已经打开了连接则关闭
       }

       catch(_com_error &e)

       {

           AfxMessageBox(e.Description());

       }
	  ///往表格里面添加记录
	   CString str;
	    str.Format(_T("Yunge"));
	   CString str1;
	//   str1.Format(_T("INSERT INTO student(记录编号,姓名,出生年月)VALUES (1, '"+str+"','1970/1/1')"));
	    str1.Format(_T("INSERT INTO student(记录编号,姓名,出生年月)VALUES (1, '%s','1970/1/1')"),str);
	   m_pConnection->Execute(_bstr_t(str1),&RecordsAffected,adCmdText);
	    //m_pConnection->Execute(_T("INSERT INTO student(记录编号,姓名,出生年月)VALUES (1,'Yunge','1970/1/1')"),&RecordsAffected,adCmdText);
	return 0;
}

//程序退出时删除new的堆
int CDrawYunApp::ExitInstance()

{

//关闭ado的access数据库连接
   m_pConnection->Close( );
   m_pConnection=NULL;

}

二、在创建的对话框中,在已经创建的表中插入数据

void CDataSaveConfigeDlg::OnBnClickedOk()
{
	// TODO: Add your control notification handler code here
	int rowCount;
	CString strSql,orderStr,iedStr,ycStr,timeStr;
	rowCount = m_list.GetItemCount();
	_variant_t RecordsAffected; 
	CDrawYunApp * pApp =(CDrawYunApp *)AfxGetApp();
	for(int i=0;i<rowCount;i++)
	{ 
		try
	   {
			orderStr = m_list.GetItemText(i ,0);
			iedStr = m_list.GetItemText(i ,1);
			ycStr = m_list.GetItemText(i ,2);
			timeStr = m_list.GetItemText(i ,3);
			//strSql.Format(_T("INSERT INTO HisDataConfig(序号,装置名,遥测名,采样周期(分))VALUES ('%s','%s','%s','%s')"),orderStr,iedStr,ycStr,timeStr);
			strSql.Format(_T("INSERT INTO [HisDataConfig]([序号],[装置名],[遥测名],[采样周期(分)])VALUES ('"+orderStr+"','"+iedStr+"','"+ycStr+"','"+timeStr+"')"));
			if(pApp->m_pConnection)
			{
			  pApp->m_pConnection->Execute(_bstr_t(strSql),&RecordsAffected,adCmdText);
			}
	    }
		catch(_com_error &e)
		{
		  AfxMessageBox(e.Description());
		}
	}
	CDialogEx::OnOK();
}


三、在。app中可行的插入,但在对话框中不行的三种方法

1、CString str;
  str.Format(_T("Yunge"));
  m_pConnection->Execute(_bstr_t(_T("INSERT INTO student(记录编号,姓名,出生年月)VALUES (1,'"+str+"','1970/1/1')")),&RecordsAffected,adCmdText);
  2、CString str;
     str.Format(_T("Yunge"));
     CString str1;
	str1.Format(_T("INSERT INTO student(记录编号,姓名,出生年月)VALUES (1, '"+str+"','1970/1/1')"));
	m_pConnection->Execute(_bstr_t(str1),&RecordsAffected,adCmdText);
  3、把2中的倒数第二句换成str1.Format(_T("INSERT INTO student(记录编号,姓名,出生年月)VALUES (1, '%s','1970/1/1')"),str);也行
但在对话框使用时还是出现“INSERT INTO语句语法错误”


查找过程中几个重要的连接:1、http://zhidao.baidu.com/link?url=YlQQ2O7SU8_hRTA3uDfRIv7auSnV-y0Y_v_raVPk-ThIxF2g4sUeko8DWAplWyfuoTPxpQOZljLrZW6xLPmSN_

 

   总之两点:在插入时有变量时,如变量str,改成 '"+str+"',还有在  表名和字段名添加中括号  

    补充:在创建Access数据库中的表中的四个字段原来类型都是备注,现在修改成两个数字和两个文本,还是能够进行插入。原来代码中的CString类型不影响数据库中字段的类型        

 不知道'"+str+"'是什么用法               

初学数据库进行记录,以便以后回顾和初学者的参考

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章