⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ociexampledlg.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    if(TableName=="")return;	
    //代码5.2,处理SQL的第一步,准备SQL
	sword status;
    text textSQL[1024];
	wsprintf((char*)textSQL,"SELECT * FROM %s",TableName);
	if(status=OCIStmtPrepare(stmthp,errhp,textSQL,strlen((char *)textSQL),OCI_NTV_SYNTAX,OCI_DEFAULT ))
	{
		ErrorProc(errhp,status);
		return;
	}

	//代码5.3,处理SQL的第三步,执行
	if(status=OCIStmtExecute(svchp,stmthp,errhp,(ub4)0,0,NULL,NULL,OCI_DEFAULT))
	{
		ErrorProc(errhp,status);
		return;
	}
    //代码5.4,处理SQL的第四步,描述
    ub4 col_num;//存放SELECT语句选中的列数
	//代码5.4.1,读取选择列表中的项数
	ErrorProc(errhp,OCIAttrGet(stmthp,OCI_HTYPE_STMT,&col_num,0,
		OCI_ATTR_PARAM_COUNT,errhp));
	//
	ColumnNumbers=(int)col_num;
	text     *namep; //字段名称
	ub4       sizep; //字段名称的字符串长度
    text tempText[100];
	//获取表的字段的属性信息
	int i;
    for(i=0;i<(int)col_num;i++)
	{
		//为选择项分配参数描述符
		ErrorProc(errhp,OCIParamGet(stmthp,OCI_HTYPE_STMT,errhp,(void **)&colhp,
				ub4(i+1)));
		//读取选择项的数据长度
		ErrorProc(errhp,OCIAttrGet(colhp,OCI_DTYPE_PARAM,&collen[i],0,
			OCI_ATTR_DATA_SIZE,errhp));
		//读取选择项的数据类型
		ErrorProc(errhp,OCIAttrGet(colhp,OCI_DTYPE_PARAM,&coltype[i],0,
			OCI_ATTR_DATA_TYPE,errhp));
		//----------------------------------------------------------------
		//若字段为数字类型的数据,我们获取其数字的总长度与小数位数
        ub1       precision;  //typedef unsigned char  ub1;                   
	    sb1       scale;  //typedef   signed char  sb1;
		//由参数描述符来获取这一列的总的长度
		ErrorProc(errhp,OCIAttrGet(colhp, (ub4)OCI_DTYPE_PARAM, 
			       (dvoid *)&precision, (ub4 *)0, (ub4)OCI_ATTR_PRECISION,
				   errhp));
        iprecision[i]=(int)precision;

		//由参数描述符来获取这一列的小数的长度
		ErrorProc(errhp,OCIAttrGet(colhp, (ub4)OCI_DTYPE_PARAM, 
			       (dvoid *)&scale, (ub4 *)0, (ub4)OCI_ATTR_SCALE,
				   errhp));
        iscale[i]=(int)scale;
		//----------------------------------------------------------------
		//若这个自动为日期型,则把其字符宽度置为30
		if(coltype[i]==SQLT_DAT)
            collen[i]=30;
		//分配缓冲区
		colbuf[i]=(text *)new text[(int)collen[i]+1];
		//代码5.4.2获取字段名称
		ErrorProc(errhp,OCIAttrGet(colhp, (ub4)OCI_DTYPE_PARAM, 
			               (dvoid *)&namep, (ub4 *)&sizep, (ub4)OCI_ATTR_NAME,
						   errhp));
		strncpy((char *)tempText, (char *)namep, (size_t) sizep);
 	    tempText[sizep] = '\0';
		//把字段的名称赋予字段名称数组
        ColName[i].Format("%s",tempText);
	}
    
	//代码5.5,处理SQL的第五步,定义变量
	 for(i=0;i<(int)col_num;i++)
	 {
		 //若字段的变量类型的宏定义的值小于23时,我们才绑定
		 //那么,我们可以处理的字段类型包括
		 /*
		#define SQLT_CHR  1                         (ORANET TYPE) character string 
		#define SQLT_NUM  2                           (ORANET TYPE) oracle numeric 
		#define SQLT_INT  3                                  (ORANET TYPE) integer 
		#define SQLT_FLT  4                    (ORANET TYPE) Floating point number 
		#define SQLT_STR  5                                 zero terminated string 
		#define SQLT_VNU  6                         NUM with preceding length byte 
		#define SQLT_PDN  7                   (ORANET TYPE) Packed Decimal Numeric 
		#define SQLT_LNG  8                                                   long
		#define SQLT_VCS  9                              Variable character string 
		#define SQLT_NON  10                       Null/empty PCC Descriptor entry 
		#define SQLT_RID  11                                                 rowid 
		#define SQLT_DAT  12                                 date in oracle format 
		#define SQLT_AFC  96                                      Ansi fixed char 
        SQLT_AFC--即CHAR,固定字符长度的字符串
         */
		 if(coltype[i]<13)
		 {
			 if(status=OCIDefineByPos(stmthp,&defhp[i],errhp,i+1,(ub1*)colbuf[i],
				collen[i]+1,SQLT_STR,&ind[i],0,0,OCI_DEFAULT))
			{
				ErrorProc(errhp,status);
				return;
			}
		 }
		 //否则,我们不绑定,仅仅把字段值置为“Object”
		 else
           strncpy((char *)colbuf[i],"Object",7);
	 }

	//代码5.6
    //处理SQL的第六步,取值
	int row=0;
	while((OCIStmtFetch(stmthp,errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT))!=OCI_NO_DATA)
	{
       for(i=0;i<(int)col_num;i++)
		{
			//把获取的用户的基表的数据
			//赋予字段数值数组
		    ColVal[row][i]="";//清空字段值数组
		    if(ind[i]==-1)//对空值的处理
               ColVal[row][i]="";
			else
			  ColVal[row][i]=colbuf[i];            
		}
		row=row+1;
  	}
	//删除所分配的缓冲区
	for(i=0;i<(int)col_num;i++)
       delete  colbuf[i];

	//代码5.7,把获取的数据显示到ListCtrl上
	m_listCtrl.ModifyStyle(NULL,  LVS_REPORT);
	m_listCtrl.SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES);
	//
    m_listCtrl.SetFocus();
	//加ListCtrl的标题
	int ColNumber;
	ColNumber=m_listCtrl.GetHeaderCtrl()->GetItemCount();
	for(i=0;i<ColNumber;i++)
       m_listCtrl.DeleteColumn(0);
    for(i=0;i<(int)col_num;i++)
      m_listCtrl.InsertColumn(i,ColName[i],LVCFMT_LEFT,60,0);
    //加ListCtrl的内容
    m_listCtrl.DeleteAllItems();
	for(i=0;i<row;i++)
	{   
        m_listCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, i, 
			                             ColVal[i][0], 
          (i%2)==0 ? LVIS_SELECTED : 0, LVIS_SELECTED,
                                                0, 0);
		for(int j=1;j<(int)col_num;j++)
			m_listCtrl.SetItemText(i, j, ColVal[i][j]);
	}
	//代码6.1
	//初始化选择所查询字段的ComboBox控件
	//先清空
    for(i=0;i<m_comboCtrl.GetCount();i++)
       m_comboCtrl.DeleteString(0);
    for(i=0;i<(int)col_num;i++)
      m_comboCtrl.AddString(ColName[i]);
	m_strcondition=">";
    m_strFieldName="SAL";
	m_strFieldVal="800";
	//代码8.1
	//初始化修改字段时的ComboBox控件
    //先清空
    for(i=0;i<m_comConFNameCtrl.GetCount();i++)
       m_comConFNameCtrl.DeleteString(0);
    for(i=0;i<(int)col_num;i++)
        m_comConFNameCtrl.AddString(ColName[i]);
	UpdateData(false);
   //GetDlgItem(IDC_COBFNAME)->AddString(ColName[i]);
	//
	//使得操作表的按钮可用
	GetDlgItem(IDC_BUT_QUERY)->EnableWindow(true);
    GetDlgItem(IDC_BUT_DELETE )->EnableWindow(true);
	GetDlgItem(IDC_BUT_UPDATE )->EnableWindow(true);
	GetDlgItem(IDC_BUT_INSERT )->EnableWindow(true);

	
}


void COCIExampleDlg::OnButQuery() 
{
	// 代码6.2
	//int item=m_comboCtrl.GetCurSel();
    //m_comboCtrl.GetLBText( item,FieldName);
	//获取条件
	UpdateData(TRUE);
    //获取所选择的字段名称
	CString FieldName;
    FieldName=m_strFieldName;
	CString strCondition;
    strCondition=m_strcondition;
	//获取查询字段的数值
	CString strFieldVal=m_strFieldVal;
	//代码6.3,处理SQL的第一步,准备SQL语句
	sword status;
    text textSQL[1024];
	wsprintf((char*)textSQL,"SELECT * FROM %s WHERE %s %s :CONDITION",TableName,FieldName,strCondition);
	if(status=OCIStmtPrepare(stmthp,errhp,textSQL,strlen((char *)textSQL),OCI_NTV_SYNTAX,OCI_DEFAULT ))
	{
		ErrorProc(errhp,status);
		return;
	}
	  /*
    sb4      enamelen = 10;
    sb4      joblen = 9;
    text     *cp, *ename, *job, *dept;
    sb4      enamelen = 10;
	sb2  myind=-110;
    */
	//代码6.4,处理SQL的第二步,绑定(binding)
	text  *textConValp;//条件字段的数值
    sb4    len;
	int strlength=strFieldVal.GetLength();
    textConValp=new text[strlength+1];
    wsprintf((char*)textConValp,"%s",strFieldVal);
    textConValp[strlength]='\0';
	len=strlen((const char *)textConValp)+1;
	//strlen(":CONDITION")//原来是输入时,计算的占位符的长度不够
	//由名称来绑定
	if(status=OCIBindByName(stmthp, &bidhp[0], errhp, 
	(text *) ":CONDITION",-1, (ub1 *) textConValp,len, 
		      SQLT_STR,  0,0,  0, 0, 0, OCI_DEFAULT))
                            
	                    
	{
        ErrorProc(errhp,status);
		return;
	}

	//代码6.5,处理SQL的第三步,执行
	if(status=OCIStmtExecute(svchp,stmthp,errhp,(ub4)0,0,NULL,NULL,OCI_DEFAULT))
	{
		ErrorProc(errhp,status);
		return;
	}
	//代码6.6,处理SQL的第四步,描述
    ub4 col_num;//存放SELECT语句选中的列数
	//读取选择列表中的项数
	ErrorProc(errhp,OCIAttrGet(stmthp,OCI_HTYPE_STMT,&col_num,0,
		OCI_ATTR_PARAM_COUNT,errhp));
    for(int i=0;i<(int)col_num;i++)
	{
		//为选择项分配参数描述符
		ErrorProc(errhp,OCIParamGet(stmthp,OCI_HTYPE_STMT,errhp,(void **)&colhp,
				ub4(i+1)));
		//读取选择项的数据长度
		ErrorProc(errhp,OCIAttrGet(colhp,OCI_DTYPE_PARAM,&collen[i],0,
			OCI_ATTR_DATA_SIZE,errhp));
		//读取选择项的数据类型
		ErrorProc(errhp,OCIAttrGet(colhp,OCI_DTYPE_PARAM,&coltype[i],0,
			OCI_ATTR_DATA_TYPE,errhp));
		//若这个自动为日期型,则把其字符宽度置为30
		if(coltype[i]==SQLT_DAT)
            collen[i]=30;
		//分配缓冲区
		colbuf[i]=(text *)new text[(int)collen[i]+1];
	}
    
	//代码6.7,处理SQL的第五步,定义变量
	for( i=0;i<(int)col_num;i++)
	 {
		 //解释参见OnBTableselectok()函数中的代码5.5
		 if(coltype[i]<13)
		 {
			if(status=OCIDefineByPos(stmthp,&defhp[i],errhp,i+1,(ub1*)colbuf[i],
				collen[i]+1,SQLT_STR,&ind[i],0,0,OCI_DEFAULT))
			{
				ErrorProc(errhp,status);
				return;
			}
		 }
		 else
			 strncpy((char *)colbuf[i],"Object",7);

	 }

    //代码6.8,处理SQL的第六步,取值
	int row=0;
	//status=OCIStmtFetch(stmthp,errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT);
	while((OCIStmtFetch(stmthp,errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT))!=OCI_NO_DATA)
	{
       for(i=0;i<(int)col_num;i++)
		{			
		   //把获取的用户的基表的数据
		   //赋予字段数值数组
		   ColVal[row][i]="";//清空字段值数组
		   if(ind[i]==-1)//对空值的处理
              ColVal[row][i]="";
		   else
			  ColVal[row][i]=colbuf[i];            
		}
		row=row+1;
  	}
	//删除所分配的缓冲区
	for(i=0;i<(int)col_num;i++)
       delete  colbuf[i];
    //代码6.9,刷新ListCtrl控件
    //加ListCtrl的内容
    m_listCtrl.DeleteAllItems();
	for(i=0;i<row;i++)
	{   
       	 m_listCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, i, 
			                             ColVal[i][0], 
          (i%2)==0 ? LVIS_SELECTED : 0, LVIS_SELECTED,
                                                0, 0);
		for(int j=1;j<(int)col_num;j++)
		m_listCtrl.SetItemText(i, j, ColVal[i][j]);
	}
	delete textConValp;	
}

void COCIExampleDlg::OnButDelete() 
{
	// TODO: Add your control notification handler code here
	//代码7.1,处理SQL的第一步,准备SQL语句
    UpdateData(TRUE);
	sword status;
    text textSQL[1024];
	wsprintf((char*)textSQL,"DELETE FROM %s WHERE %s %s :DelFieldVal",TableName,m_strFieldName,m_strcondition);
	if(status=OCIStmtPrepare(stmthp,errhp,textSQL,strlen((char *)textSQL),OCI_NTV_SYNTAX,OCI_DEFAULT ))
	{
		ErrorProc(errhp,status);
		return;
	}
	//代码7.2,处理SQL的第二步,绑定(binding)
	text   textColVal[20];//条件字段的数值
    sb4    len;
	int strlength=m_strFieldVal.GetLength();
	wsprintf((char*)textColVal,"%s",m_strFieldVal);
    textColVal[strlength]='\0';
	len=strlen((const char *)textColVal)+1;
	//由名称来绑定
	if(status=OCIBindByName(stmthp, &bidhp[0], errhp, 
		(text *) ":DelFieldVal",-1, (ub1 *) &textColVal, 
		                     len, SQLT_STR, (dvoid *) 0,
                            (ub2 *)0, (ub2*) 0, (ub4) 0, 
	                            (ub4 *) 0, OCI_DEFAULT))
	{
        ErrorProc(errhp,status);
		return;
	}
    //代码7.3,处理SQL的第三步,执行
	if(status=OCIStmtExecute(svchp,stmthp,errhp,(ub4)1,0,NULL,NULL,OCI_DEFAULT))
	{
		ErrorProc(errhp,status);
		return;
	}
	//刷新ListCtrl控件
    OnBTableselectok();	
}

void COCIExampleDlg::OnButUpdate() 
{   	
	//代码8.2,处理SQL的第一步,准备SQL语句
	UpdateData(TRUE);
	sword status;
	text textSQL[1024];
	wsprintf((char*)textSQL,"UPDATE %s SET %s = :UpDFieldVal WHERE %s=:KeyFieldVal",
							 TableName,m_strFieldName,m_strConFName);
	if(status=OCIStmtPrepare(stmthp,errhp,textSQL,strlen((char *)textSQL),OCI_NTV_SYNTAX,OCI_DEFAULT ))
	{
		ErrorProc(errhp,status);
		return;
	}

	//代码8.3,处理SQL的第二步,绑定(binding)
	text   textColVal[20];//所修改字段的数值
	sb4    len;
	int strlength=m_strFieldVal.GetLength();
	wsprintf((char*)textColVal,"%s",m_strFieldVal);
	textColVal[strlength]='\0';
	len=strlen((const char *)textColVal)+1;
	//由名称来绑定所要修改的字段的占位符
	if(status=OCIBindByName(stmthp, &bidhp[0], errhp, 
		(text *) ":UpDFieldVal",-1, (ub1 *) &textColVal, 
							 len, SQLT_STR, (dvoid *) 0,
							(ub2 *)0, (ub2*) 0, (ub4) 0, 
								(ub4 *) 0, OCI_DEFAULT))
	{
		ErrorProc(errhp,status);
		return;
	}
	//由名称来绑定作为修改时条件字段的占位符
	text   textConColVal[20];
	strlength=m_strConFVal.GetLength();
	wsprintf((char*)textConColVal,"%s",m_strConFVal);
	textConColVal[strlength]='\0';
	len=strlen((const char *)textConColVal)+1;
	if(status=OCIBindByName(stmthp, &bidhp[1], errhp, 
	  (text *) ":KeyFieldVal",-1, (ub1 *) &textConColVal, 
							 len, SQLT_STR, (dvoid *) 0,
							(ub2 *)0, (ub2*) 0, (ub4) 0, 
								(ub4 *) 0, OCI_DEFAULT))
	{
		ErrorProc(errhp,status);
		return;
	}

	//代码8.4,处理SQL的第三步,执行
	if(status=OCIStmtExecute(svchp,stmthp,errhp,(ub4)1,0,NULL,NULL,OCI_DEFAULT))
	{
		ErrorProc(errhp,status);
		return;
	}
	//commit;
	status=OCITransCommit(svchp, errhp, (ub4)0);
	//刷新ListCtrl控件
	OnBTableselectok();	
	
}

void COCIExampleDlg::OnButInsert() 
{
	// TODO: Add your control notification handler code here

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -