CODBCFieldInfo fieldinfo;
int iColNum=pSet->GetODBCFieldCount();
SWORD sType;
//得到原有的表的字段信息
for(int i=0;i<iColNum;i++)
{
     pSet->GetODBCFieldInfo( (short)i, fieldinfo );
     csCol[i]=fieldinfo.m_strName;
     sType=fieldinfo.m_nSQLType;
}问题是:如何创建新表时用上原有的表的字段类型?//下面只是一个固定的创建表的示例
CString sqlCreateT;
sqlCreateT.Format("CREATE TABLE T_DATA_OUT(ID VARCHAR2(20) NOT NULL,NAME VARCHAR2(40))");
m_pbase.ExecuteSQL(sqlCreateT);

解决方案 »

  1.   

    TO up:
    在语句
    sqlCreateT.Format("CREATE TABLE T_DATA_OUT(ID VARCHAR2(20) NOT NULL,NAME VARCHAR2(40))");
    中不是要把fieldinfo.m_nSQLType转化为它所代表的类型名称吗?
    不然怎么形成sql语句?
    请指教!
      

  2.   

    字段类型都是一一匹配的如:SQL_BINARY          是二进制数据相当于sql 中的image
       SQL_TINYINT         相当于sql中的tinyint简单的方法:就是在一个数据库表中建立所有SQL认可的数据类型,然后使用VC6向导建立一个ODBC程序,选取刚才建立的表,在各个字段变量中就可以看出各个类型对应的是什么类型了C类型有以下一些switch(fieldinfo.m_nSQLType)
    {
    case SQL_UNKNOWN_TYPE:
    case SQL_CHAR:
    case SQL_NUMERIC:
    case SQL_DECIMAL:
    case SQL_VARCHAR:
    case SQL_BIGINT:
    case SQL_LONGVARCHAR:
    pValue1 = new CString;
    *pValue1 = "";
    pList->AddNode(pValue1,BIND_SQL_TEXT);
    break;

    case SQL_INTEGER:
    pValue2 = new long;
    *pValue2 = 0;
    pList->AddNode(pValue2,BIND_SQL_LONG);
    break; case SQL_SMALLINT:
    pValue3 = new int;
    *pValue3 = 0;
    pList->AddNode(pValue3,BIND_SQL_INT);
    break; case SQL_FLOAT:
    pValue4 = new double;
    *pValue4 = 0.0;
    pList->AddNode(pValue4,BIND_SQL_DOUBLE);
    break; case SQL_REAL:
    case SQL_DOUBLE:
    pValue5 = new float;
    *pValue5 = 0.0;
    pList->AddNode(pValue5,BIND_SQL_FLOAT);
    break; case SQL_DATE:
    case SQL_TIME:
    case SQL_TIMESTAMP:
    pValue6 = new CTime;
    *pValue6 = CTime();
    pList->AddNode(pValue6,BIND_SQL_DATE);
    break; case SQL_BINARY:
    case SQL_VARBINARY:
    pValue7 = new CByteArray;
    pList->AddNode(pValue7,BIND_SQL_BINARY);
    break;

    case SQL_LONGVARBINARY:
    pValue8 = new CLongBinary;
    pList->AddNode(pValue8,BIND_SQL_LONGBINARY);
    break;

    case SQL_TINYINT:
    pValue9 = new unsigned char;
    pList->AddNode(pValue9,BIND_SQL_BYTE);
    break; case SQL_BIT:
    pValue3 = new int;
    pList->AddNode(pValue3,BIND_SQL_BOOL);
    break; default:
    ASSERT(FALSE);
    break;
    }