c登录功能oracle

admin 2024-08-12 16:32:11 数据库 来源:ZONE.CI 全球网 0 阅读模式

在现代软件开发中,登录功能是非常常见的一个功能。

c登录功能oracle

例如,一家公司的员工管理系统,每个员工都有一个账号和密码,必须要登录才能访问系统。

而在使用C语言开发的软件中,要实现一个登录功能需要用到数据库。本文将介绍如何使用C语言和Oracle数据库来实现登录功能。

首先,在使用Oracle数据库前需要下载安装Oracle Instant Client。此外,还需要安装OCI客户端库来连接数据库。

#include  //标准输入输出
#include  //标准库
#include  //字符串操作库
#include  //OCI库

void login() 
{
    //OCI数据库连接句柄
    OCIEnv* envhp;
    OCIError* errhp;
    OCISession* mySesshp;
    OCIServer* srvhp;
    OCISvcCtx* svchp;
    OCISessionPool* sesspoolhp;
    OCIDefine* defhp;
    OCIBind* bndhp;
    OCIStmt* stmthp;

    //填写数据库连接信息
    char* username = "username";
    char* password = "password";
    char* dbname = "dbname";
    char* host = "host";

    //连接数据库
    OCIEnvCreate(&envhp, OCI_DEFAULT, (void*)0, 0, 0, 0, (size_t)0, (void**)0);
    OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, (size_t)0, (void **)0);
    OCIHandleAlloc((dvoid *)envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (void **)0);
    OCIHandleAlloc((dvoid *)envhp, (dvoid **)&svcCtx, OCI_HTYPE_SVCCTX, (size_t)0, (void **)0);
    OCIHandleAlloc((dvoid *)envhp, (dvoid **)&mySesshp, OCI_HTYPE_SESSION, (size_t)0, (void **)0);

    char connectString[1024];
    snprintf(connectString, sizeof(connectString), "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=%s)))", host, dbname);

    OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid *)connectString, (ub4)strlen(connectString), OCI_ATTR_SERVER, errhp);
    OCIServerAttach(srvhp, errhp, connectString, strlen(connectString), 0);

    OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp, (ub4)0, OCI_ATTR_SERVER, errhp);

    OCIAttrSet(mySesshp, OCI_HTYPE_SESSION, (dvoid *)username, (ub4)strlen(username), OCI_ATTR_USERNAME, errhp);
    OCIAttrSet(mySesshp, OCI_HTYPE_SESSION, (dvoid *)password, (ub4)strlen(password), OCI_ATTR_PASSWORD, errhp);
    OCISessionBegin(svchp, errhp, mySesshp, OCI_CRED_RDBMS, OCI_DEFAULT);

    printf("成功连接Oracle数据库!\n");

    //执行SQL语句
    OCIHandleAlloc(envhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, 0);
    char* sql = "SELECT COUNT(*) FROM users WHERE username = :username AND password = :password";
    size_t sql_len = strlen(sql);
    OCIStmtPrepare(stmthp, errhp, (OraText*)sql, (ub4)sql_len, OCI_NTV_SYNTAX, OCI_DEFAULT);

    char user[50], pass[50];
    printf("请输入用户名:");
    scanf("%s", user);
    printf("请输入密码:");
    scanf("%s", pass);

    OCIBindByName(stmthp, &bndhp, errhp, (text*)":username", -1, (dvoid*)user, strlen(user), SQLT_STR, (dvoid*)0, (ub2*)0, (ub2*)0, 0, (ub4)OCI_DEFAULT);
    OCIBindByName(stmthp, &bndhp, errhp, (text*)":password", -1, (dvoid*)pass, strlen(pass), SQLT_STR, (dvoid*)0, (ub2*)0, (ub2*)0, 0, (ub4)OCI_DEFAULT);

    OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);

    //处理查询结果
    int count = 0;
    OCIDefineByPos(stmthp, &defhp, errhp, 1, (void*)&count, sizeof(int), SQLT_INT, (void*)0, (ub2*)0, (ub2*)0, OCI_DEFAULT);
    OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);

    if(count > 0)
        printf("登录成功!\n");
    else
        printf("用户名或密码错误!\n");

    OCIStmtFree(stmthp, OCI_HTYPE_STMT);
    OCISessionEnd(svchp, errhp, mySesshp, OCI_DEFAULT);
    OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
    OCIHandleFree(envhp, OCI_HTYPE_ENV);
} 

以上代码实现了与Oracle数据库的连接,以及执行SQL语句和处理查询结果的功能。需要注意的是,在执行SQL语句时需要使用占位符,以避免SQL注入攻击。

最后,需要提醒一下使用C语言开发软件时需要注意内存管理,避免发生内存泄漏的情况。

总之,本文介绍了如何使用C语言和Oracle数据库来实现登录功能。虽然代码量较大,但是通过学习本文所述的知识点,相信读者们能够轻松实现登录功能,并在实践中逐步提升自己。

weinxin
版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
c登录功能oracle 数据库

c登录功能oracle

在现代软件开发中,登录功能是非常常见的一个功能。例如,一家公司的员工管理系统,每个员工都有一个账号和密码,必须要登录才能访问系统。而在使用C语言开发的软件中,要
c语言 blob oracle 数据库

c语言 blob oracle

C语言Blob Oracle – 数据库中的二进制数据类型在处理二进制数据的时候,C语言是一种高效的编程语言。然而,在存储二进制数据时,往往需要使用数据库。Or
datagrip连不上oracle 数据库

datagrip连不上oracle

在使用DataGrip时,有时可能会遇到连接Oracle数据库失败的情况,这可能会让你感到非常困扰。下面我们将讨论一些可能导致连接Oracle数据库失败的原因,
datetime对应oracle 数据库

datetime对应oracle

datetime是Python内置的一个日期和时间处理模块,可以方便地对日期和时间进行比较、格式化、计算等操作。在Oracle数据库中,也有对应的日期和时间处理
评论:0   参与:  0