📄 ociexampledlg.cpp
字号:
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 + -