首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-24 
★★★★★【200分求解OCI的一些问题】★★★★BOOLCHECK_USER_LOGIN(char*username,char*password){swordstatusNULL

★★★★★【200分求解OCI的一些问题】★★★★
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分奖励。


[解决办法]
帮你顶一下!
[解决办法]
帮你顶一下!
[解决办法]
没有这类的环境,不过
int uname_len = sizeof(username)+1;
int upass_len = sizeof(password)+1;

uname_len和upass_len都是5,如果是要求username长度的话,不能用sizeof,用strlen
[解决办法]
虽然不会OCI,但是看你的语句(text *) "SELECT USERNAME FROM USER_INFO WHERE USERNAME=:username ";// AND PASSWORD=:password "; 觉得有点问题,=:username和=:password会被替换成你想要的内容吗?你可是把它放到字符串中了,建议你打印这个SQL语句看看!
[解决办法]
我将你的程序修改如下,调试通过
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
[解决办法]
select count(*) from user_info where...这样的语句 用SQLT_STR类型来定义
[解决办法]
帮你顶
[解决办法]
看不太懂,顶一下
[解决办法]
如果你的username,userpassword类型为varchar(N),则c类型为char[N],定义输出类型为SQLT_STR,注意查询时用OCIDefineByPos并不是OCIBindByPos,前者用于查询数据,后者用于插入数据.输入输出函数别用错就是了.

热点排行