简单的操作,关键是想学习一下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);
}

解决方案 »

  1.   

    忘了附上运行结果了SQLPrepare succeed
    BindParameter succeed !
    SQL_NEED_DATA !
    Press any key to continue
      

  2.   

    len_ind=lstrlen((LPCTSTR)fk); //加上这句试一下
    ret=SQLExecute(hstmtest); 
      

  3.   

    楼上这句的意思是将fk串的长度赋给len_ind 吧?试过了,情况依旧。继续等待大家的指点!!
      

  4.   

    看个例子:
    http://support.microsoft.com/kb/290175
      

  5.   

    变量定义的有错误
    SQLINTEGER len_ind=10; //或声明为LONG len_ind=10; 不能为SQLSMALLINT 或 short
      

  6.   

    灵了!!老兄真是够细心的。学API主要是看的MSDN,资料不太好找,MSDN 又是英文,看的很费劲。总是想节省内存,尽量使用小类型,这回看来是没省到地方啊。这API实在是太复杂了,看来老兄应该搞得不错了!!呵呵,多谢了,解决了困扰我很长时间的问题,怎么也找不出毛病,一点点的排除,原理BUG在这儿!!接分了!