设为首页 收藏本站
查看: 742|回复: 0

[经验分享] 基于Oracle OCI的数据访问C语言接口ORADBI

[复制链接]
YunVN网友  发表于 2016-8-17 06:36:19 |阅读模式
基于Oracle OCI的数据访问C语言接口ORADBI

cheungmine@gmail.com

Mar. 22,2008

ORADBI是我在Oracle OCI(Oracle 调用接口)基础上开发的,支持Oracle8i、9i、10g等数据库。根据Oracle公司的介绍:OCI是如此可靠,以至于Oracle数据库中的每一条SQL语句都通过OCI来执行。当应用程序开发人员需要面向Oracle数据库服务器的最强大的接口时,他们将调用 Oracle调用接口(OCI)。OCI提供了对所有Oracle数据库功能的最全面的访问。OCI API中包含了最新的性能、可伸缩性和安全性特性。
采用OCI的最大好处就是:它是最切近Oracle底层的技术,因此,效率是最高的。同时,它是跨平台的。因此,在我给出的ORADBI库,除了OCI之外,没有其他外部依赖,稍加改动,就可以移植到非Windows平台上或其他嵌入式平台。

然而,OCI也比较不容易使用。它的功能之强,粒度之细,语法之烦琐,都不适合今天熟悉了快速开发模式的人员使用。然而,OCI的高效,直接根植于数据库核心,跨平台的语言特性,是其他如OO4O、OLEDB、ADO等COM方式不具备的。我最初开发Oralce数据库是4年以前,使用的是OO4O。直到最近,使用OCI成了我的爱好。于是,写了一套OCI的Helper库,方便OCI的使用。我不敢说是OCI的Wrapper库,因为我没能力包装OCI的方方面面。然而,我的ORADBI已经足够我(可能也包括你们)日常使用了。我就是用这套ORADBI操纵BLOB等大数据字段的。

公布这套ORADBI库,没有任何商业上的风险:我拥有这个库的全部版权,任何个人或团体可以为任何目的免费地、无限制地使用ORADBI库,前提是不能声明对ORADBI库的版权。对使用ORADBI库所造成的任何后果,我不负任何责任。如果这套软件对您的工作产生了很大的帮助,我不拒绝任何您的资助。

好了,让我们概览一下这个库,它包含下列文件:

.h文件.c文件
oradbi.h
*oradbi.c
oracol.horacol.c
oraconn.horaconn.c
oradate.horadate.c
oraerr.horaerr.c
oraparam.horaparam.c

orarows.horarows.c
orastmt.horastmt.c
oratype.h

unistd.h
list.h list.c
hashmap.hhashmap.c



  其中,oradbi.h是你唯一需要包含的头文件。当把ORADBI作为动态库连接到你的工程里使用时,你在你的项目里加入类似下面的代码:
//test.cpp
#include"../oradbi/oradbi.h"

#ifdef_DEBUG
#pragmacomment(lib,"../oradbi/debug/oradbid.lib")
#else
#pragmacomment(lib,"../oradbi/release/oradbi.lib")
#endif


   下面是oradbi.h的全部内容:
/*======================================================================
oradbi.h-Createdbycheungmine,Allrightsreserved.
First:Mar.8,2008
======================================================================
*/
#ifndefORADBI_H_INCLUDED
#defineORADBI_H_INCLUDED

#ifdef__cplusplus
extern"C"{
#endif

#ifdefORADBI_DLLEXPORT
#defineORADB_CALL__declspec(dllexport)
#defineORADB_CALL1(x)__declspec(dllexport)x
#endif

#ifndefORADB_CALL
#defineORADB_CALL
#endif

#ifndefORADB_CALL1
#defineORADB_CALL1(x)xORADB_CALL
#endif

/*NOTSUPPORTUNICODE*/
#ifdefUNICODE
#pragmamessage(__FILE__"WarningUNICODE:CannotuseUNICODE")
#endif

/*NOTSUPPORTUNICODE*/
#ifdef_UNICODE
#pragmamessage(__FILE__"WarningUNICODE:CannotuseUNICODE")
#endif

#include
"unistd.h"
#include
"oratype.h"
#include
"oraerr.h"

/*======================================================================
connectionFunctions-oraconn.c
======================================================================
*/
/*connectstheapplicationtotheoracleserver.*/
lresultORADB_CALLORA_connection_create(
OUTora_connection
*connection,
IN
constchar*service_name,
IN
constchar*username,
IN
constchar*password,
IN
ulongenv_mode,/*=OCI_THREADED|OCI_OBJECT*/
INBOOLnon_blocking_mode,
/*=FALSE*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*disconnectstheapplicationfromtheoracleserver.*/
voidORADB_CALLORA_connection_free(
INora_connectionconnection
);

/*executesasqlstatementwithnoresult*/
lresultORADB_CALLORA_connection_execute(
INora_connectionconnection,
IN
constchar*sql_block,
IN
intsql_len,/*-1forstrlencalled*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*prepares(andreturns)asqlstatementforexecution*/
lresultORADB_CALLORA_connection_prepare(
INora_connectionconnection,
IN
constchar*sql_block,
IN
intsql_len,/*-1forstrlencalled*/
OUTora_sqlstmt
*sqlstmt,/*asqlstatementforexecutionreturned*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*executesaselectsqlstatementandreturntheresultset*/
lresultORADB_CALLORA_connection_select(
INora_connectionconnection,
IN
constchar*sql_select,
IN
intsql_len,/*-1forstrlencalled*/
OUTora_rowset
*rowset,/*theresultsetreturned*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*commitschanges*/
lresultORADB_CALLORA_connection_commit(
INora_connectionconnection,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*rollbackschanges*/
lresultORADB_CALLORA_connection_rollback(
INora_connectionconnection,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*======================================================================
sqlstmtFunctions-orastmt.c
======================================================================
*/
lresultORADB_CALLORA_sqlstmt_create(
OUTora_sqlstmt
*sqlstmt,
INora_connectionconnection,
IN
constchar*sql_block,
IN
intsql_len,/*-1forstrlentobecalled*/
IN
ushortfetch_size,/*0fordefaultorbindarraysizeforINSERT*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

voidORADB_CALLORA_sqlstmt_free(
INora_sqlstmtsqlstmt
);

/*executesasqlstatementwithnooutputparameters*/
lresultORADB_CALLORA_sqlstmt_execute(
INora_sqlstmtsqlstmt,
INORADBI_ExecModemode,
/*executemode:MOD_DEFAULT=0*/
IN
ushortiters,/*0isdefault*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*executesaselectsqlstatementandreturnstheresultset*/
lresultORADB_CALLORA_sqlstmt_select(
INora_sqlstmtsqlstmt,
INORADBI_ExecModemode,
/*executemode:MOD_DEFAULT=0*/
OUTora_rowset
*rowset,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*bindsanamedvariabletosqlstmtbutforlob,whentypeissettoODT_UNKNOWNtypeistakenfromname'sprefix*/
lresultORADB_CALLORA_sqlstmt_bind(
INora_sqlstmtsqlstmt,
IN
constchar*name,/*paramnamebound*/
INORADBI_DataTypetype,
/*paramtypebound.setODT_UNKNOWNforsimplely.cannotbealobtype*/
IN
intsize,/*paramsizeforTEXT,LOB.0forothers*/
OUTora_param
*param,/*aoutparamboundtosqlstmt*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*bindsanamedvariabletosqlstmtonlywithlobtype*/
lresultORADB_CALLORA_sqlstmt_bind_lob(
INora_sqlstmtsqlstmt,
IN
constchar*name,/*paramnamebound*/
IN
intmax_size,/*maximumsizeoflobdata,0fordefault.if0,client_datamustbeavalidpointer*/
INORADBI_InBind
*inbind,/*canbenull.ifnull,max_sizemustbeameaningfulvaluenotmorethan65535*/
INORADBI_OutBind
*outbind,/*canbenull*/
OUTora_param
*param,/*aoutparamboundtosqlstmt*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*accessesparaminthesqlstmtbyname.getsareferencetoparam*/
ora_paramORADB_CALLORA_sqlstmt_get_param_by_name(
INora_sqlstmtsqlstmt,
IN
constchar*param_name,/*MUSTbeavalidnamestring*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*accessesparaminthesqlstmtbyindex:1-based.getsareferencetoparam*/
ora_paramORADB_CALLORA_sqlstmt_get_param_by_index(
INora_sqlstmtsqlstmt,
IN
ushortparam_index,/*PARAM_INDEX_BASEbased*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);


/*======================================================================
rowsetFunctions-orarows.c
======================================================================
*/
/*returnsnumberofrowsfetchedsofar*/
lresultORADB_CALLORA_rowset_num_rows(
INora_rowsetrowset,
OUTsize_t
*num_rows,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsnumberofcolumns*/
lresultORADB_CALLORA_rowset_num_columns(
INora_rowsetrowset,
OUTsize_t
*num_cols,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*fetchesnextrowofrecord.TRUEforNOTcompleted;FALSEforcompleted*/
BOOLORADB_CALLORA_rowset_next(
INora_rowsetrowset
);

/*freesaora_rowset.afreedrowsethandleisaninvalidpointerandcannotbeusedanymore*/
voidORADB_CALLORA_rowset_free(
INora_rowsetrowset
);

/*accessescolumninthecurrentrowbyname.getsareferencetocolumn*/
ora_columnORADB_CALLORA_rowset_get_column_by_name(
INora_rowsetrowset,
IN
constchar*col_name,/*MUSTbeavalidnamestring*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*accessescolumninthecurrentrowbyindex:1-based.getsareferencetocolumn*/
ora_columnORADB_CALLORA_rowset_get_column_by_index(
INora_rowsetrowset,
IN
ushortcol_index,/*COLUMN_INDEX_BASEbased*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*======================================================================
columnFunctions-oracol.c
======================================================================
*/
/*returnscolumndatatype*/
ORADB_CALL1(
constchar*)ORA_column_get_name(
INora_columncolumn
);

/*returnscolumndatatype*/
ORADBI_DataTypeORADB_CALLORA_column_get_type(
INora_columncolumn
);

/*returnscolumndisplaysize*/
size_tORADB_CALLORA_column_get_dispsize(
INora_columncolumn
);

/*returnscolumnprecisionofnumbericdatatype*/
intORADB_CALLORA_column_get_precision(
INora_columncolumn
);

/*returnscolumnscaleofnumbericdatatype*/
intORADB_CALLORA_column_get_scale(
INora_columncolumn
);

/*returnswhethercolumnisnullok*/
BOOLORADB_CALLORA_column_is_null_ok(
INora_columncolumn
);

/*returnswhethercolumnvalueisnull*/
BOOLORADB_CALLORA_column_is_null(
INora_columncolumn
);

/*returnscolumnvalueasstring*/
lresultORADB_CALLORA_column_as_string(
INora_columncolumn,
OUT
char**outval,/*Returnsaddressofpointertoactualdata*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnscolumnvalueasdouble*/
lresultORADB_CALLORA_column_as_double(
INora_columncolumn,
OUT
double*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnscolumnvalueasfloat32*/
lresultORADB_CALLORA_column_as_float(
INora_columncolumn,
OUT
float*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnscolumnvalueaslong*/
lresultORADB_CALLORA_column_as_long(
INora_columncolumn,
OUT
long*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnscolumnvalueasunsignedlong*/
lresultORADB_CALLORA_column_as_ulong(
INora_columncolumn,
OUT
ulong*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnscolumnvalueasint64*/
lresultORADB_CALLORA_column_as_longlong(
INora_columncolumn,
OUTlonglong
*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnscolumnvalueasuint64*/
lresultORADB_CALLORA_column_as_ulonglong(
INora_columncolumn,
OUTulonglong
*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnscolumnvalueasdatetime*/
lresultORADB_CALLORA_column_as_datetime(
INora_columncolumn,
OUTora_datetime
*outval,
OUTora_error_t
*error
);


/*getslobsizeforread.ifacolumnisn'taLOBtypeorNULL,return0*/
size_tORADB_CALLORA_column_lob_size(
INora_columncolumn
);

/*readlobcolumnvalue-pullingmode*/
/*AnexampleofpullinglobdatawithORA_column_read_lob:
#defineBUFF_SIZE512

bytelob_buf[BUFF_SIZE];
lob_siz=ORA_column_lob_size(col);
lob_data=(byte*)malloc(lob_siz);
cb_offs=0;
cb_read=BUFF_SIZE;

while((rc=ORA_column_read_lob(col,lob_siz,cb_offs,lob_buf,&cb_read,&err))==ORC_NEED_DATA||rc==ORC_SUCCESS)
{
memcpy(lob_data+cb_offs,lob_buf,cb_read);
cb_offs+=cb_read;
if(rc==ORC_SUCCESS)
break;
cb_read=BUFF_SIZE;
}
ASSERT(cb_offs==lob_siz);
*/
lresultORADB_CALLORA_column_read_lob(
INora_columncolumn,
INsize_tlobsize_to_read,
/*totalbytestoread,usuallyislob_size*/
INsize_tcb_offset,
/*offsetbytesfromthestartoflobdata*/
INOUT
byte*in_buf,/*whenreturned,in_bufhasactualdata*/
INOUTsize_t
*cb_read,/*inputisbufsizeandoutputissizeofbytesberead*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);


/*returnslobcolumnvalueasbytesonceforall.out_bufisallocatedbycallerforfetchbytes.
*buf_sizeissizeofout_buf
*ORA_column_as_bytescallsORA_column_read_lobinternally.
*/
/*AnexampleofpullinglobdatawithORA_column_as_bytes:
size_tlob_size=ORA_column_lob_size(col);
byte*out_buf=malloc(lob_size);
ORA_column_as_bytes(col,out_buf,&lob_size,NULL);
...
free(out_buf);
*/
lresultORADB_CALLORA_column_as_bytes(
INora_columncolumn,
INOUT
byte*out_buf,
INOUTsize_t
*lob_size,/*sizebytesoflobdatawhichmust<=sizeofbuffer*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*======================================================================
paramFunctions-oraparam.c
======================================================================
*/
ORADBI_DataTypeORADB_CALLORA_param_get_type(
INora_paramparam
);

lresultORADB_CALLORA_param_set_long(
INora_paramparam,
IN
longval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_ulong(
INora_paramparam,
IN
ulongval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_longlong(
INora_paramparam,
INlonglongval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_ulonglong(
INora_paramparam,
INulonglongval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_datetime(
INora_paramparam,
INora_datetimeval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

voidORADB_CALLORA_param_set_null(
INora_paramparam
);

lresultORADB_CALLORA_param_set_float(
INora_paramparam,
IN
floatval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_double(
INora_paramparam,
IN
doubleval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_string(
INora_paramparam,
IN
constchar*val,
IN
shortlen,/*-1forstrlencalled*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_bytes(
INora_paramparam,
IN
constbyte*in_buf,
IN
ushortsize_buf,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

BOOLORADB_CALLORA_param_is_null(
INora_paramparam
);

/*returnscolumnvalueasstring*/
lresultORADB_CALLORA_param_as_string(
INora_paramparam,
OUT
char**outval,/*Returnsaddressofpointertoactualdata*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsparamvalueasdouble*/
lresultORADB_CALLORA_param_as_double(
INora_paramparam,
OUT
double*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsparamvalueasfloat32*/
lresultORADB_CALLORA_param_as_float(
INora_paramparam,
OUT
float*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsparamvalueaslong*/
lresultORADB_CALLORA_param_as_long(
INora_paramparam,
OUT
long*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsparamvalueasunsignedlong*/
lresultORADB_CALLORA_param_as_ulong(
INora_paramparam,
OUT
ulong*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsparamvalueaslong*/
lresultORADB_CALLORA_param_as_longlong(
INora_paramparam,
OUTlonglong
*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsparamvalueasunsignedlong*/
lresultORADB_CALLORA_param_as_ulonglong(
INora_paramparam,
OUTulonglong
*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsparamvalueasdatetime*/
lresultORADB_CALLORA_param_as_datetime(
INora_paramparam,
OUTora_datetime
*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsparamvalueasrowset*/
lresultORADB_CALLORA_param_as_rowset(
INora_paramparam,
OUTora_rowset
*outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*======================================================================
datetimeFunctions-oradate.c
======================================================================
*/
/*createsadatetimeopaquepointerwhichmustbefreeafterusing*/
lresultORADB_CALLORA_datetime_create(
OUTora_datetime
*dt/*mustbeavalidpointer*/
);

lresultORADB_CALLORA_datetime_set_all(
INora_datetimedt,
IN
shortyear,/*gregorianyear;rangeis-4712<=year<=9999*/
INORADBI_DTMonthmonth,
/*month;rangeis1<=month<12*/
IN
byteday,/*day;rangeis1<=day<=31*/
IN
bytehours,/*hours;rangeis0<=hours<=23*/
IN
byteminutes,/*minutes;rangeis0<=minutes<=59*/
IN
byteseconds,/*seconds;rangeis0<=seconds<=59*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

voidORADB_CALLORA_datetime_get_all(
INora_datetimedt,
OUT
short*year,/*gregorianyear;rangeis-4712<=year<=9999*/
OUTORADBI_DTMonth
*month,/*month;rangeis1<=month<12*/
OUT
byte*day,/*day;rangeis1<=day<=31*/
OUT
byte*hours,/*hours;rangeis0<=hours<=23*/
OUT
byte*minutes,/*minutes;rangeis0<=minutes<=59*/
OUT
byte*seconds/*seconds;rangeis0<=seconds<=59*/
);

lresultORADB_CALLORA_datetime_set_fld(
INora_datetimedt,
INORADBI_DTFielddt_field,
IN
shortdt_val,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

shortORADB_CALLORA_datetime_get_fld(
INora_datetimedt,
INORADBI_DTFielddt_field
);

lresultORADB_CALLORA_string_to_datetime(
IN
constchar*dt_string,/*datetimestringsuchas:1975-08-1412:53:42*/
IN
char*dt_format,/*datetimeformatsuchas:yyyy-mm-ddhh:uu:ss*/
OUTora_datetimedt_to,
/*datetimethatstringtranslatedto*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_datetime_to_string(
INora_datetimedt_in,
/*datetimetobetranslated*/
IN
char*dt_format,/*datetimeformatsuchas:yyyy-mm-ddhh:uu:ss*/
OUT
char*string_to,/*datetimestringsuchas:1975-08-1412:53:42*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*freesaora_datetime*/
voidORADB_CALLORA_datetime_free(
INora_datetimedt
);


#ifdef__cplusplus
}
#endif

/*====================================================================*/
#endif/*ndefORADBI_H_INCLUDED. cheungmine@gmail.com */

  您可以在下面的链接中下载整个工程(包含测试一个项目),用VS2005(VC8)打开、编译。如果有任何问题,可以留言或发e-mail给我。
  http://download.csdn.net/source/399444
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-258744-1-1.html 上篇帖子: Oracle系列之七 并发与多版本控制 下篇帖子: Oracle PL/SQL 性能分析工具 profiler 说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表