?? 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 + -