前言

好久以前玩过OCI, 当时应该记录一下的。
这次想写个OCI的测试程序,客户端OCI开发环境问题弄的老费劲了。
OCIServerAttach那显示错误: ORA-12154: TNS: 无法解析指定的连接标识符.
为了解决OCI编程环境问题,纠结了好久.
上网查ORA-12154错误,解决方法都是千奇百怪的,因为每个人的开发环境和上下文都不同。
要不是集中时间来解决,还真搞不定。
解决问题时,查资料是一方面,自己捣鼓还是主要的,能遇到开发环境和上下文都和自己一样的问题答案还真是少见。

OCI开发环境设定要点

  • 服务器端的监听程序配置文件,要加入全局tns服务名称,然后重新停止,启动服务器端监听程序。

// C:\app\admin\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora

# listener.ora Network Configuration File: C:\app\admin\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(SID_NAME = CLRExtProc)(ORACLE_HOME = C:\app\admin\product\11.2.0\dbhome_1)(PROGRAM = extproc)(ENVS = "EXTPROC_DLLS=ONLY:C:\app\admin\product\11.2.0\dbhome_1\bin\oraclr11.dll"))(SID_DESC =(GLOBAL_DBNAME = ORCL)(ORACLE_HOME = C:\app\admin\product\11.2.0\dbhome_1)  (SID_NAME = ORCL)))LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.154.130)(PORT = 1521))))ADR_BASE_LISTENER = C:\app\admin
lsnrctl stop
lsnrctl start
lsnrctl status 
  • 只需要安装oracle客户端软件中的开发软件(第三项),不需要配置ODBC数据源。
  • OCIServerAttach要连接的是oracle客户端软件(网络配置助手)配置出来的TNS服务名称。
    要先用客户端的oracle网络助手先配置出监听程序和远端的服务名称
  • 工程要编译成win64的。

测试效果

connect local tns service name [orcl], user name = [system], password = [system]
do oci task
sw_rc = OCIStmtExecute(h_oci_context, h_oci_stmt, h_oci_error, (ub4)0, (ub4)0, (OCISnapshot*)0, (OCISnapshot*)0, OCI_DEFAULT);
query result set :
sw_rc = OCIAttrGet(h_oci_stmt, OCI_HTYPE_STMT, &fieldCount, NULL, OCI_ATTR_PARAM_COUNT, h_oci_error);
query result set columns = 3
columns 1 :
        g_col_info[0].m_i_data_type_org = 1
        name = TOPIC
        name len = 5
        data len = 50
        g_col_info[0].m_i_data_type_now = 1
----------------------------------------
columns 2 :g_col_info[1].m_i_data_type_org = 2name = SEQname len = 3data len = 22g_col_info[1].m_i_data_type_now = 1
----------------------------------------
columns 3 :
        g_col_info[2].m_i_data_type_org = 1
        name = INFO
        name len = 4
        data len = 80
        g_col_info[2].m_i_data_type_now = 1
----------------------------------------
row[0]col[0] = ACCEPT
row[0]col[1] = 1
row[0]col[2] =
----------------------------------------
row[1]col[0] = ACCEPT
row[1]col[1] = 2
row[1]col[2] =  ACCEPT
----------------------------------------
row[2]col[0] = ACCEPT
row[2]col[1] = 3
row[2]col[2] =  ------
----------------------------------------
row[3]col[0] = ACCEPT
row[3]col[1] = 4
row[3]col[2] =
----------------------------------------
row[4]col[0] = ACCEPT
row[4]col[1] = 5
row[4]col[2] =  Reads a line of input and stores it in a given substitution variable.
----------------------------------------
row[5]col[0] = ACCEPT
row[5]col[1] = 6
row[5]col[2] =
----------------------------------------
ok : db operation over
END
请按任意键继续. . .

测试程序

// @file oci_test_on_vs2017.cpp
// @brief test oci interface#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>// OCI开发环境配置
// 远端oracle服务器端装好,配好TNS服务名称
//
// 安装oracle客户端软件时,选第3项(开发工具).
// oracle客户端安装完后,用自带的网络助手配置监听器和远端的TNS服务名称
//
// 将工程设定为win64, 包含进OCI头文件和库文件.
// 在打开远端oracle服务器(进入服务器桌面)的情况下,就可以运行调试测试程序了.
// 不用配ODBS的DSN.#include "oci.h"
// oci.lib is win64, win32编译不过.
#pragma comment(lib, "oci.lib")// 用oracle网络助手配置的远端网络服务名称, 不是ODBC助手配置出来的dsn名称
#define REMOTE_TNS_SERVICE_NAME "orcl" // 服务名称不区分大小写
#define DB_USER_NAME "system"
#define DB_USER_PWD "system"typedef struct _tag_col_info{char* m_psz_name;int m_i_len_name;int m_i_data_type_org;int m_i_data_type_now;char* m_psz_data;int m_i_len_data;_tag_col_info() {m_psz_name = NULL;m_i_len_name = 0;m_i_data_type_org = SQLT_CHR;m_i_data_type_now = SQLT_CHR;m_psz_data = NULL;m_i_len_data = 0;}void clear() {if (NULL != m_psz_name) {delete [] m_psz_name;m_psz_name = NULL;}if (NULL != m_psz_data) {delete [] m_psz_data;m_psz_data = NULL;}m_i_len_name = 0;m_i_len_data = 0;m_i_data_type_org = SQLT_CHR;m_i_data_type_now = SQLT_CHR;}
}TAG_COL_INFO;std::string get_oci_error(const char* psz_tip, OCIError* h_oci_error);
void print_oci_error(const char* psz_tip, OCIError* h_oci_error);
void do_oci_task(OCIEnv* h_oci_env, OCIServer* h_oci_server, OCIError* h_oci_error, OCISvcCtx* h_oci_context, OCISession* h_oci_user);void case_oci_opt();int g_i_columns_cnt = 0;
TAG_COL_INFO g_col_info[100];int _tmain(int argc, _TCHAR* argv[])
{case_oci_opt();printf("END\n");system("pause");return 0;
}void case_oci_opt()
{sword sw_rc = 0;sword sw_tmp = 0;OCIEnv* h_oci_env = NULL; // 环境句柄OCIServer* h_oci_server = NULL; // 服务器句柄OCIError* h_oci_error = NULL; // 错误句柄OCISvcCtx* h_oci_context = NULL; // 上下文句柄OCISession* h_oci_user = NULL; // 用户句柄sb4 errcode = 0;char sz_buf[4096] = {'\0'};do {// 打印数据库连接信息printf("connect local tns service name [%s], user name = [%s], password = [%s]\r\n",REMOTE_TNS_SERVICE_NAME,DB_USER_NAME,DB_USER_PWD);// 创建环境句柄(线程和环境对象)sw_rc = OCIEnvCreate(&h_oci_env, OCI_THREADED | OCI_OBJECT, (dvoid*)0, 0, 0, 0, (size_t)0, (dvoid**)0);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : create env handle", h_oci_error);break;}// 创建服务器句柄sw_rc = OCIHandleAlloc((dvoid*)h_oci_env, (dvoid**)&h_oci_server, OCI_HTYPE_SERVER, 0, (dvoid**)0);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : create service handle", h_oci_error);break;}// 创建错误句柄sw_rc = OCIHandleAlloc((dvoid*)h_oci_env, (dvoid**)&h_oci_error, OCI_HTYPE_ERROR, 0, (dvoid**)0);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : create error handle", h_oci_error);break;}// OCI连接的不是ODBC DSN名称// my_oracle_dsn// ORA-12154: TNS: 无法解析指定的连接标识符// OCI连接的是远端TNS服务名称// TNSPING ORCL// 成功// 如果远端的oracle服务器关了,这里会显示错误:连接超时// ORA-12170: TNS: 连接超时// 连接远程数据库(tns服务名称)sw_rc = OCIServerAttach(h_oci_server, h_oci_error,(text*)REMOTE_TNS_SERVICE_NAME,(sb4)strlen(REMOTE_TNS_SERVICE_NAME),OCI_DEFAULT);// packet 1~18if (OCI_SUCCESS != sw_rc) {print_oci_error("error : remote database connect", h_oci_error);break;}// 创建上下文sw_rc = OCIHandleAlloc((dvoid*)h_oci_env, (dvoid**)&h_oci_context, OCI_HTYPE_SVCCTX, 0, (dvoid**)0);// packet 19~20if (OCI_SUCCESS != sw_rc) {print_oci_error("error : create context", h_oci_error);break;}// 设置上下文属性sw_rc = OCIAttrSet((dvoid**)h_oci_context, OCI_HTYPE_SVCCTX, (dvoid*)h_oci_server, (ub4)0, OCI_ATTR_SERVER, h_oci_error);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : set context", h_oci_error);break;}// 创建用户句柄sw_rc = OCIHandleAlloc((dvoid*)h_oci_env, (dvoid**)&h_oci_user, OCI_HTYPE_SESSION, 0, (dvoid**)0);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : create user", h_oci_error);break;}// 设置用户名sw_rc = OCIAttrSet((dvoid*)h_oci_user, OCI_HTYPE_SESSION, (dvoid*)DB_USER_NAME, (ub4)strlen(DB_USER_NAME), OCI_ATTR_USERNAME, h_oci_error);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : set user name", h_oci_error);break;}// 设置口令sw_rc = OCIAttrSet((dvoid*)h_oci_user, OCI_HTYPE_SESSION, (dvoid*)DB_USER_PWD, (ub4)strlen(DB_USER_PWD), OCI_ATTR_PASSWORD, h_oci_error);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : set user password", h_oci_error);break;}// 会话开始sw_rc = OCISessionBegin(h_oci_context, h_oci_error, h_oci_user, OCI_CRED_RDBMS, OCI_DEFAULT);// packet 21~26if (OCI_SUCCESS != sw_rc) {print_oci_error("error : session begin", h_oci_error);break;}// 在会话上设置用户信息sw_rc = OCIAttrSet((dvoid*)h_oci_context, OCI_HTYPE_SVCCTX, (dvoid*)h_oci_user, (ub4)0, OCI_ATTR_SESSION, h_oci_error);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : set user info on service handle", h_oci_error);break;}// 干活do_oci_task(h_oci_env, h_oci_server, h_oci_error, h_oci_context, h_oci_user);printf("ok : db operation over\r\n");} while (0);// 会话结束sw_rc = OCISessionEnd(h_oci_context, h_oci_error, h_oci_user, OCI_DEFAULT);// packet 39~41if (OCI_SUCCESS != sw_rc) {print_oci_error("error : end session", h_oci_error);}// 断开连接sw_rc = OCIServerDetach(h_oci_server, h_oci_error, OCI_DEFAULT);// packet 42`46if (OCI_SUCCESS != sw_rc) {print_oci_error("error : detach server", h_oci_error);}// --------------------------------------------------------------------------------// 释放句柄// --------------------------------------------------------------------------------sw_rc = OCIHandleFree((void*)h_oci_user, OCI_HTYPE_SESSION);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCI_HTYPE_SESSION", h_oci_error);}sw_rc = OCIHandleFree((void*)h_oci_context, OCI_HTYPE_SVCCTX);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCI_HTYPE_SVCCTX", h_oci_error);}sw_rc = OCIHandleFree((void*)h_oci_error, OCI_HTYPE_ERROR);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCI_HTYPE_ERROR", NULL);}sw_rc = OCIHandleFree((void*)h_oci_server, OCI_HTYPE_SERVER);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCI_HTYPE_SERVER", NULL);}sw_rc = OCIHandleFree((void*)h_oci_env, OCI_HTYPE_ENV);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCI_HTYPE_ENV", NULL);}
}std::string get_oci_error(const char* psz_tip, OCIError* h_oci_error)
{char sz_buf[4096] = { '\0' };sword sw_rc = 0;sb4 errcode = 0;std::string str_rc = "";if (NULL != psz_tip) {str_rc += psz_tip;}str_rc += "\r\n";if (NULL != h_oci_error) {sw_rc = OCIErrorGet(h_oci_error,(ub4)1,(text*)NULL,&errcode,(OraText*)sz_buf,(ub4)sizeof(sz_buf),(b4)OCI_HTYPE_ERROR);if (OCI_SUCCESS == sw_rc) {str_rc += "\t";str_rc += sz_buf;}}return str_rc;
}void print_oci_error(const char* psz_tip, OCIError* h_oci_error)
{printf("%s\r\n", get_oci_error(psz_tip, h_oci_error).c_str());
}void do_oci_task(OCIEnv* h_oci_env, OCIServer* h_oci_server, OCIError* h_oci_error, OCISvcCtx* h_oci_context, OCISession* h_oci_user)
{// 从oracle原生数据库中选择一条唯一的记录// select * from help where topic = 'ACCEPT' AND SEQ = 7;// OraText* ora_text_select = (OraText*)"select * from help where topic = 'ACCEPT' AND SEQ = 7"; // 只有1条OraText* ora_text_select = (OraText*)"select * from help where topic = 'ACCEPT' AND SEQ < 7"; // 共7条sword sw_rc = 0;OCIStmt* h_oci_stmt = NULL; // SQL语句句柄OCIDefine* h_oci_define = NULL;OCIParam* h_oci_param = NULL;OraText* colName = NULL;ub4 colNameSize = 0;ub2 stmt_type = 0; // SQL语句类型ub4 fieldCount = 0; // 结果集字段数量ub4 i_index = 0;int i_row_index = 0;ub4 col_len = 0;ub4 col_lenSize = 0;int dtypeNew = 0;ub4 dtype = 0;do {if ((NULL == h_oci_env)|| (NULL == h_oci_server)|| (NULL == h_oci_error)|| (NULL == h_oci_user)|| (NULL == h_oci_context)) {printf("oci handle invalid\r\n");break;}printf("do oci task\r\n");// 建立SQL语句句柄sw_rc = OCIHandleAlloc(h_oci_env, (void**)&h_oci_stmt, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : create OCI_HTYPE_STMT", h_oci_error);break;}// 准备SQL语句sw_rc = OCIStmtPrepare(h_oci_stmt, h_oci_error, ora_text_select, (ub4)strlen((const char*)ora_text_select), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCIStmtPrepare", h_oci_error);break;}// 执行SQLprintf("sw_rc = OCIStmtExecute(h_oci_context, h_oci_stmt, h_oci_error, (ub4)0, (ub4)0, (OCISnapshot*)0, (OCISnapshot*)0, OCI_DEFAULT);\r\n");sw_rc = OCIStmtExecute(h_oci_context, h_oci_stmt, h_oci_error, (ub4)0, (ub4)0, (OCISnapshot*)0, (OCISnapshot*)0, OCI_DEFAULT);// packet 27~29if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCIStmtExecute", h_oci_error);break;}// 获取SQL语句类型sw_rc = OCIAttrGet(h_oci_stmt, OCI_HTYPE_STMT, &stmt_type, NULL, OCI_ATTR_STMT_TYPE, h_oci_error);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCI_ATTR_STMT_TYPE", h_oci_error);break;}// 取结果集列信息if (OCI_STMT_SELECT == stmt_type) {printf("query result set :\r\n");printf("sw_rc = OCIAttrGet(h_oci_stmt, OCI_HTYPE_STMT, &fieldCount, NULL, OCI_ATTR_PARAM_COUNT, h_oci_error);\r\n");sw_rc = OCIAttrGet(h_oci_stmt, OCI_HTYPE_STMT, &fieldCount, NULL, OCI_ATTR_PARAM_COUNT, h_oci_error);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCI_ATTR_STMT_TYPE", h_oci_error);break;}printf("query result set columns = %d\r\n", fieldCount);g_i_columns_cnt = fieldCount;for (i_index = 0; i_index < fieldCount; i_index++) {h_oci_param = NULL;dtype = 0;printf("columns %d : \r\n", i_index + 1);ub4 dtypeSize = sizeof(dtype);sw_rc = OCIParamGet(h_oci_stmt, OCI_HTYPE_STMT, h_oci_error, (void**)&h_oci_param, i_index + 1);if (OCI_SUCCESS != sw_rc){print_oci_error("error : OCIParamGet", h_oci_error);break;}sw_rc = OCIAttrGet(h_oci_param, OCI_DTYPE_PARAM, &dtype, &dtypeSize, OCI_ATTR_DATA_TYPE, h_oci_error);if (OCI_SUCCESS != sw_rc){print_oci_error("error : OCIAttrGet", h_oci_error);break;}g_col_info[i_index].m_i_data_type_org = (int)dtype;printf("\tg_col_info[%d].m_i_data_type_org = %d\r\n", i_index, g_col_info[i_index].m_i_data_type_org);colName = NULL;colNameSize = sizeof(colName);sw_rc = OCIAttrGet(h_oci_param, OCI_DTYPE_PARAM, &colName, &colNameSize, OCI_ATTR_NAME, h_oci_error);if (OCI_SUCCESS != sw_rc){print_oci_error("error : OCIAttrGet", h_oci_error);break;}g_col_info[i_index].m_i_len_name = (int)colNameSize;g_col_info[i_index].m_psz_name = new char[g_col_info[i_index].m_i_len_name + 1];memset(g_col_info[i_index].m_psz_name, 0, g_col_info[i_index].m_i_len_name + 1);strcpy_s(g_col_info[i_index].m_psz_name, g_col_info[i_index].m_i_len_name + 1, (char*)colName);printf("\tname = %s\r\n", (char*)colName);printf("\tname len = %d\r\n", (int)colNameSize);col_len = 0;col_lenSize = sizeof(col_len);dtypeNew = SQLT_CHR;switch (dtype){case SQLT_DAT:case SQLT_DATE:case SQLT_TIME:case SQLT_TIME_TZ:case SQLT_TIMESTAMP:case SQLT_TIMESTAMP_TZ:case SQLT_TIMESTAMP_LTZ:{dtypeNew = SQLT_ODT;col_len = sizeof(OCIDate);}break;case SQLT_CLOB:case SQLT_CHR:case SQLT_INT:case SQLT_UIN:case SQLT_NUM:case SQLT_FLT:case SQLT_STR:case SQLT_VNU:case SQLT_LNG:case SQLT_VCS:case SQLT_LVC:case SQLT_AFC:case SQLT_AVC:{sw_rc = OCIAttrGet(h_oci_param, OCI_DTYPE_PARAM, &col_len, &col_lenSize, OCI_ATTR_DATA_SIZE, h_oci_error);if (OCI_SUCCESS != sw_rc){print_oci_error("error : OCIAttrGet", h_oci_error);break;}printf("\tdata len = %d\r\n", (int)col_len);dtypeNew = SQLT_CHR;}break;default:// assert(0);break;}g_col_info[i_index].m_i_data_type_now = (int)dtypeNew;printf("\tg_col_info[%d].m_i_data_type_now = %d\r\n", i_index, g_col_info[i_index].m_i_data_type_now);g_col_info[i_index].m_i_len_data = (int)col_len;g_col_info[i_index].m_psz_data = new char[g_col_info[i_index].m_i_len_data + 1];memset(g_col_info[i_index].m_psz_data, 0, g_col_info[i_index].m_i_len_data + 1);h_oci_define = NULL;sw_rc = OCIDefineByPos(h_oci_stmt, &h_oci_define, h_oci_error, i_index + 1, g_col_info[i_index].m_psz_data, col_len * sizeof(char), dtypeNew, 0, 0, 0, OCI_DEFAULT);if (OCI_SUCCESS != sw_rc){print_oci_error("error : OCIDefineByPos", h_oci_error);break;}printf("----------------------------------------\r\n");}}// 遍历行集i_row_index = 0;do {sw_rc = OCIStmtFetch(h_oci_stmt, h_oci_error, 1, OCI_FETCH_NEXT, OCI_DEFAULT);// 如果是查第一行,并不发收包,可能执行后,返回的数据中已经包含第一行// packet 30~32 如果数据不够了,会继续请求包。// packet 33~35// packet 36~38if (OCI_NO_DATA == sw_rc){break;}for (i_index = 0; i_index != g_i_columns_cnt; i_index++){printf("row[%d]col[%d] = %s\r\n", i_row_index, i_index, (NULL != g_col_info[i_index].m_psz_data) ? g_col_info[i_index].m_psz_data : "NULL");}printf("----------------------------------------\r\n");i_row_index++;} while (1);// 释放资源for (i_index = 0; i_index != g_i_columns_cnt; i_index++){g_col_info[i_index].clear();}} while (0);// 释放oci句柄sw_rc = OCIHandleFree((void*)h_oci_stmt, OCI_HTYPE_STMT);if (OCI_SUCCESS != sw_rc) {print_oci_error("error : OCI_HTYPE_STMT", NULL);}
}

OCI env setting相关推荐

  1. brew卸载jenv_使用brew,cask和jenv在MacOSX上设置多个Java JRE / JDK

    brew卸载jenv 昨天在Java9的Jigsaw HackTheTower事件中,我意识到我需要加强我的游戏并改善我现有的机制,以在我的机器上维护几个不同的JDK. 我曾经手动下载jdk,或使用b ...

  2. 使用brew,cask和jenv在MacOSX上设置多个Java JRE / JDK

    昨天在Java9的Jigsaw HackTheTower事件中,我意识到我需要加强我的游戏并改善我现有的机制,以在我的机器上维护几个不同的JDK. 我曾经手动下载jdk,或使用brew cask安装它 ...

  3. 一文读懂最强中文NLP预训练模型ERNIE

    基于飞桨开源的持续学习的语义理解框架ERNIE 2.0,及基于此框架的ERNIE 2.0预训练模型,在共计16个中英文任务上超越了BERT和XLNet, 取得了SOTA效果.本文带你进一步深入了解ER ...

  4. 域控查看ldap端口命令_LDAP基础安装与简单入门使用

    0x00 前言简述 主要产品 基本模型 应用场景 0x01 环境安装 基于 yum 安装 基于 Docker 安装 0x02 LDAP配置&命令 slapd 命令 ldapsearch 命令 ...

  5. SGX初始化中ELF文件解析

    先记 ElfParser::run_parser()函数是SGX初始化<再回顾sgx_create_enclave>慢慢长征路的中间一环.比较独立又有些复杂,单独抽出来讲. ELF文件布局 ...

  6. LDAP基础:3:通过389端口对openldap进行操作

    在前面的文章中介绍了如何使用docker快速搭建ldap服务并进行确认,以及在java中如何使用jndi对ldap进行访问,但是按照官方github上的示例,由于没有将端口暴露出来,所以在宿主机对容器 ...

  7. LDAP基础:8:ldap用户密码确认和修改

    ldap用户密码的修改可以使用ldappasswd命令,也可以使用万能的ldapmodify结合ldif文件来实现,但所修改的都是普通的用户,cn=admin的管理员用户的修改一般可以通过slappa ...

  8. java 云开发系统_云开发 CloudBase CMS 内容管理系统正式开源啦!

    在企业或个人运营场景中,经常需要管理繁杂的数据,如组织名单.博客文章.销售数据等,利用 Excel 进行数据管理的传统模式繁琐低效,数据易丢失,在此背景下,内容管理系统 (CMS) 应运而生,以专业的 ...

  9. java ladp_OpenLDAP源码安装及配置管理

    OpenLDAP源码安装 下载OpenLDAP源码 编译源码 tar -zxvf openldap-2.4.48.tgz cd openldap-2.4.48/ ./configure 编译错误 co ...

最新文章

  1. 使用tensorflow预测函数的参数值(a simple task)
  2. 事务(ACID)、并发一致性问题(丢失修改、读脏数据、不可重复读、幻影读)、封锁(封锁粒度、类型、协议、MySQL 隐式与显示锁定)
  3. [ofbiz]设置任务计划(job),提示service_item已经传递
  4. iphone11右上角信号显示_苹果iOS11信号强度的标志变了意味着什么?
  5. 9203班级纪律 1202
  6. 微软将推出Surface Duo双屏手机:售价1399美元
  7. 图解:一句“我喜欢你”在网络中经历了什么
  8. VISTA三步共享文件夹
  9. 淘宝TDDL深入浅出
  10. LOLCC换肤盒子官网网站源码
  11. java山地自行车怎么看型号_怎么看捷安特山地车型号
  12. 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
  13. 字节序: big-endian vs little-endian
  14. (疯狂的石头)阿弥陀佛,上帝保佑铃声 (疯狂的石头)阿弥陀...
  15. [JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏
  16. dedecms织梦后台模板layui框架
  17. 支付宝转账-提取根证书失败 AlipayRootCert Is Invalid
  18. 与EEG信号的相关的基础知识以及运动想象信号的生理活动
  19. Linux 虚拟文件系统(一)概述
  20. uboot nor flash驱动移植(基于am29lv160bt)之环境变量没法保存的办法 .

热门文章

  1. 旅游行业如何做好网络舆情监测?
  2. 视频点播系统,视频播放器,在线视频点播学习系统毕业设计
  3. 【论文阅读】【CVPR2022】Contrastive Learning of Class-agnostic Activation Map
  4. python microbit typeerror_Microbit python无效语法
  5. VLC一--零阶指数哥伦布码解码原理和实现
  6. 全网最全!中国计算机学会推荐国际学术会议和期刊汇总
  7. python中true是什么意思_Python解惑之True和False详解
  8. PHP有三宝,三、认识三宝
  9. CSS复合选择器( 交集、 并集、后代、子元素、兄弟、伪类、伪元素)
  10. 【Django 学习笔记】1、基础概念和MVT架构