0

我在我的项目中使用 OTL。以下代码按预期工作:

#include <iostream>
using namespace std;
#include <stdio.h>
#define OTL_ODBC // CompileOTL 4.0/ODBC
// Thefollowing #define is required with MyODBC 5.1 and higher
#define OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE
#define OTL_UNICODE // CompileOTL with Unicode
#include "../OTLtest/otlv4.h"// include the OTL 4.0 header file
otl_connect db; // connect object
void insert()
// insert rowsinto table
{
    otl_stream o(1, //buffer size should be == 1 always on INSERT.
        "insert into test_tab values(:f1<int>,:f2<char[5]>)",
        // SQLstatement, char[5] means 5 2-byte
        // Unicodecharatcters including a null
        // terminator
        db // connectobject
    );
    unsigned short tmp[32]; // Nullterminated Unicode character array.
    for(int i = 1; i <= 100; ++i)
    {
        o << i;
        tmp[0] = 1111; //Unicode character (decimal code of 1111)
        tmp[1] = 2222; //Unicode character (decimal code of 2222)
        tmp[2] = 3333; //Unicode chracater (decimal code of 3333)
        tmp[3] = 4444; //Unicode chracater (decimal code of 4444)
        tmp[4] = 0; //Unicode null terminator
        o << (unsigned char*)tmp;
        // overloadedoperator<<(const unsigned char*) in the case of Unicode
        // OTL acceptsa pointer to a Unicode character array.
        //operator<<(const unsigned short*) wasn't overloaded
        // in order toavoid ambiguity in C++ type casting.
    }
}

void select()
{
    otl_stream i(50, //buffer size
        " select* from test_tab "
        "where f1>= :f11<int> "
        "  and f1 <= :f12<int>*2 ",
        // SELECTstatement
        db // connectobject
        );
    // create selectstream
    int f1;
    unsigned short f2[32];
    i << 8 << 8; // assigning :f11 = 8, f12 = 8
                 // SELECTautomatically executes when all input variables are
                 // assigned. Firstportion of output rows is fetched to the buffer
    while(!i.eof())
    {// while not end-of-data
        i >> f1;
        i >> (unsigned char*)f2;
        // overloaded operator>>(unsignedchar*) in the case of Unicode
        // OTL acceptsa pointer to a Unicode chracter array.
        //operator>>(unsigned short*) wasn't overloaded
        // in order toavoid ambiguity in C++ type casting.
        cout << "f1=" << f1 << ", f2=";
        for(int j = 0; f2[j] != 0; ++j)
            cout << "" << f2[j];
        cout << endl;
    }
    i << 4 << 4; // assigning :f11 = 4, :f12 = 4
                 // SELECTautomatically executes when all input variables are
                 // assigned. Firstportion of output rows is fetched to the buffer
    while(!i.eof())
    {// while not end-of-data
        i >> f1 >> (unsigned char*)f2;
        cout << "f1=" << f1 << ", f2=";
        for(int j = 0; f2[j] != 0; ++j)
            cout << "" << f2[j];
        cout << endl;
    }
}

int main()
{
    otl_connect::otl_initialize(); // initialize the database API environment
    try
    {
        db.rlogon("root/123456@rhctp");
        otl_cursor::direct_exec(
            db,
            "drop table test_tab",
            otl_exception::disabled // disable OTL exceptions
        ); // droptable
        otl_cursor::direct_exec(
            db,
            "create table test_tab(f1 int, f2 varchar(11))"
        ); // create table
        insert(); //insert records into table
        select(); //select records from table
    }
    catch(otl_exception&p)
    { // intercept OTL exceptions
        cerr << p.msg << endl; // print out error message
        cerr << p.stm_text << endl; // print out SQL that caused the error
        cerr << p.var_info << endl; // print out the variable that caused the error
    }
    db.logoff(); //disconnect from the database
    getchar();
    return 0;
}

但是当我在我的项目中添加另一个类时,比如说测试类,它已经#include "../OTLtest/otlv4.h" 包含在内。Visual Studio 2015 不会生成该项目。

//TestOTL.h
#pragma once
class TestOTL
{
public:
    TestOTL();
    ~TestOTL();
};

//TestOTL.cpp
#include "TestOTL.h"
#include "../OTLtest/otlv4.h"// include the OTL 4.0 header file

TestOTL::TestOTL()
{}

TestOTL::~TestOTL()
{}

如果我#include "../OTLtest/otlv4.h"TestOTL.cpp文件中删除该项目运行良好。

问题

我应该在 main.cpp 之外的文件中包含 OTL 标头吗?
如果我应该,那我该怎么做?

4

1 回答 1

1

似乎以下代码有效

#include "TestOTL.h"

#define OTL_ANSI_CPP_11_NULLPTR_SUPPORT
#define OTL_ODBC // CompileOTL 4.0/ODBC
#include "../OTLtest/otlv4.h"// include the OTL 4.0 header file


extern otl_connect db;

TestOTL::TestOTL()
{
    otl_stream o(1, //buffer size should be == 1 always on INSERT.
        "insert into test_tab values(:f1<int>,:f2<char[5]>)",
        // SQLstatement, char[5] means 5 2-byte
        // Unicodecharatcters including a null
        // terminator
        db // connectobject
        );
}

TestOTL::~TestOTL()
{}
于 2016-09-03T05:52:59.467 回答