BOOL CHECK_USER_LOGIN(char *username, char *password)
{
sword status = NULL;
OCIDefine *defhp1 = NULL;
OCIBind *bindhp1 = NULL;
OCIBind *bindhp2 = NULL;
char show_username[20];
text *select_sql = (text *)"SELECT USERNAME FROM USER_INFO WHERE USERNAME=:username";// AND PASSWORD=:password";
int uname_len = sizeof(username)+1;
int upass_len = sizeof(password)+1;
INIT_DB_HANDLE();//初始环境变量 //分配语句句柄
CHECK_ERROR(errhp, OCIHandleAlloc(envhp, (void **)&stmthp, OCI_HTYPE_STMT, 0, 0));

//准备第一个语句
CHECK_ERROR(errhp, OCIStmtPrepare(stmthp, errhp, select_sql, strlen((char *)select_sql), OCI_NTV_SYNTAX, OCI_DEFAULT));


//绑定
CHECK_ERROR(errhp, OCIBindByPos(stmthp, &bindhp1, errhp, 1, (dvoid *)username, uname_len, SQLT_CHR, 0, 0, 0, 0, 0, OCI_DEFAULT));
         CHECK_ERROR(errhp, OCIBindByPos(stmthp, &bindhp2, errhp, 2, (dvoid *)password, upass_len, SQLT_CHR, 0, 0, 0, 0, 0, OCI_DEFAULT)); //定义
CHECK_ERROR(errhp, OCIDefineByPos(stmthp, &defhp1, errhp, 1, (dvoid *) &show_username, sizeof(show_username), SQLT_STR, (dvoid *) 0, (ub2 *)0, (ub2 *)0, OCI_DEFAULT)); //查找用户是否存在
status = OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4)0, NULL, NULL, OCI_DEFAULT);
if(OCI_NO_DATA != status)
{
status = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
if(OCI_NO_DATA != status)
{
printf(show_username);
END_DB_CONNECTION();//释放环境变量
return TRUE;
}
} END_DB_CONNECTION();//释放环境变量
return FALSE;
}
我在main中调用 CHECK_USER_LOGIN()并把用户名和密码带了进去。
如果sql语句把where后面去掉,就是不带username和password参数,
printf(show_username)能把用户打印出来,如果带了,status的值就是OCI_NO_DATA了。
如果只带username不带password参数,status的值也是OCI_NO_DATA。
问题可能出在OCIBindByPos上了。
求解:究竟该处如何写?如果我用select count(*) from user_info where...这样的语句,OCIDefineByPos又如何写?我试着用SQLT_INT的类型来定义,提示报错。我就该验证用户名和密码,咋就这么难的?解答正确的人,另有100分奖励。