简单的操作,关键是想学习一下API 编程方法。有个简单的表,仅有一列 fcol char(10) primary key ;
现在是通过预置语句,绑定参数向该表中插入数据,但总是不成功。通过其他的操作,静态的(hard-code)操作都能成功,比如指插入一个固定值.
这样看来,申请句柄等操作都应该是正确的,反复检查BindParameter 也没看出什么错误,就是插不了数据,返回SQL_NEED_DATA!
郁闷中,等待达人的指点!!
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>int main ()
{
SQLHENV henvtest;
SQLHDBC hdbctest;
SQLHSTMT hstmtest;
SQLRETURN ret; SQLCHAR fk[15]="seventhcol"; // 执行插入时的数值来源
SQLSMALLINT len_ind=SQL_NTS; /*建立环境句柄*/
ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henvtest);
/*设置ODBC版本*/
if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
SQLSetEnvAttr(henvtest,SQL_ATTR_ODBC_VERSION,(void *)SQL_OV_ODBC3,0);
else {printf("Allocate environment handle failed!");return 1;}
/*建立链接句柄*/
ret=SQLAllocHandle(SQL_HANDLE_DBC,henvtest,&hdbctest); if(ret==SQL_SUCCESS )
/*建立连接*/
ret=SQLConnect(hdbctest, "LocalServer",SQL_NTS,"sa",SQL_NTS,"mmrrai5252",SQL_NTS);
else{printf("Allocte connetion handle failed!");return 1;}
/*建立语句句柄*/
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)
SQLAllocHandle(SQL_HANDLE_STMT,hdbctest,&hstmtest);
else{printf("Create connection failed!\n");return 1;} ret=SQLPrepare(hstmtest,"insert into simpler values(?)",SQL_NTS);
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)
{
printf("SQLPrepare succeed\n");
ret=SQLBindParameter(hstmtest,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,fk,10,&len_ind);
}
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)
printf("BindParameter succeed !\n");
if(ret==SQL_ERROR)
printf("BindParameter failed! \n"); ret=SQLExecute(hstmtest); if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)printf("Execute succeed !\n");
if(ret==SQL_ERROR)printf("Execute failed ! \n");
if(ret==SQL_NEED_DATA)printf("SQL_NEED_DATA !\n");
if(ret==SQL_NO_DATA)printf("SQL_NO_DATA! \n");
if(ret==SQL_INVALID_HANDLE)printf("SQL_INVALID_HANDLE\n");
SQLFreeHandle(SQL_HANDLE_STMT,hstmtest);
SQLDisconnect(hdbctest);
SQLFreeHandle(SQL_HANDLE_DBC,hdbctest);
SQLFreeHandle(SQL_HANDLE_ENV,henvtest);
}
现在是通过预置语句,绑定参数向该表中插入数据,但总是不成功。通过其他的操作,静态的(hard-code)操作都能成功,比如指插入一个固定值.
这样看来,申请句柄等操作都应该是正确的,反复检查BindParameter 也没看出什么错误,就是插不了数据,返回SQL_NEED_DATA!
郁闷中,等待达人的指点!!
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>int main ()
{
SQLHENV henvtest;
SQLHDBC hdbctest;
SQLHSTMT hstmtest;
SQLRETURN ret; SQLCHAR fk[15]="seventhcol"; // 执行插入时的数值来源
SQLSMALLINT len_ind=SQL_NTS; /*建立环境句柄*/
ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henvtest);
/*设置ODBC版本*/
if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
SQLSetEnvAttr(henvtest,SQL_ATTR_ODBC_VERSION,(void *)SQL_OV_ODBC3,0);
else {printf("Allocate environment handle failed!");return 1;}
/*建立链接句柄*/
ret=SQLAllocHandle(SQL_HANDLE_DBC,henvtest,&hdbctest); if(ret==SQL_SUCCESS )
/*建立连接*/
ret=SQLConnect(hdbctest, "LocalServer",SQL_NTS,"sa",SQL_NTS,"mmrrai5252",SQL_NTS);
else{printf("Allocte connetion handle failed!");return 1;}
/*建立语句句柄*/
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)
SQLAllocHandle(SQL_HANDLE_STMT,hdbctest,&hstmtest);
else{printf("Create connection failed!\n");return 1;} ret=SQLPrepare(hstmtest,"insert into simpler values(?)",SQL_NTS);
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)
{
printf("SQLPrepare succeed\n");
ret=SQLBindParameter(hstmtest,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,fk,10,&len_ind);
}
if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)
printf("BindParameter succeed !\n");
if(ret==SQL_ERROR)
printf("BindParameter failed! \n"); ret=SQLExecute(hstmtest); if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)printf("Execute succeed !\n");
if(ret==SQL_ERROR)printf("Execute failed ! \n");
if(ret==SQL_NEED_DATA)printf("SQL_NEED_DATA !\n");
if(ret==SQL_NO_DATA)printf("SQL_NO_DATA! \n");
if(ret==SQL_INVALID_HANDLE)printf("SQL_INVALID_HANDLE\n");
SQLFreeHandle(SQL_HANDLE_STMT,hstmtest);
SQLDisconnect(hdbctest);
SQLFreeHandle(SQL_HANDLE_DBC,hdbctest);
SQLFreeHandle(SQL_HANDLE_ENV,henvtest);
}
BindParameter succeed !
SQL_NEED_DATA !
Press any key to continue
ret=SQLExecute(hstmtest);
http://support.microsoft.com/kb/290175
SQLINTEGER len_ind=10; //或声明为LONG len_ind=10; 不能为SQLSMALLINT 或 short