/* 建立厂商表已经用SQL*PLUS创建*/ 
create table hr.supplier
(
suppliernr varchar(,
suppliername varchar(15),
suppliertel number(11),
supplieradress varchar(30));/*proc向表插入记录*/#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sqlca.h>
void sql_error();
void connect();
void createitem();
void main()
{
exec sql whenever sqlerror do sql_error();
connect();
createitem();
exec sql commit release;
exit(1);
}
/*连接数据库*/void conect()
{
EXEC SQL BEGIN DECLARE SECTION;
char username[10],password[10],server[10];
EXEC SQL END DECLARE SECTION;
printf("输入用户名:";
gets(username);
printf("输入密码:";
gets(password);
printf("输入服务名:";
gets(server);
EXEC SQL CONNECT :username IDENTIFIED BY assword
USING :server;}
/*处理错误*/
void sql_error()
{
printf("%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
}
/*插入记录涵数*/
void createitem()
{
exec sql begin declare section;
/*本来这是用结构数组后该了一下*/
int cre_itemnr;
char cre_name[30];
float cre_price;
float cre_saleprice;
int cre_qty;
float cre_tax;
float cre_dms;
char cre_supplier[8];int i;
char cont;
exec sql end declare section;
/*循环赋值*/
for(i=0;i<10;i++)
{
printf("输入货号:";
scanf("%d",&cre_itemnr);
printf("输入品名:";
gets(cre_name);
printf("输入进价:";
scanf("%6.2f",&cre_price);
printf("输入售价:";
scanf("%6.2f",&cre_saleprice);
printf("输入库存:";
scanf("%d",&cre_qty);
printf("输入税率:";
scanf("%1.2f",&cre_tax);
printf("输入日均销量:";
scanf("%1.4f",&cre_dms);
printf("输入厂编:");
gets(cre_supplier); /*插入记录*/ 
exec sql insert into hr.item(itemnr,name,price,saleprice,qty,tax,dms,suppliernr)
values(:cre_itemnr,:cre_name,:cre_price,:cre_saleprice,:cre_qty,:cre_tax,:cre_dms,:cre_supplier);
printf("继续吗?(Y/N):");
scanf("%c",&cont);
fflush(stdin);
if(cont=='n'||cont=='N')
{ break;
exec sql commit;};
};
}.................................................................................................
vc错误:
--------------------Configuration: 00 - Win32 Debug--------------------
Linking...
000.obj : error LNK2001: unresolved external symbol _connect
Debug/00.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.00.exe - 2 error(s), 0 warning(s)
.................................................................................................
proc编译通过,用VC编译源文件生成.obj出错。
这个VC错误怎么改

解决方案 »

  1.   

    似乎是没有加入oracle库的问题,试试看下面的菜单Project / Add To Project 项 / Files 项;
    将文件对话框的文件类型改为“所有文件”;
    路径选为ORACLE_HOME \ Ora81 \ PRECOMP \ LIB \ MSVC;
    选择OraSQL8.LIB文件,单击“打开”钮,完成将运行库文件加入工程。
      

  2.   

    谢谢你。这么久才回:
       我用的是ORACLE9I 我在VC 里加的是ORACLE_HOME \  PRECOMP \ LIB \ SQL..,不好意思。我忘了那名称。是在的这个目录下。我回去用一下MSVC 。
          我一直有个问题是不是ORACLE 也要设置一些参数和路径。以便VC 调用。事先我只设置了PRO*C 没设置ORACLE
      

  3.   


    应该在VC的开发环境中,配置一些相应的设置。
    具体的是,
    1,指定执行文件路径,要加入%oracle_home%\bin(%oracle_home%指的是Oracle的安装目录),例如D;\Oracle\ora92\bin.
    2,指定头文件的路径,要Include两个头文件的路径,例如,(1.)D;\Oracle\ora92\precomp\public.(2.)D;\Oracle\ora92\oci\include1,2都是在VC中的工具->选择->目录标签中的s显示的目录为设置.
    3,生成应用程序,创建工程->选择WIN32 console application,生成一个空的PROJECT4,在SOURCE FILE中添加.PC文件,和同名的.c文件.
    5,添加SQLLIB库,该文件位于D;\Oracle\ora92\precomp\lib中,就是加入orasql9.lib
    6,指定定制建立选项proc $(InputDir)\$(InputName)  $(InputDir)\$(InputName).c
    就是在.PC文件中鼠标右键,在SETTING菜单项中的C 命令键入(proc $(InputDir)\$(InputName)) O 输出键入($(InputDir)\$(InputName).c)可以进行调试了基本的操作就这些,很久没有做proc了,我觉得是你的D;\Oracle\ora92\oci\include,OCI没有
    include.就看哥们你的悟性了.
      

  4.   

    #include <STDIO.H>
    #include <string.h>
    #include <stdlib.h>#include <sqlca.h>
    void connect()
    {
    EXEC SQL BEGIN DECLARE SECTION;
        varchar user_name[10];
            varchar password[10];
    varchar server[10];
    EXEC SQL END DECLARE SECTION; strcpy( user_name.arr, "system" );
    user_name.len = strlen( user_name.arr );
    strcpy( password.arr, "system" );
    password.len = strlen( password.arr );
    strcpy( server.arr, "KDDI" );
    server.len = strlen( server.arr );    EXEC SQL CONNECT :user_name IDENTIFIED BY :password USING :server; if( sqlca.sqlcode == 0 )
    printf( "connect successed\n");
    else
    printf( "%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc );
    }#include <stdio.h>
    #include <string.h>
    #include <stdlib.h>#include <sqlca.h>void transaction()
    {

    /*EXEC SQL DROP TABLE trans;
    EXEC SQL CREATE TABLE trans( cola int );
    EXEC SQL INSERT INTO trans values(1);*/
    EXEC SQL COMMIT RELEASE;
    }程序中的各个功能函数分开写比较好!
      

  5.   

    谢谢你 echoxue(咱当过兵的人) :
        我在VC里加了所有的路径,我还真的怀疑自己太苯了.还是上面的错误.一点都没变.
      VC->工具--->选择-->目录-->S显示目录下:
           EXECUTABLE FILE目录下加入路径:
             c:\oracle\ora90\bin;
           INCLUDE FILES 目录下加入:
             c:\oracle\ora90\precomp\public;
             c:\oracle\ora90\oci\include;
      当VC里还是那两个错误时,我把S显示目录下的所有目录都加入了下面的东西还是不行
            c:\oracle\ora90\bin;
            c:\oracle\ora90\precomp\public;
             c:\oracle\ora90\oci\include;
    VC工程是和你上面做法一样.
          我现在被这鬼东西搞不懂.到地错在那拉? PRO*C 问题,可他通过编译.?还是软件问题?搞不懂啊.........
          谁帮我解决他.我请他撮一顿...........
      

  6.   

    在看一看我的PRO* C 中的GUI设置有没有错。        PRO*C 的GUI设置如下:
     sqlcheck=full; parse=full 
    include=c:\oracle\ora90\precomp\public; 
    include=c:\oracle\ora90\oci\include; 
    include=c:\oracle\ora90\bin; 
    include=c:\oracle\vc98\include;
    要是PRO*C设置没问题。VC又没问题。还是不能通过编译,那就奇怪了。??????................................................................
         其中设置sqlcheck=full;出现下列错误:
    ++: Release 9.0.1.1.1 - Production on 星期二 1月 31 12:26:19 2006(c) Copyright 2001 Oracle Corporation.  All rights reserved.系统默认选项值取自于: c:\oracle\ora90\precomp\admin\pcscfg.cfg错误发生在行76,列1,文件E:\item.pc
    EXEC SQL CALL hr.pre_item
    1
    PLS-S-00201, 必须说明标识符 'HR.PRE_ITEM'
    错误发生在行76,列1,文件E:\item.pc
    EXEC SQL CALL hr.pre_item
    1
    PLS-S-00000, Statement ignored
    在第 76 行,第 1 列,文件 E:\item.pc 有语义错误:
    EXEC SQL CALL hr.pre_item
    1
    PCC-S-02346, PL/SQL 发现语义错误
    .......................................................................
     之前的都没设置 sqlcheck=full;成功编译。然后在VC下调试。
    不是说 sqlcheck=full;后他会读数据字典吗?我昨天把ORACLE ,VC又全装了一次。根本就
     没建立hr.pre_item过程。他怎么不报hr.pre_item过程不存在,还是和hr.pre_item过程存在
    一样的错误。
      是不是我要重新调试,来覆盖以前的日志文件。我以前拭过,还是一样啊!。
      

  7.   

    EXEC SQL CALL hr.pre_item分号加了吗?你要采取部分编译,先把能编过的代码编过去,感觉是语法的错误,不是配置问题,你都能编译到76行了,用内嵌的PL/SQL块中调用,调用包中的过程,一定要加包名作为前缀。
      

  8.   

    谢谢你echoxue(咱当过兵的人):
      所有问题几天前已经解决,出去了。没有回。请谅解。
          要是你在成都就好了。真想和你门这些在技术里泡了多年的人了了。