EXEC SQL BEGIN DECLARE SECTION;
char m_db_link_name[]="Link";
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;/******************************************************************
** FunctionName: GetColType
** Description: get a table column datatype 
** Parameter: 
** [in]  const char *pTableName
** [in]  const char *pColName
** [out]  char *pColType
** Return:  
** type: int 
** code: 1 - success   0 - not found    -1 - error
******************************************************************/
int GetColType(const char *pTableName, const char *pColName, char *pColType)
{    EXEC SQL BEGIN DECLARE SECTION;
        VARCHAR  ColType[10];
        VARCHAR  TableName[50];
        VARCHAR  ColName[50];
    EXEC SQL END DECLARE SECTION;
    
    strcpy((char *)TableName.arr,pTableName);
    TableName.len=strlen(pTableName);
    
    strcpy((char *)ColName.arr,pColName);
    ColName.len=strlen(pColName);    
    
EXEC SQL WHENEVER NOT FOUND GOTO notfound;
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL AT :m_db_link_name SELECT data_type INTO :ColType
FROM dba_tab_columns 
WHERE table_name=:TableName and column_name=:ColName;
ColType.arr[ColType.len]='\0';
strcpy(pColType,(char *)ColType.arr);

return 1;
notfound:
return 0;
sqlerror:
return -1;
}/******************************************************************
** FunctionName: OracleConnect
** Description: connect a oracle database
** Parameter: 
** [in]  const char *pUserName
** [in]  const char *pPassWord
** [in]  const char *pDbName
** Return:  
** type: int 
** code: 0 - success   -1 - error
******************************************************************/
int OracleConnect(const char *pUserName, const char *pPassWord, const char *pDbName)
{
    EXEC SQL BEGIN DECLARE SECTION;
        VARCHAR  username[128];
        VARCHAR  password[32];
        VARCHAR  db_name[20];
    EXEC SQL END DECLARE SECTION;
    
    strcpy((char *)username.arr,pUserName);
    username.len=strlen(pUserName);
    
    strcpy((char *)password.arr,pPassWord);
    password.len=strlen(pPassWord);
   
    strcpy((char *)db_name.arr,pDbName);
    db_name.len=strlen(pDbName);
    
    EXEC SQL WHENEVER SQLERROR GOTO connect_error;    EXEC SQL CONNECT :username IDENTIFIED BY :password
    AT :m_db_link_name USING :db_name;    return 0;connect_error:    return -1;
}/******************************************************************
** FunctionName: OracleDisConnect
** Description: disconnect a oracle database
** Parameter: none
** Return:  int
******************************************************************/
int OracleDisConnect()
{
EXEC SQL COMMIT WORK RELEASE;
    return 0;connect_error:
    return -1;}数据库连接正常,可是在做查询时GetColType()返回-1(无法执行),(功能返回
指定表列的数据类型)请问高手问题出现在哪?
另外我断开连接该怎么做?上面的函数不行(我想是没有指定连接,可我用
EXEC SQL :m_db_link_name COMMIT WORK RELEASE;预编译出错)

解决方案 »

  1.   

    AT :m_db_link_name没有必要用。
      

  2.   

    查询dba_tab_columns有权限限制,你的登录用户可能权限不足,其实你查询user_tab_columns应该就可以了,你换成后者试试。
      

  3.   

    user_tab_columns好像不能得到系统表的数据吧
    我用的是system用户登陆,应该不会有问题吧
      

  4.   

    如果你查询的是dba_tab_columns,你又没有指定用户(owner),如果有多个用户有相同名字的表和字段,也就是你的select语句返回不止一条记录,那么select into也会出错的。你可以查查有没有相同的表名。
      

  5.   

    to: Lastdrop(空杯)我在sql plus里用上面的sql语句是可以查出来的
      

  6.   

    请使用sqlca.sqlcode给出错误代码
      

  7.   

    你在SQL*PLUS里运行下面的匿名块试试,报不报错,若有错误,用show err查看。
    将xxxx替换成真正在程序中出现的值。declare
    ColType   varchar2(10);
    TableName varchar2(50):='xxxx';
    ColName   varchar2(50):='xxxx';
    begin
    SELECT data_type INTO ColType
    FROM dba_tab_columns 
    WHERE table_name=TableName and column_name=ColName;
    end;
    /我发现你的coltype的长度可能太小了,在dba_tab_columns中的data_type可是varchar2(106)!!你试试吧,看看是不是报变量长度不足的错误。