★★★★★【200分求解OCI的一些问题】★★★★

???2008 ???2008 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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分奖励。
...全文
评论 11
收藏 已收藏
分享
返回顶部
???2008
C语言 70,040 成员 243,237 内容