上面太乱了,重写一遍:
typedef struct _tagUSERINFO{
DWORD m_UserIndex;
char m_UserName[30];
char m_PassWord[30];
char m_Query[30];
char m_Result[30];
DWORD m_Age;
DWORD m_Sex;
DWORD m_Knowledge;
char m_Job[30];
DWORD m_Oicq;
char m_Email[30];
char m_Info[300];
} USERINFO,*LPUSERINFO;typedef struct _tagUSERLINEINFO{
char m_RegisterIP[30];
char m_LoginIP[30];
char m_RegisterDate[30];
char m_LoginDate[30];
DWORD m_IsConnect;
} USERLINEINFO,*LPUSERLINEINFO;
typedef struct _tagUSERDATA{
USERINFO UserInfo;
USERLINEINFO UserLineInfo;
}USERDATA,*LPUSERDATA;为什么运行到RetCode = SQLExecute(hstmt);  返回错误?RETCODE RetCode;
SQLHSTMT hstmt  = SQL_NULL_HSTMT;
SQLINTEGER cb[17];try{
 RetCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
 if ( RetCode != SQL_SUCCESS && RetCode != SQL_SUCCESS_WITH_INFO )throw 1;
 RetCode = SQLPrepare(hstmt, (SQLTCHAR*)
  "INSERT INTO UserInfo "\
  "(UserIndex,UserName,PassWord,Query,Result,Age,Sex,Knowledge,Job,Oicq,Email,Info,RegisterIP,LoginIP,RegisterDate,LoginDate,IsConnect) "\
  "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", 
  SQL_NTS);
 if ( RetCode != SQL_SUCCESS && RetCode != SQL_SUCCESS_WITH_INFO )throw 2;
 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&lpUserData->UserInfo.m_UserIndex, 0, &cb[0]);
 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserInfo.m_UserName,0, &cb[2]);
 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserInfo.m_PassWord,0, &cb[1]);
 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserInfo.m_Query,0, &cb[9]);
 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserInfo.m_Result,0, &cb[10]);
 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&lpUserData->UserInfo.m_Age,0, &cb[3]);
 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&lpUserData->UserInfo.m_Sex,0, &cb[4]);
 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&lpUserData->UserInfo.m_Knowledge,0, &cb[5]);
 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserInfo.m_Job,0, &cb[6]);
 SQLBindParameter(hstmt,10, SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&lpUserData->UserInfo.m_Oicq,0, &cb[7]);
 SQLBindParameter(hstmt,11, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserInfo.m_Email,0, &cb[8]);
 SQLBindParameter(hstmt,12, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserInfo.m_Info,0, &cb[11]);
 SQLBindParameter(hstmt,13, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserLineInfo.m_RegisterIP,0, &cb[12]);
 SQLBindParameter(hstmt,14, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserLineInfo.m_LoginIP,0, &cb[13]);
 SQLBindParameter(hstmt,15, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserLineInfo.m_RegisterDate,0, &cb[14]);
 SQLBindParameter(hstmt,16, SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,30,0,lpUserData->UserLineInfo.m_LoginDate,0, &cb[15]);
 SQLBindParameter(hstmt,17, SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&lpUserData->UserLineInfo.m_IsConnect,0, &cb[16]);
 SQLExecute(hstmt);   
 if ( RetCode != SQL_SUCCESS && RetCode != SQL_SUCCESS_WITH_INFO )throw 3;
}
catch(int){
 if ( hstmt != SQL_NULL_HSTMT )
  SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
   return FALSE;
}
if ( hstmt != SQL_NULL_HSTMT )
 SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
return TRUE;