I am trying to use OTL to avoid the GPL on MyODBC (and because it is very nice). It compiles fine but I get a
"[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified"
error on the console. This code isn't mine and you can get it in several places online. Can someone help?
Fixed: I had to specify a DSN driver name and I thought it was asking me for the TCP info. Sorry guys...
#include <iostream>
using namespace std;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define OTL_ODBC // Compile OTL 4.0/ODBC
// The following #define is required with MyODBC 3.51.11 and higher
#define OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE
// #define OTL_ODBC_UNIX // uncomment this line if UnixODBC is used
#include "otlv4.h" // include the OTL 4.0 header file
otl_connect db; // connect object
void insert()
// insert rows into table
{
otl_stream o(1, // buffer size should be == 1 always on INSERT
"insert into test_tab values "
" (:f1<int>,:f2<char[31]>), "
" (:f12<int>,:f22<char[31]>), "
" (:f13<int>,:f23<char[31]>), "
" (:f14<int>,:f24<char[31]>), "
" (:f15<int>,:f25<char[31]>) ",
// INSERT statement. Multiple sets of values can be used
// to work around the lack of the bulk interface
db // connect object
);
// If the number of rows to be inserted is not known in advance,
// another stream with the same INSERT can be opened
otl_stream o2(1, // buffer size should be == 1 always on INSERT
"insert into test_tab values "
" (:f1<int>,:f2<char[31]>)",
db // connect object
);
char tmp[32];
int i;
for(i=1;i<=100;++i){
sprintf(tmp,"Name%d",i);
o<<i<<tmp;
}
for(i=101;i<=103;++i){
sprintf(tmp,"Name%d",i);
o2<<i<<tmp;
}
}
void update(const int af1)
// insert rows into table
{
otl_stream o(1, // buffer size should be == 1 always on UPDATE
"UPDATE test_tab "
" SET f2=:f2<char[31]> "
" WHERE f1=:f1<int>",
// UPDATE statement
db // connect object
);
o<<"Name changed"<<af1;
o<<otl_null()<<af1+1; // set f2 to NULL
}
void select(const int af1)
{
otl_stream i(50, // buffer size may be > 1
"select * from test_tab "
"where f1>=:f11<int> "
" and f1<=:f12<int>*2",
// SELECT statement
db // connect object
);
// create select stream
int f1;
char f2[31];
i<<af1<<af1; // :f11 = af1, :f12 = af1
while(!i.eof()){ // while not end-of-data
i>>f1;
cout<<"f1="<<f1<<", f2=";
i>>f2;
if(i.is_null())
cout<<"NULL";
else
cout<<f2;
cout<<endl;
}
}
int main()
{
otl_connect::otl_initialize(); // initialize ODBC environment
try{
db.rlogon("root/orbit12@mysql3306");
//db.rlogon("UID=scott;PWD=tiger;DSN=mysql35"); // connect to ODBC
// db.rlogon("scott/tiger@mysql35"); // connect to ODBC, alternative format
// of connect string
otl_cursor::direct_exec
(
db,
"drop table test_tab",
otl_exception::disabled // disable OTL exceptions
); // drop table
otl_cursor::direct_exec
(
db,
"create table test_tab(f1 int, f2 varchar(30))"
//"create table test_tab(f1 int, f2 varchar(30)) type=innoDB" (causes MYSQL error)
); // create table
insert(); // insert records into the table
update(10); // update records in the table
select(8); // select records from the 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.sqlstate<<endl; // print out SQLSTATE message
cerr<<p.var_info<<endl; // print out the variable that caused the error
}
db.logoff(); // disconnect from ODBC
return 0;
}