Pro*c/c++ 在VC6.0中的编译方法

引用自:http://www.cnblogs.com/doublesnke/archive/2011/07/19.html

【Pro*c编译过程】

1。进入VC6.0 的界面,选择TOOLS-CUSTOMIZE后出现框后,选择tools选项,将选择最下面的空格处,输入:

 

Pro*c/c++ 在VC6.0中的编译方法_第1张图片

2。存盘后,在主菜单下就有了PROC

3。在PROJECT-SETTING后,选择LINK后,输入orasql10.lib

Pro*c/c++ 在VC6.0中的编译方法_第2张图片

4。设置完毕。

【Pro*c++编译过程】

1、添加oratools.h

#ifndef __LZP_ORACLE_TOOLS_HEAD__
#define __LZP_ORACLE_TOOLS_HEAD__
struct VARCHAR
{
 unsigned short len;
 char arr[30];
};

class CLzpOracle
{
private:
 typedef void(*callbackfunc)(CString str,LPVOID lparam);  //定义回调函数类型
   
    LPVOID dlg;
 callbackfunc myFunc; //回调函数对象
public:
 CLzpOracle();
 ~CLzpOracle();
 void InitData(callbackfunc  pFunc,LPVOID lparam); //赋值回调函数
 
 void IndigenLink(char * szNmae_password,char* listName,char* listPath,char* userName);//本地连接
 void LongDistanceLink(char * szNmae_password,char* listName,char* listPath,char* userName);//远程连接
 void sql_error(char *msg) ; //数据库连接时的错误
};


#endif

2、设置oratools.pc编译方式

Pro*c/c++ 在VC6.0中的编译方法_第3张图片

3、oratools.cpp最上面添加函数定义

#include "stdafx.h"
#include "oratools.h"

#ifdef  __cplusplus
extern "C" {
#endif
 

 /* SQLLIB Prototypes */
 extern void sqlcxt (void **, unsigned int *,
  struct sqlexd *, const struct sqlcxp *);
 extern void sqlcx2t(void **, unsigned int *,
  struct sqlexd *, const struct sqlcxp *);
 extern void sqlbuft(void **, char *);
 extern void sqlgs2t(void **, char *);
extern void sqlorat(void **, unsigned int *, void *);

#ifdef  __cplusplus
}
 #endif

 

 

出自:http://blog.csdn.net/berniebd/article/details/1601686

我想很多人在VC下连接Oracle数据库时,一般使用ODBC或ADO控件,而使用Proc*C/C++应该会比较少。并且我在网上搜索了一下,关于这方面的介绍也不多。本人也是因工作需要而使用它,在对此一无所知的情况下,十分感谢“时代朝阳数据库技术中心”:
http://www.xiaotong-db.com.cn/kfgj/oracle/kfgj/O8I_proc_jc_vc.htm
给了我启发。现在把本人的经验,贴出来让大家分享(以下是围绕着产生cpp文件来说明的)。
1、设置目录:
打开“tools->;Options”,转到“Directories”页,在"Show Directories for"中
1)选“Executable Files”,在列表中加入proc.exe的目录(ORACLE_HOME/bin):
如:D:/oracle/ora81/bin
2)选“Include Files”,在列表中加入proc*c/c++包含头文件的目录(ORACLE_HOME/PRECOMP/PUBLIC):
如:D:/ORACLE/ORA81/PRECOMP/PUBLIC
3)选“Library Files”,在列表中加入proc*c/c++ Lib所在的目录(ORACLE_HOME/PRECOMP/LIB/MSVC):
如:D:/ORACLE/ORA81/PRECOMP/LIB/MSVC
*注:我的oracle客户端程序是安装在D:/oracle/ora81下;
2、建立一MFC工程(这步在此不作介绍);
3、往工程中加入,Proc*c/c++的源和头文件(这步在此也不作介绍),例加入oratools.pc、oratools.h;
oratools.h

CODE:
[Copy to clipboard]
#ifndef __LZP_ORACLE_TOOLS_HEAD__
#define __LZP_ORACLE_TOOLS_HEAD__

class CLzpOracle
{
public:
CLzpOracle();
~CLzpOracle();

int ConnectDatabase(char *strConn);
};


#endif

oratools.pc

CODE:
[Copy to clipboard]
#include "stdafx.h"
#include "oratools.h"


/*SQL通讯区说明*/
EXEC SQL INCLUDE SQLCA;
/*SQL错误处理说明语句*/
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL WHENEVER NOTFOUND CONTINUE;


CLzpOracle::CLzpOracle()
{
}

CLzpOracle::~CLzpOracle()
{
}

int CLzpOracle::ConnectDatabase(char *strConn)
{
EXEC SQL BEGIN DECLARE SECTION;
char usrpwd[60];
EXEC SQL END DECLARE SECTION;

strcpy(usrpwd,strConn);
EXEC SQL CONNECT :usrpwd;
if (sqlca.sqlcode < 0)
{
return -1;
}
return 0;
}

4、右击新加入的proc*c/c++文件(如oratools.pc),选择"settings..."到"project settings",然后Custom Build页:
在Commands下写入命令:proc 输入入文件名 oname=输出文件名(如:proc oratools.pc oname=oratools.cpp) 注如果要生成.cpp文件,oname=这项一定要填,不然它会自动生成.c文件
在Outputs下写入输出文件名(如oratools.cpp),这项我刚开始以为不写上面的oname=,会输出这里填写的文件名,但事实上并不是这样;
5、然后编译工程,它将会自动预编译产生c/c++文件(如oratols.cpp),然后把这个文件作如下修改:
1)把#include "stdafx.h"提到最前面;
2)把函数的定义用下面的括起
#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

CODE:
[Copy to clipboard]
#ifdef __cplusplus
extern "C" {
#endif


/* SQLLIB Prototypes */
extern void sqlcxt (void **, unsigned long *,
struct sqlexd *, const struct sqlcxp *);
extern void sqlcx2t(void **, unsigned long *,
struct sqlexd *, const struct sqlcxp *);
extern void sqlbuft(void **, char *);
extern void sqlgs2t(void **, char *);
extern void sqlorat(void **, unsigned long *, void *);

/* Forms Interface */
static const int IAPSUCC = 0;
static const int IAPFAIL = 1403;
static const int IAPFTL = 535;
extern void sqliem(char *, int *);

#ifdef __cplusplus
}
#endif

6、把lib文件加入工程中:
project->;settings->;link->;object/library modules中加入oraSQL8.lib.
7、最后编译链接产生可执行文件。注:如果重编译整个工程时,如果是产生.cpp文件一定别忘了修改预编译产生的文件。

 

posted @ 2011-07-19 11:36 DoubleSnake 阅读(130) 评论(0) 编辑

CFileDialog的用法

CFileDialog 在MSDN中的函数原形

CFileDialog::CFileDialog( 
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL, 
LPCTSTR lpszFileName = NULL, 
DWORD dwFlags = OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT, 
LPCTSTR lpszFilter = NULL, 
CWnd* pParentWnd = NULL 
); 

参数解释:

bOpenFileDialog:TRUE为打开文件对话框;FALSE为保存文件对话框

lpszDefExt:缺省的扩展名

lpszFileName:缺省显示在文件名组合框的编辑框的文件名,一般可选NULL

dwFlags:对话框风格,一般为OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 即隐藏只读选项和覆盖已有文件前提示。

类型:

OFN_HIDEREADONLY:隐藏只读选项

OFN_OVERWRITEPROMPT:覆盖已有文件前提

OFN_ALLOWMULTISELECT:允许选择多个文件

OFN_CREATEPROMPT:如果输入的文件名不存在,则对话框返回询问用户是否根据次文件名创建文件的消息框

OFN_FILEMUSTEXIST:只能输入已存在的文件名

OFN_FORCESHOWHIDDEN:可以显示隐藏的文件

OFN_NOREADONLYRETURN:不返回只读文件

OFN_OVERWRITEPROMPT:保存的文件已存在时,显示文件已存在的信息

lpszFilter:文件筛选类型,它指明可供选择的文件类型和相应的扩展名。参数格式如:
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明

pParentWnd:父窗口指针,一般可选NULL.

-------------------------------------------------------------------------------------------------------

实例:

CFileDialog dlg(TRUE,"avi",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.avi;*.mp4;*.wmv)|*.avi;*.mp4;*.wmv||");
 if(dlg.DoModal() == IDOK)
 {
  m_video= dlg.GetPathName();
 }
posted @ 2011-07-19 11:03 DoubleSnake 阅读(128) 评论(0) 编辑

VC++ 浏览目录

//浏览
 char buffer[256];
 BROWSEINFOA    bi;
 bi.hwndOwner = NULL;
 bi.pidlRoot  = NULL;
 bi.pszDisplayName  = buffer;
 bi.lpszTitle = "选择路径";
 bi.ulFlags   = BIF_RETURNFSANCESTORS ;
 bi.lpfn = NULL;
 bi.iImage = 0 ;
 LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);
 if (pIDList)
 {
  SHGetPathFromIDList(pIDList,buffer);
  //取得文件夹路径
  m_listPath = buffer ;

 }
 UpdateData(FALSE);

posted @ 2011-07-19 11:02 DoubleSnake 阅读(40) 评论(0) 编辑

VC++ ADO Oracle

【任务要求】

1、利用ADO本地/远程连接Oracle(Oracle10g)

2、创建表和表空间

3、为表创建用户并且分配权限

4、进行本地/远程导入(imp)操作(*.dmp)

【准备事项】

服务器电脑设置(远程导入的电脑)配置设置

1、查看服务器电脑IP和数据库端口

2、开启监控服务lsnrctl——start

3、修改连接模式为共享模式(关键,否则远程连接不上)

本地设置远程连接服务名:

a、添加点击服务命名

Pro*c/c++ 在VC6.0中的编译方法_第4张图片

b、设置网络服务名

Pro*c/c++ 在VC6.0中的编译方法_第5张图片

c、设置远程导入电脑IP地址和端口(查看ip地址:cmd / ipconfig )

Pro*c/c++ 在VC6.0中的编译方法_第6张图片

Pro*c/c++ 在VC6.0中的编译方法_第7张图片

Pro*c/c++ 在VC6.0中的编译方法_第8张图片

d、测试远程服务器是否畅通
进入到cmd后,执行命令:tnsping TEST_ORCL

代码实现:

 _ConnectionPtr    m_pConnection;  //连接对象
 _RecordsetPtr     m_pRecordset;   //记录集对象

//本地连接

::CoInitialize(NULL);//初始化com组件

m_pConnection.CreateInstance("ADODB.Connection");

m_pConnection->CursorLocation=adUseClient;

CString lpszConnect;

//远程连接字串设置

lpszConnect.Format("Provider=OraOLEDB.Oracle.1;Persist Security Info=True;\
         Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =\
         (PROTOCOL = TCP)(HOST =%s)\  
         (PORT = %s)))\                           
         (CONNECT_DATA =(SERVICE_NAME = %s)))",m_szIpAddress,m_szPort,m_source); //远程连接命令行:IP地址、端口号、数据库名

//本地连接字串设置

lpszConnect.Format("Provider=OraOLEDB.Oracle;User ID=%s;Password=%s;Data Source=%s",m_userName,m_password,m_source);//用户system 密码sys Data Source 全局数据名

try
  {
   myFunc("<提示:>正在打开数据库连接中...",dlg);
   m_pConnection->Open(_bstr_t(lpszConnect),_bstr_t(username),_bstr_t(password),adConnectUnspecified);
  
  }
  catch(_com_error e)
  {

   CString err;
   err.Format("<提示:>连接错误!\r\n错误信息:%s:",e.ErrorMessage());
   myFunc(err,dlg);
   //AfxMessageBox(err);
   return false;
  }

//创建表和表空间

CString str;

 str.Format("create tablespace %s logging datafile '%s'size 32m autoextend on next 32m maxsize 2048m extent management local",m_strTableName,m_strtableKJ);//表空间名和表空间的物理文件
 if (m_adolinkoracle.OpenRecordset(str))
  m_nSel = m_list.AddString("创建成功!");
 else
  m_nSel = m_list.AddString("创建失败!");

//为表创建用户

CString str;
 //创建临时表空间
 str.Format("create user %s identified by %s default tablespace %s temporary tablespace TEMP",m_info_name,m_info_password,m_strTableName);//用户名 密码 表空间名
 if (m_adolinkoracle.OpenRecordset(str))
  m_list.AddString("创建用户成功!");
 else
 {
  m_nSel = m_list.AddString("创建用户失败!");
  m_list.SetCurSel(m_nSel);
  return ;
 }

//为用户分配权限

m_list.AddString("为用户分配权限!");

 str.Format("grant connect to %s",m_info_name);
 m_adolinkoracle.OpenRecordset(str);


 str.Format("grant dba to %s",m_info_name);
 m_adolinkoracle.OpenRecordset(str);

 str.Format("grant alter any table to %s",m_info_name);
 m_adolinkoracle.OpenRecordset(str);
 
 str.Format("grant select any table to %s",m_info_name);
 m_adolinkoracle.OpenRecordset(str);

 str.Format("grant unlimited tablespace to %s",m_info_name);
 m_adolinkoracle.OpenRecordset(str);

 m_nSel = m_list.AddString("分配完毕!");
 m_list.SetCurSel(m_nSel);

//导入

//本地导入

CString str;

str.Format("imp userid= %s/%s full=y file=%s ignore=y",m_info_name,m_info_password,m_info_table);//用户 密码 *.dmp

str.Format("imp userid= %s/%s@%s full=y file=%s ignore=y",m_info_name,m_info_password,m_fuwuming,m_info_table);//用户 密码 服务名 *.dmp

stsytem(str);//执行导入


 

m_adolinkoracle  为 CUserAdoLinkOracle类的一个对象

CUserAdoLinkOracle类的设计:

#ifndef ADO_LINK_ORACLE_H
#define ADO_LINK_ORACLE_H

#endif

class CUserAdoLinkOracle
{
 typedef void(*callbackfunc)(CString str,LPVOID lparam);  //定义回调函数类型
 LPVOID dlg;
 callbackfunc myFunc; //回调函数对象
public:
 _ConnectionPtr    m_pConnection;  //连接对象
 _RecordsetPtr     m_pRecordset;   //记录集对象
 
 
 bool              m_IsConnectSuccess;//连接是否成功
 bool              m_IsOpenRecordset; //是否打开记录集
 CString           m_strConnString;   //数据库连接字符串
 CString           m_strErrMsg;       //保存错误信息

//////////////////////////////////////////////////////////////////////////
//类的实现
//
 CUserAdoLinkOracle()
 {//构造函数
  m_IsConnectSuccess= false;
  m_IsOpenRecordset=false;
 }
 void InitData(callbackfunc  pFunc,LPVOID lparam) //赋值回调函数
 {
  
  myFunc = pFunc;
  dlg = lparam;
  myFunc("<提示:>初始化完毕!",dlg);
 }

 bool OpneConnect(CString lpszConnect,CString username,CString password)//连接数据库
 {
  ::CoInitialize(NULL);//初始化com组件
  //AfxOleInit();

  //CString lpszConnect;

  //

  //lpszConnect.Format("Provider=OraOLEDB.Oracle;User ID=%s;Password=%s;Data Source=%s",username,password,source);
  
  //lpszConnect="Provider=OraOLEDB.Oracle;User ID=system;Password=sys;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1,122)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))";
  //char * lpszConnect="Provider=OraOLEDB.Oracle;User ID=system;Password=sys;Data Source=orcl"; //标准安全级别 
  //char * lpszConnect="Provider=MSDAORA.1;User ID=system;Password=hope;Data Source=192.168.0.223;Persist Security Info=false";//  微软格式


  //lpszConnect="Provider=OraOLEDB.Oracle;Persist Security Info=false;Data Source=192.168.1,102";//  微软格式参数


  //lpszConnect="Provider=MSDAORA.1;User ID=system;Password=sys;Data Source=192.168.1,102;Persist Security Info=false";//  信任链接


  //lpszConnect="Provider=MSDAORA.1;OSAuthent=1;Data Source=192.168.0.122;Persist Security Info=false";//  信任链接 2

  // char * lpszConnect="DSN=KUANMEITEMP";

  
  //char  * lpszConnect="driver={SQL Server};Server=222.195.150.228;DATABASE=Testonimsitoph;Uid=cw;Pwd=1234";

  //char * username="system";
  //char * password="sys";
  long loptions=adConnectUnspecified;
  CoInitialize(NULL);
  //hr = m_pConnection.CreateInstance("ADODB.Connection")


  m_pConnection.CreateInstance("ADODB.Connection");

  m_pConnection->CursorLocation=adUseClient;


  try
  {
   myFunc("<提示:>正在打开数据库连接中...",dlg);
   m_pConnection->Open(_bstr_t(lpszConnect),_bstr_t(username),_bstr_t(password),adConnectUnspecified);
  
  }
  catch(_com_error e)
  {

   CString err;
   err.Format("<提示:>连接错误!\r\n错误信息:%s:",e.ErrorMessage());
   myFunc(err,dlg);
   //AfxMessageBox(err);
   return false;
  }
  m_IsConnectSuccess= true; //数据库连接成功
  myFunc("<提示:>数据库连接成功",dlg);
  //AfxMessageBox("连接成功!");
  return true;
 }
 //SQL语句执行函数
 bool OpenRecordset(CString sql)
 {
  myFunc("<提示:>执行Oracle命令中...",dlg);
  ASSERT(!sql.IsEmpty());          //SQL语句不能为空
  try
  {
   m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例
   m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),
    adOpenDynamic, adLockOptimistic, adCmdText);  //执行SQL得到记录集
  }
  catch(_com_error e)           //捕获可能的异常
  {
   CString str;
   str.Format("<提示:>执行Oracle命令时出现错误,错误原因:%s",e.ErrorMessage());
   myFunc(str,dlg);
   return false;
  }
  myFunc("<提示:>执行Oracle命令成功",dlg);
  m_IsOpenRecordset = true;
  return true;
 }


 void CloseRecordset()
 {
  myFunc("<提示:>记录集关闭",dlg);
  if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态
   m_pRecordset->Close();     //关闭记录集
  m_IsOpenRecordset = false;
 }

 void CloseConn()
 {
  myFunc("<提示:>数据库关闭",dlg);
  m_pConnection->Close();         //关闭数据库连接
  ::CoUninitialize();  //释放COM环境
    
  m_IsConnectSuccess = false; //数据库关闭
 }

};


你可能感兴趣的:(pro*c,远程连接,oracle,数据库,struct,security,sql)