📄 ociexampledlg.cpp
字号:
break;
case OCI_INVALID_HANDLE:
(void) AfxMessageBox("OCI错误代码:OCI_INVALID_HANDLE\n");
break;
case OCI_STILL_EXECUTING:
(void) AfxMessageBox("OCI错误代码:OCI_STILL_EXECUTE\n");
break;
default:
break;
}
}
COCIExampleDlg::~COCIExampleDlg()
{
}
void COCIExampleDlg::OnBTableselectok()
{
// TODO: Add your control notification handler code here
//代码5.1,
//获取控件2所选中的表名
TableName="";
int item=m_listTablename.GetCurSel();
m_listTablename.GetText(item,TableName);
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));
//分配缓冲区
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++)
{
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;
}
}
//代码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<(int)col_num;i++)
m_comboCtrl.AddString(ColName[i]);
m_strcondition=">";
m_strFieldName="SAL";
m_strFieldVal="800";
//代码8.1
//初始化修改字段时的ComboBox控件
for(i=0;i<(int)col_num;i++)
m_comConFNameCtrl.AddString(ColName[i]);
UpdateData(false);
//为控制程序的执行步骤所加:使得操作表的按钮可用
GetDlgItem(IDC_BUT_QUERY)->EnableWindow(true);
GetDlgItem(IDC_BUT_DELETE )->EnableWindow(true);
GetDlgItem(IDC_BUT_UPDATE )->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, (dvoid *) 0,
(ub2 *)0, (ub2*) 0, (ub4) 0,
(ub4 *) 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));
//分配缓冲区
colbuf[i]=(text *)new text[(int)collen[i]+1];
}
//代码6.7,处理SQL的第五步,定义变量
for( i=0;i<(int)col_num;i++)
{
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;
}
}
//代码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
//获取所选择的字段名称
CString FieldName=m_strFieldName;
//获取条件
CString strCondition=m_strcondition;
//获取查询字段的数值
CString strFieldVal=m_strFieldVal;
*/
//代码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();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -