在程序中 adefview.cpp 加入一 OLEDB 數據庫操作類頭文件 #include "DOperateA.h" 編譯出錯:ADEFVIEW.obj : error LNK2005: "struct tagDBID const  DBCOLUMN_SS_TDSCOLLATION" (?DBCOLUMN_SS_TDSCOLLATION@@3UtagDBID@@B) already defined in DOperateA.obj
ADEFVIEW.obj : error LNK2005: "struct tagDBID const  DBCOLUMN_BASETABLEINSTANCE" (?DBCOLUMN_BASETABLEINSTANCE@@3UtagDBID@@B) already defined in DOperateA.obj
DOperateA.obj : error LNK2005: "struct _GUID const  CLSID_SQLOLEDB" (?CLSID_SQLOLEDB@@3U_GUID@@B) already defined in ADEFVIEW.obj
Debug/PASE.exe : fatal error LNK1169: one or more multiply defined symbols found
不加之前程序不會出錯(現我只加個頭文件沒有做其它任何定義和操作)DOperateA.h 的內容如下:
#ifndef UNICODE
#define UNICODE
#endif#ifndef _UNICODE
#define _UNICODE
#endif#ifndef DBINITCONSTANTS
#define DBINITCONSTANTS
#endif#ifndef INITGUID
#define INITGUID
#endif#include <stdio.h>
#include <tchar.h>#include <stddef.h>
#include <windows.h>
#include <iostream.h>#include <oledb.h>
#include <SQLOLEDB.h>
#include <oledberr.h>
#include "variablestruct.h"class CDOperateA

public:
CDOperateA();
protected:
virtual  ~CDOperateA();
BOOL GetRowData(ClassSubInfo *pInfo,ClassOtherInfo *pOtherInfo,BYTE *pDataBuffer,int bHead);
BOOL SetRowData(ClassSubInfo *pInfo,ClassOtherInfo *pOtherInfo,BYTE *pDataBuffer);
BOOL GetRowClassId(BYTE *pDataBuffer,int *ClassId);
BOOL GetRowClassName(BYTE *pDataBuffer,CString *ClassName);
void WriteLog(int level,CString str);
private:IDBInitialize*       pIDBInitialize;
IDBCreateSession*    pIDBCreateSession;
IDBCreateCommand*    pIDBCreateCommand;
ICommandText*        pICommandText;
IRowset*             pIRowset;
IRowsetScroll*       pIRowsetScroll;
IRowsetUpdate*       pIRowsetUpdate;
IRowsetFind*         pIRowsetFind;
IAccessor*           pIAccessor;
HACCESSOR            hAccessor;
DBCOLUMNINFO*        pDBColumnInfo;
DBBINDING*           pBindings;
HROW                 hRows[1];
HROW*                pRows ;
ULONG                DataBufOffset;
ULONG                RecordCount;
ULONG                GetRows;
ULONG                Books;
int                  Cols;
int                  ClassId;
int                  iseof;
int                  isbof;public:
BOOL InitDataBase(LPCTSTR Sname,LPCTSTR DBname,LPCTSTR Uname,LPCTSTR Upwd);
BOOL InsertAclass(ClassSubInfo *pInfo,ClassOtherInfo *pOtherInfo);
BOOL LoadAclass();//(select * from where ) add this key and it's value
BOOL Findclass(LPCTSTR strKey,LPCTSTR strValue);
//need IID_IRowsetScroll
BOOL Getclass(ClassSubInfo *pInfo,ClassOtherInfo *pOtherInfo);//need IID_IRowsetScroll
BOOL MoveNext();//need IID_IRowsetScroll
BOOL MovePrev();//need IID_IRowsetScroll
BOOL DeleteAclass(LPCTSTR strKey,LPCTSTR strValue);//need IID_IRowsetUpdate 
BOOL UpdateAclass(ClassSubInfo *pInfo,ClassOtherInfo *pOtherInfo);//need IID_IRowsetUpdate
BOOL UnInitDataBase();
BOOL SaveClass(ULONG Rows, HROW *pHRow);//need IID_IRowsetUpdate
}
;

解决方案 »

  1.   

    如果在VC6中
    project->settings ->tab:link ->category:customize->钩选force file output
    试试
    VC7相应设置
    不知道行不行,没试过做数据库的
      

  2.   

    to  mscf(sophist) :那樣確實能編譯通過
    PASE.exe - 0 error(s), 71 warning(s)但這樣會不會不安全???
      

  3.   

    DOperateA.obj : error LNK2005: "struct tagDBID const  DBCOLUMN_SS_TDSCOLLATION" (?DBCOLUMN_SS_TDSCOLLATION@@3UtagDBID@@B) already defined in ADEFVIEW.obj
    為什麼會 已經定義過???
      

  4.   

    没#include这个文件之前,这个文件在其它地方被包含过没有(指其它头文件中)?
      

  5.   

    那就对啦。你先前编译正确,是因为这个文件根本没有被编译(因为头文件没有被包含的话,应该是不会被编译的)。你试试将这个头文件包含在其它地方(比如其它头文件中),看看是否也是报这个错误。如果是,那么应该是你的这个头文件中的各个#include有重复的地方。
      

  6.   

    我是這樣定義頭文件的#ifndef __DOPERATEA_H__
    #define __DOPERATEA_H__
    我去掉
    #include <stdio.h>
    #include <tchar.h>
    #include <stddef.h>
    #include <windows.h>
    #include <iostream.h>只有以下的頭文件
    #include <oledb.h>
    #include <SQLOLEDB.h>
    #include <oledberr.h>
    #include "variablestruct.h"
    別的頭文件沒有用
    #include <oledb.h>
    #include <SQLOLEDB.h>
    #include <oledberr.h>
    還是出錯!怎麼會出現 struct tagDBID const  DBCOLUMN_SS_TDSCOLLATION 重定義呢???DOperateA.obj : error LNK2005: "struct tagDBID const  DBCOLUMN_SS_TDSCOLLATION" (?DBCOLUMN_SS_TDSCOLLATION@@3UtagDBID@@B) already defined in ADEFVIEW.obj
      

  7.   

    在adefview.h包含的头文件或者adefview.h中重定义了DBCOLUMN_SS_TDSCOLLATION。你把鼠标放DBCOLUMN_SS_TDSCOLLATION 上面,按f12,找到他的定义在哪里,然后看头文件是什么,在那些地方重包含了。建议将包含的头文件放到stdafx.h中,这样只包含一次。位置要放对。
      

  8.   

    to enoloo(行者无疆) :
                 
                 位置要放对???             有沒有建議的順序?                 
                              謝謝 !!!
      

  9.   

    還剩下以下錯誤繼續 debug ......Linking...
    DOperateA.obj : error LNK2001: unresolved external symbol "struct _GUID const  CLSID_SQLOLEDB" (?CLSID_SQLOLEDB@@3U_GUID@@B)
    Debug/PASE.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
    Creating browse info file...PASE.exe - 2 error(s), 0 warning(s)
      

  10.   

    这要看具体情形亚。CLSID_SQLOLEDB在哪个文件中,doperateA中没有他的定义,你找找,包含它的头文件。