| >for (int i=0; i < SelectUnit->F; i++)
{
sqlnul(&(SelectUnit->T[i]), &(SelectUnit->T[i]), &null_ok);
switch (SelectUnit->T[i])
{
case 1://CHAR
break;
case 2://NUMBER
sqlprc(&(SelectUnit->L[i]), &precision, &scale);
if (precision == 0)
precision = 40;
SelectUnit->L[i] = precision + 2;
break;
case 8://LONG
SelectUnit->L[i] = 240;
break;
case 11://ROWID
SelectUnit->L[i] = 18;
break;
case 12://DATE
SelectUnit->L[i] = 9;
break;
case 23://RAW
break;
case 24://LONGRAW
SelectUnit->L[i] = 240;
break;
}
SelectUnit->V[i] = (char *)realloc(SelectUnit->V[i], SelectUnit->L[i]+1);
SelectUnit->T[i] = 1;//把所有类型转换为字符型
}
EXEC SQL WHENEVER NOT FOUND goto EndFor;
for (;;)
{
EXEC SQL FETCH Cursorbase USING DESCRIPTOR SelectUnit;
//输出各字段
for (int i=0; i < SelectUnit->F; i++)
{
char buffer[256];
if (i != SelectUnit->F-1)
sprintf(buffer, "%s", SelectUnit->V[i]);
else sprintf(buffer, "%s ", SelectUnit->V[i]);
int length = strlen(buffer);
if (write(handle, buffer, length) != length)
{
return -5;
//写文件失败 exit(1);
}
}
}
EndFor:
close(handle);
for (int i=0; i < MAX_ITEMS; i++)
{
if (SelectUnit->V[i] != (char *)NULL)
free(SelectUnit->V[i]);
free(SelectUnit->I[i]);
}
for (int j=0; j < MAX_ITEMS; j++)
{
if (BindUnit->V[j] != (char *)NULL)
free(BindUnit->V[j]);
free(BindUnit->I[j]);
}
sqlclu(SelectUnit);
sqlclu(BindUnit);
EXEC SQL CLOSE Cursorbase;
return 0;
sqlerr:
return -6;
}
/*----------------------------------------------------------------------------
导入文本
为了批量导入,在此我调用的sqlldr工具
首先生成SQL*Loader控制文件,后运行sqlldr
----------------------------------------------------------------------------*/
int _stdcall ImportTxtfile(TList LengthArray/*导入文本的字段长度链表*/,
String *FieldArray/*数据库表的了段名数组*/, const char TableName/*导入的目标表*/, const char FileName/*导入的源文本文件*/)
{
//产生SQL*Loader控制文件
FILE *fout, *fp;
char Execommand[256];
char sqlload[] = ".\sqlload.ctl";
//检查是否连接数据库
if (bConnect == false) return -2;
if ((fout=fopen(sqlload, "w")) == NULL)
{
//建立控制文件出错
return -1 ;
}
fprintf(fout, "LOAD DATA ");
fprintf(fout, "INFILE '%s' ", FileName);
fprintf(fout, "APPEND INTO TABLE %s ( ", TableName);
int iStart = 1;
for(int i=0; i < LengthArray->Count; i++)
{
fprintf(fout, "%11s POSITION(%d:%d)", FieldArray[i], iStart, *(int*)LengthArray->Items[i]+iStart-1);
iStart += *(int*)LengthArray->Items[i];
fprintf(fout, " CHAR");
if(i < LengthArray->Count-1)
fprintf(fout, ", ");
}
fprintf(fout, ") ");
fclose(fout);
sprintf(Execommand, "sqlldr.exe userid=%s/%s@%s control=%s",
User, Pwd, DB, sqlload);
if (system(Execommand) == -1)
{
//SQL*Loader执行错误
return -1;
}
return 0 ;
}
//----------------------------------------------------------------------------
三、编译
用ORACLE的PROC预编译器预编后,放入C++ Builder中联编。联编时需加入前面生成的sqlora9.lib。联编时还要注意,所有PROC生成的ORACLE内部函数调用都要说明为extern "C" _declspec(dllexport) TYPE _stdcall类型。
水平有限还请见谅!!!请多多指点。QQ:5005647
|