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

九月鹰飞 2007-03-24 11:37:16
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分奖励。
...全文
389 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
followme163 2007-05-09
  • 打赏
  • 举报
回复
如果你的username,userpassword类型为varchar(N),则c类型为char[N],定义输出类型为SQLT_STR,注意查询时用OCIDefineByPos并不是OCIBindByPos,前者用于查询数据,后者用于插入数据.输入输出函数别用错就是了.
风吹PP凉SS 2007-03-29
  • 打赏
  • 举报
回复
看不太懂,顶一下
wangminfei95888 2007-03-29
  • 打赏
  • 举报
回复
帮你顶
liujianleiwj 2007-03-27
  • 打赏
  • 举报
回复
select count(*) from user_info where...这样的语句 用SQLT_STR类型来定义
liujianleiwj 2007-03-27
  • 打赏
  • 举报
回复
我将你的程序修改如下,调试通过
1.
int uname_len = strlen(username)+1;
int upass_len = strlen(password)+1;
2.
OCIBindByPos(stmthp, &bindhp1, errhp, 1, (dvoid *)username, uname_len, SQLT_STR, 0, 0, 0, 0, 0, OCI_DEFAULT))//将SQLT_CHR改为SQLT_STR
game_zhang 2007-03-27
  • 打赏
  • 举报
回复
虽然不会OCI,但是看你的语句(text *)"SELECT USERNAME FROM USER_INFO WHERE USERNAME=:username";// AND PASSWORD=:password"; 觉得有点问题,=:username和=:password会被替换成你想要的内容吗?你可是把它放到字符串中了,建议你打印这个SQL语句看看!
九月鹰飞 2007-03-26
  • 打赏
  • 举报
回复
好急啊,版主中有人会吗?
九月鹰飞 2007-03-24
  • 打赏
  • 举报
回复
改了,但是还是不行啊。
  • 打赏
  • 举报
回复
没有这类的环境,不过
int uname_len = sizeof(username)+1;
int upass_len = sizeof(password)+1;

uname_len和upass_len都是5,如果是要求username长度的话,不能用sizeof,用strlen
bargio_susie 2007-03-24
  • 打赏
  • 举报
回复
帮你顶一下!
chensanniang 2007-03-24
  • 打赏
  • 举报
回复
帮你顶一下!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧