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

📄 ociexampledlg.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:

 if(InsertDlg==NULL)
 {
    
	InsertDlg=new CCInsertDlg;
	//关掉再产生,会在这里出错,why?
	BOOL ret =InsertDlg->Create(IDD_INSERT_DLG,this);
    if(!ret)   //Create failed.
         AfxMessageBox("Error creating Dialog");
	//----------------------------------------------------------
	CWnd *pViewBox_F;
	pViewBox_F= InsertDlg->GetDlgItem(IDC_MYGRIDCTRL);
    CRect	rGridRect;			
	pViewBox_F->GetClientRect(&rGridRect);
	pViewBox_F->ClientToScreen(&rGridRect);
	pViewBox_F->ScreenToClient(&rGridRect);	
	//m_GridCtrl->	
    InsertDlg->m_GridCtrl->Create(rGridRect, pViewBox_F, 100);
    //初始化GridCtrl
    //可以编辑项使能
	InsertDlg->m_GridCtrl->SetEditable(TRUE);
	//可以拖动项使能
	InsertDlg->m_GridCtrl->EnableDragAndDrop(TRUE);
	//
	int ColoumNum;
	if(ColumnNumbers==0)
	    ColoumNum = 3;//列数
	else
       ColoumNum=ColumnNumbers+1;

	int RowNumber = 4;//行数
	try 
	{
		InsertDlg->m_GridCtrl->SetRowCount(RowNumber);
		InsertDlg->m_GridCtrl->SetColumnCount(ColoumNum);
		InsertDlg->m_GridCtrl->SetFixedRowCount(2);//两行灰色,一行为标题,另外一行为个数
		                                //为0时,没有灰色标题行
										//为1时,第一行成灰色标题;
										//为2时,从第一行开始生成两行灰色标题
		InsertDlg->m_GridCtrl->SetFixedColumnCount(1);//为1时,生成左边灰色一行
		//
		GV_ITEM GV_Item,Item;
		GV_Item.mask = GVIF_TEXT|GVIF_FORMAT;
		GV_Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX;
	    //
       	Item.mask = GVIF_TEXT|GVIF_FORMAT;
		Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX;
		int i=0,j=0;
		//列的名称
        GV_Item.row=0;
        GV_Item.col=0;
		GV_Item.strText="ColName";		
        InsertDlg->m_GridCtrl->SetItem(&GV_Item);
		//格式
		GV_Item.row=1;
		GV_Item.strText="ColFormat";
        InsertDlg->m_GridCtrl->SetItem(&GV_Item);
		//ID
		for(i=2;i<=10;i++)
		{
			 GV_Item.row=i;
             GV_Item.col=0;
		     GV_Item.strText.Format("%d",i-1);
			 InsertDlg->m_GridCtrl->SetItem(&GV_Item);
		}
		//写字段的名称到列表上
		for(i=0;i<ColumnNumbers;i++)
		{
			//SetColumnWidth(int nCol, int width),列的宽度
			GV_Item.row=0;
			GV_Item.col=i+1;//从第二列开始写标题,第一列作为ID好
            GV_Item.strText=ColName[i];
            InsertDlg->m_GridCtrl->SetItem(&GV_Item);
		}
		//写输入数据的格式,一方面,可以在第二行中提示,
		//另一方面,可以在输入的时候限制
		CString strA="A",str9="9";
		CString ColFormat="";
		BOOL tempbool1=FALSE,tempbool2=FALSE;
		for(i=0;i<ColumnNumbers;i++)
		{
			//若字段类型为字符型,则以如“AAA”的
			//方式来描述表中字段可以接收的格式
            tempbool1=coltype[i]==SQLT_CHR||\
				      coltype[i]==SQLT_VCS||\
                      coltype[i]==SQLT_STR;
			  
			tempbool2=coltype[i]==SQLT_NUM||\
		              coltype[i]==SQLT_INT||\
                      coltype[i]==SQLT_FLT||\
                      coltype[i]==SQLT_LNG;
			if(tempbool1)
			{
               
				//for(j=0;j<collen[i];j++)
				   //strchar=strchar+strA;
			   //ColFormat=ColFormatstrA+;
               ColFormat.Format("%d*AOr%d*字",collen[i],collen[i]/2);
			}
			//若字段类型为数字型,则以如“99.9”的
			//方式来描述表中字段可以接收的格式
         	else if(tempbool2)
			{
		         for(j=0;j<iprecision[i]-iscale[i];j++)
				     ColFormat=ColFormat+str9;
				 if(iscale[i]!=0)
				 {
					 ColFormat+=".";
					 for(j=0;j<iscale[i];j++)
						  ColFormat+=str9;
				 }
			}
			//若为日期型,则
			else if(coltype[i]==SQLT_DAT)
			{
                ColFormat="OracleDate";
			}
			else
			{
                ColFormat="Others";
			}
			//
			GV_Item.row=1;
			GV_Item.col=i+1;//从第二列开始写
            GV_Item.strText=ColFormat;
            InsertDlg->m_GridCtrl->SetItem(&GV_Item);
		    //清空
            ColFormat="";
	}
	}
	catch (CMemoryException* e)
	{
		e->ReportError();
		e->Delete();
		return ;
	}
	InsertDlg->m_GridCtrl->Refresh();
	//-------------------------------------------------------
 }
 InsertDlg->ShowWindow(SW_SHOW);

 //==========================================================
 //移动InsertDlg窗口
 //void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );
 //InsertDlg->MoveWindow(500,0,400,300,TRUE);
 //刷新变化InsertDlg对话框的开关
 //IsSizeInsertDlg=1;

 //==========================================================
}

//CCInsertDlg类中的OnButSavedate()函数来调用
//从而保存要插入的数据到数据库端
void COCIExampleDlg::SaveInsertData(int row,int col,CString strColVal[])
{
	sword status;
	text textSQL[1024];
	CString strBindName[20];
 	CString strSQL="",strtemp="";
	//
	sb4    ColValLen[20],BindNameLen[20];
	sb4    Vlen,Blen;
	text *ptextColVal[20];
    text *ptextBindColName[20];
	//
	//循环以便插入多个记录
	//如果插入的记录中某条记录都为空,则我们没有必要执行SQL
	BOOL IsExecute=FALSE;
	for(int loop=0;loop<row;loop++)
	{
			
		    IsExecute=FALSE;
		    //-----------------------------Prepare SQL--------------------
			//在SQL加入中加入表中
			strSQL="",strtemp="";
		    strSQL.Format("INSERT INTO %s (",TableName);
			//在SQL语句中加入字段的名称,条件-若所输入的字符串不为空
			//这样就需要处理逗号的问题
			col=ColumnNumbers;
			for(int k=0;k<col;k++)
			{
				if(strColVal[loop*col+k]!="")
				{
					if(k!=col-1)
					  strtemp+=ColName[k]+",";
					else
					  strtemp+=ColName[k];
				}
			}
			//在这里可以去掉strtempL的末尾的“,”
			//ReverseFind('aa')函数返回的是字符串的从头开始的位置(从0起算),
			//这个位置是从字符串的末尾起寻找'aa';
			if(strtemp.GetLength()-1==strtemp.ReverseFind(','))
			{
				strtemp=strtemp.Left(strtemp.GetLength()-1);
			}
			//在SQL加入中 字段名称+)+VALUES+(
			strSQL+=strtemp+") VALUES (";
			strtemp="";
			//在SQL语句中加入绑定的名称,条件-若所输入的字符串不为空
			for(k=0;k<col;k++)
			{
				if(strColVal[loop*col+k]!="")
				{
					strtemp.Format(":FieldVale%d",k+1);
					strBindName[k].Format(":FieldVale%d",k+1);
					//控制在没有空字段(一个记录中)时,使得
					//字段名称的集合中的末尾不带“,”
			//在SQL加入中绑定名称
					if(k!=col-1)
					   strSQL+=strtemp+",";
					else
						strSQL+=strtemp;
				}
			}
			//当所有添加的记录中有空字段时,使得末尾不出现“,”
			//在这里,可以去掉strSQL的末尾的“,”
			if(strSQL.GetLength()-1==strSQL.ReverseFind(','))
			{
				strSQL=strSQL.Left(strSQL.GetLength()-1);
			}
            //在SQL加入中)
			wsprintf((char*)textSQL,"%s)",strSQL);
			if(status=OCIStmtPrepare(stmthp,errhp,textSQL,strlen((char *)textSQL),OCI_NTV_SYNTAX,OCI_DEFAULT ))
			{
				ErrorProc(errhp,status);
				return;
			}
            //-----------------------------Prepare SQL--------------------

            //--------------------------bind-----------------------------
			//代码8.3,处理SQL的第二步,绑定(binding)
			//sb2 myind[30];//指示符变量
   			//开始绑定,条件-若所输入的字符串不为空
			for(k=0;k<col;k++)
			{
				if(strColVal[loop*col+k]!="")
				{
					//处理绑定的名称
					BindNameLen[k]=strBindName[k].GetLength();
					Blen=strBindName[k].GetLength();
					ptextBindColName[k]=new text[Blen+1];
					wsprintf((char*)ptextBindColName[k],"%s",strBindName[k]);
					ptextBindColName[Blen]='\0';

					//绑定的数据处理
					ColValLen[k]=strColVal[k].GetLength();
					Vlen=strColVal[loop*col+k].GetLength();
					ptextColVal[k]=new text[Vlen+1];
					//loop
					wsprintf((char*)ptextColVal[k],"%s",strColVal[loop*col+k]);
					ptextColVal[Vlen]='\0';
					//按照名称绑定
					if(status=OCIBindByName(stmthp, 
						&bidhp[k], 
						errhp, 
						(text *) ptextBindColName[k],Blen, 
						(ub1 *) ptextColVal[k], Vlen+1,
						SQLT_STR, 
						(dvoid *) 0,//&myind[k],这个对数字型数据还有影响								
						(ub2 *)0, 
						(ub2*) 0,
						 (ub4) 0, 					
						(ub4 *) 0, 
						OCI_DEFAULT))
					{
						ErrorProc(errhp,status);
						return;
					}
	                //只要我们绑定了,则一定在一个记录中至少有一个字段
				    //有要输入的数据,因此,我们执行INSERT语句
                    IsExecute=TRUE;
				}
			
			}
			//--------------------------bind-----------------------------

			//--------------------------Execute then commit if execute success
			//代码8.4,处理SQL的第三步,执行
			if(IsExecute)
			{
				if(status=OCIStmtExecute(svchp,stmthp,errhp,(ub4)1,0,NULL,NULL,OCI_DEFAULT))
				{
					ErrorProc(errhp,status);
					return;
				}
				//commit;
				status=OCITransCommit(svchp, errhp, (ub4)0);
			}
			//--------------------------Execute then commit if execute success

			//删除所分配的内存
			for(k=0;k<col;k++)
			{
				if(strColVal[loop*col+k]!="")
				{
					delete ptextBindColName[k];	
				    delete ptextColVal[k];
				}
			}
      }//循环插入
	  //刷新ListCtrl控件
	  OnBTableselectok();
	  //
	  InsertDlg->IsSize=10;
}
	/*
	//-------------------------------
	    /*
	    //由名称来绑定所要修改的字段的占位符
        //绑定的名称处理
        BindNameLen[k]=strBindName[k].GetLength();
        Blen=strBindName[k].GetLength();
        wsprintf((char*)textBindName[k],"%s",strBindName[k]);
        textBindName[k][(int)BindNameLen[k]]='\0';
		//绑定的数据处理
		ColValLen[k]=strColVal[k].GetLength();
        Vlen=strColVal[k].GetLength();
        wsprintf((char*)textBindVal[k],"%s",strColVal[k]);
        textBindName[k][(int)ColValLen[k]]='\0';
        
		if(status=OCIBindByName(stmthp, &bidhp[k], errhp, 
			(text *) textBindName[k][Blen],Blen, (ub1 *) &textColVal[k][Vlen], 
								 Vlen, SQLT_STR, (dvoid *) 0,
								(ub2 *)0, (ub2*) 0, (ub4) 0, 
									(ub4 *) 0, OCI_DEFAULT))
		{
			ErrorProc(errhp,status);
			return;
		}
		textConValp=new text[strlength+1];
        wsprintf((char*)textConValp,"%s",strFieldVal);
        textConValp[strlength]='\0';
		*/
		//if(strColVal[k]=="")
           // break;\0
	/*
	//由名称来绑定作为修改时条件字段的占位符
	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;
	}*/

  //--------------------------
	  /*int i=0,j;
	GV_ITEM GV_Item;
	CString strColVal[20][50];
	//if(ColumnNumbers==0)
		//return;
    ColumnNumbers=3;
	//InsertDlg->m_GridCtrl->
    for(;;)
	{
		for(j=0;i<ColumnNumbers;j++)
		{
			//
			strColVal[i][j]=InsertDlg->m_GridCtrl->GetItemText(i+2,j+1);
			if(InsertDlg->m_GridCtrl->GetItemText(i+2,j+1)=="")
				break;
		}
		i=i+1;
	}
	*/

//DEL void COCIExampleDlg::OnBUTTONlab() 
//DEL {
//DEL 	// TODO: Add your control notification handler code here
//DEL 	//sword status;
//DEL 	//text textSQL[1024];
//DEL 	CString single="ID,NAME,";
//DEL 	char c=',';
//DEL 	//返回的是所寻找字符串在整个字符串中的位置
//DEL 	int shi=single.ReverseFind(',');
//DEL 	int len=single.GetLength();
//DEL 	if(single.GetLength()-1==single.ReverseFind(','))
//DEL          single=single.Left(single.GetLength()-1);
//DEL 
//DEL 	CString s( "abcabc" );
//DEL     int shi2=s.ReverseFind( 'b' );
//DEL 
//DEL 	text textBindName[20][20];
//DEL 	CString strBindName[20];
//DEL 	CString strSQL="abc",strtemp="";
//DEL 	for(int i=0;i<10;i++)
//DEL 	{
//DEL 		//
//DEL         wsprintf((char*)textBindName[i],"%s",strSQL);
//DEL         textBindName[i][strSQL.GetLength()]='\0';
//DEL 	}
//DEL 
//DEL 
//DEL }

void COCIExampleDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	CRect rcClient,rcListCtrl,rcQueryCap,rcQueryEdit;
	GetClientRect(rcClient);


}

⌨️ 快捷键说明

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