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