有个用ODBC将kingbase中的student表的数据备份到postgres的程序:#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <Sqltypes.h>
#define SNO_LEN 30
#define NAME_LEN 50
#define DEPART_LEN 100
#define SSEX_LEN 5int main()
{
/* Step 1 定义句柄和变量 */
//以king开头的表示的是连接KingbaseES的变量
//以post开头的表示的是连接postgres的变量
SQLHENV    kinghenv,posthenv;                     //环境句柄
SQLHDBC  kinghdbc,posthdbc;                 //连接句柄
SQLHSTMT  kinghstmt,posthstmt;  //语句句柄
SQLRETURN ret;
SQLCHAR  sName[NAME_LEN],sDepart[DEPART_LEN],
sSex[SSEX_LEN],sSno[SNO_LEN];
SQLINTEGER    sAge;
SQLINTEGER  cbAge=0,cbSno=SQL_NTS,cbSex=SQL_NTS,
cbName=SQL_NTS,cbDepart=SQL_NTS;/* Step 2 初始化环境 */
ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&kinghenv);
ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&posthenv);
ret=SQLSetEnvAttr(kinghenv,SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
ret=SQLSetEnvAttr(posthenv, SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3, 0);/* Step 3 :建立连接 */
ret=SQLAllocHandle(SQL_HANDLE_DBC, kinghenv, &kinghdbc);
ret=SQLAllocHandle(SQL_HANDLE_DBC, posthenv, &posthdbc);
ret=SQLConnect(kinghdbc,"kingbase",SQL_NTS, "ADMIN",SQL_NTS, "12345",SQL_NTS);
if (!SQL_SUCCEEDED(ret))//连接失败时返回错误值
return -1;
ret=SQLConnect(posthdbc, "PostgreSQL30W", SQL_NTS, "postgres",
SQL_NTS,"12345",SQL_NTS);
if (!SQL_SUCCEEDED(ret) )     //连接失败时返回错误值
return -1;/* Step 4 :初始化语句句柄 */
ret=SQLAllocHandle(SQL_HANDLE_STMT, kinghdbc, &kinghstmt);
ret=SQLSetStmtAttr(kinghstmt,SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER)
    SQL_BIND_BY_COLUMN,SQL_IS_INTEGER );
ret=SQLAllocHandle(SQL_HANDLE_STMT, posthdbc, &posthstmt);/* Step 5 :两种方式执行语句 */
/* 预编译带有参数的语句 */
ret=SQLPrepare(posthstmt,"INSERT INTO STUDENT(SNO,SNAME,SSEX, SAGE,SDEPT) VALUES (?, ?, ?, ?, ?)",SQL_NTS);
if (ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
{
ret=SQLBindParameter(posthstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR, SNO_LEN, 0, sSno, 0, &cbSno); 
ret=SQLBindParameter(posthstmt,2,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR, NAME_LEN, 0, sName, 0, &cbName);
ret=SQLBindParameter(posthstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR, 2, 0, sSex, 0, &cbSex);
ret=SQLBindParameter(posthstmt,4,SQL_PARAM_INPUT,
SQL_C_LONG,SQL_INTEGER, 0, 0, &sAge, 0 ,&cbAge);
ret=SQLBindParameter(posthstmt,5,SQL_PARAM_INPUT,SQL_C_CHAR,
SQL_CHAR, DEPART_LEN, 0, sDepart, 0,&cbDepart);
}
   /*执行SQL语句*/
ret=SQLExecDirect(kinghstmt,"SELECT * FROM STUDENT",SQL_NTS);
if (ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO) 
{
ret=SQLBindCol(kinghstmt, 1, SQL_C_CHAR,sSno,SNO_LEN,&cbSno);
ret=SQLBindCol(kinghstmt, 2, SQL_C_CHAR,sName,NAME_LEN, &cbName);
ret=SQLBindCol(kinghstmt, 3, SQL_C_CHAR, sSex, SSEX_LEN, &cbSex);
ret=SQLBindCol(kinghstmt, 4, SQL_C_LONG, &sAge, 0, &cbAge);
ret=SQLBindCol(kinghstmt, 5, SQL_C_CHAR, sDepart, DEPART_LEN, &cbDepart);
}
  
/* Step 6 :处理结果集并执行预编译后的语句*/
 while ( (ret=SQLFetch(kinghstmt) ) !=SQL_NO_DATA_FOUND) 
 {  
if(ret==SQL_ERROR)  printf("Fetch error\n");
else  
ret=SQLExecute(posthstmt);
} /* Step 7 中止处理*/
SQLFreeHandle(SQL_HANDLE_STMT,kinghstmt);
SQLDisconnect(kinghdbc);
SQLFreeHandle(SQL_HANDLE_DBC, kinghdbc);
SQLFreeHandle(SQL_HANDLE_ENV,kinghenv);
SQLFreeHandle(SQL_HANDLE_STMT, posthstmt);
SQLDisconnect(posthdbc);
SQLFreeHandle(SQL_HANDLE_DBC, posthdbc);
SQLFreeHandle(SQL_HANDLE_ENV, posthenv);
return 0;

编译情况:E:\Microsoft Visual Studio\MyProjects\data\data.cpp(36) : error C2664: 'SQLConnect' : cannot convert parameter 2 from 'char [9]' to 'unsigned char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
E:\Microsoft Visual Studio\MyProjects\data\data.cpp(40) : error C2664: 'SQLConnect' : cannot convert parameter 2 from 'char [14]' to 'unsigned char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
E:\Microsoft Visual Studio\MyProjects\data\data.cpp(52) : error C2664: 'SQLPrepare' : cannot convert parameter 2 from 'char [71]' to 'unsigned char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
E:\Microsoft Visual Studio\MyProjects\data\data.cpp(64) : error C2664: 'SQLExecDirect' : cannot convert parameter 2 from 'char [22]' to 'unsigned char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
执行 cl.exe 时出错.data.obj - 1 error(s), 0 warning(s)
关键是这个:
ret=SQLConnect(kinghdbc,"kingbase",SQL_NTS, "ADMIN",SQL_NTS, "12345",SQL_NTS);
ret=SQLConnect(posthdbc, "PostgreSQL30W", SQL_NTS, "postgres",
SQL_NTS,"12345",SQL_NTS);
ret=SQLPrepare(posthstmt,"INSERT INTO STUDENT(SNO,SNAME,SSEX, SAGE,SDEPT) VALUES (?, ?, ?, ?, ?)",SQL_NTS);
ret=SQLExecDirect(kinghstmt,"SELECT * FROM STUDENT",SQL_NTS);
这四句中为何都有cannot convert parameter 2 from 'char [71]' to 'unsigned char *'的问题?
谢谢大虾!