说实话,有时候学习一样新东西的时候,最难的就是开始环境,连接,很多小问题,
对于一个有经验的人来说是简单的,但是对于一个新手,很可能就卡住了。我就在这个远程连接上卡住了。
我参考了一下这个:、
http://www.cnblogs.com/batman425/archive/2013/08/16/3261673.html
各种连不上,各种不知道应该用什么,现在还有些问题,不过已经可以连上了,我简单的介绍一下。
EXEC SQL CONNECT { :user IDENTIFIED BY :oldpswd | :usr_psw } [[ AT { dbname | :host_variable }] USING :connect_string ] [ {ALTER AUTHORIZATION :newpswd | IN { SYSDBA | SYSOPER } MODE} ] ;
在Pro C的手册里给的是这样的格式,但是我一直没有用AT连接上过,不知道问题出在哪。
首先来说我的是怎么连的
第一种,我是在虚拟机自己连自己的数据库,不过用的是IP,在Oracle下有这么一个配置文件
$ORACLE_HOME/network/admin/tnsname.ora
我里面的配置是这样的
ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )
ORCL1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.32.200)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )
其中ORCL1这一个是我自己配置上去了,为了测试一下,而上面那个是安装Oracle后就有的。
其中在连接格式中那个USING后面要的字符串:connect_string,就是ORCL=后面的那一长串,并且那个括号是不能删掉的,一定要在括号中括住这一串才行,我开始的时候就是在删除那个ORCL = 的时候,把括号也弄没了,就一直连不上。
然后就是AT那个后面是db_name,我这里db_name就是ORCL,但是就是不行,所以,我后来参考了上面那个文章,没有
用这个AT,直接用了USING来连接的。下面就是我的测试程序。
1. 使用USING :db_name或者使用USING :db_name1,这样都是可以连接上的,虽然这两个字符串只是ORCL或者ORCL1
这样的字符串,但是这里应该是自动到那个tnsname.ora文件中读取了那个字符串了,所以这种就应该是依赖了安装的
客户端了
2. 使用USING :db_string 这个来连接也是可以连接上的,如果在程序中,这个字符串其实可以写到个文件中
然后从文件中读取出来。
3. 我用AT这个始终不行,希望会的人告诉我一下,万分感谢,如果以后解决了,我会回来补充上。
#include <stdio.h> #include <string.h>
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL INCLUDE sqlca; EXEC SQL INCLUDE oraca; EXEC ORACLE OPTION(ORACA=YES);
#define USERNAME "scott" #define PASSWD "xx"
char *username = USERNAME; char *passwd = PASSWD; VARCHAR dynstmt[80]; VARCHAR ename[10]; char *db_name = "ORCL"; char *db_name1 = "ORCL1"; char *db_string = "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.32.200)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))";
EXEC SQL END DECLARE SECTION;
int main(int argc, char *argv[]) { EXEC SQL BEGIN DECLARE SECTION; int deptno = 10; EXEC SQL END DECLARE SECTION;
oraca.orastxtf = ORASTFERR;
EXEC SQL CONNECT :username IDENTIFIED BY :passwd //AT :db_name1 USING :db_string; //USING :db_name1; USING :db_string; //USING :db_name;
strcpy(dynstmt.arr, "SELECT ename FROM EMP WHERE deptno = :v1"); dynstmt.len = strlen(dynstmt.arr);
EXEC SQL PREPARE select_sql FROM :dynstmt; EXEC SQL DECLARE select_cur CURSOR FOR select_sql; char temp[10]; gets(temp); deptno = atoi(temp); EXEC SQL OPEN select_cur USING :deptno;
EXEC SQL WHENEVER NOT FOUND DO break;
while (1) { EXEC SQL FETCH select_cur INTO :ename; ename.arr[ename.len] = '\0'; puts((char *)ename.arr); } printf("\nQuery returned %d row %s.\n\n", sqlca.sqlerrd[2], (sqlca.sqlerrd[2] == 1)?"":"s");
EXEC SQL CLOSE select_cur; EXEC SQL COMMIT WORK RELEASE;
return 0; }