Я использую 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;
}
Но когда я добавляю другой класс в свой проект, скажем, класс Test, это #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
Файл проект работает хорошо.
Вопросы
Должен ли я включить заголовок OTL в файлы, кроме main.cpp?
Если я должен, то как мне это сделать?
Кажется, что следующий код работает
#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 fileextern 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()
{}
Других решений пока нет …