zoukankan      html  css  js  c++  java
  • C++ otlv4 连接 sql server 数据库小记

    otlv4介绍:

    http://otl.sourceforge.net/

    测试代码

    // testotlv4.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    
    #include <iostream>
    using namespace std;
    
    #include <stdio.h>
    #define OTL_ODBC_MSSQL_2008 // Compile OTL 4/ODBC, MS SQL 2008
    //#define OTL_ODBC // Compile OTL 4/ODBC. Uncomment this when used with MS SQL 7.0/ 2000
    #include "otlv4.h" // include the OTL 4.0 header file
    
    otl_connect db; // connect object
    
    void insert()
    // insert rows into table
    {
    	otl_stream o(10, // buffer size
    		"insert into test_tab values(:f1<int>,:f2<char[31]>)",
    		// SQL statement
    		db // connect object
    	);
    
    	o.set_commit(0); // set stream's auto-commit to OFF.
    
    	try {
    		o << 1 << "Line1"; // Enter one row into the stream
    		o.flush(); // flush the strem buffer, i.e. force
    				   // the stream to execute
    #if defined(OTL_ANSI_CPP_11_VARIADIC_TEMPLATES)
    		otl_write_row(o, 1, "Line1");
    #else
    				   // when variadic template functions are not supported by the C++
    				   // compiler, OTL provides nonvariadic versions of the same template
    				   // functions in the range of [1..15] parameters
    		otl_write_row(o, 1, "Line1");
    
    
    		// the old way (operators >>() / <<()) is available as always:
    		// o<<1<<"Line1"; // Enter the same data into the stream
    		// and cause a "duplicate key" error.
    #endif
    		o.flush();
    	}
    	catch (otl_exception& p) {
    		if (p.code == 2601) {
    			// ... duplicate key ...
    			cout << "STREAM ERROR STATE=" << o.get_error_state() << endl;
    			o.clean(1); // clean up the stream's buffer
    						// and clean up the stream's internal
    						// error flag as well. By doing this, 
    						// it's possible to recover from 
    						// a database error without closing
    						// the stream. Remember, the number of 
    						// situtation when it's possible is 
    						// limited and the recovery procedure should
    						// be carefully designed.
    		}
    		else
    			throw; // re-throw the exception to the outer catch block.
    	}
    
    
    	o << 2 << "Line2"; // Enter one more row of data after
    					   // recovering from the "duplicate key" 
    					   // error
    	o.flush();
    
    	db.commit(); // commit transaction
    
    }
    
    void select()
    {
    	otl_stream i(10, // buffer size
    		"select * from test_tab",
    		// SELECT statement
    		db // connect object
    	);
    	// create select stream
    
    	int f1;
    	char f2[31];
    
    #if (defined(_MSC_VER) && _MSC_VER>=1600) || defined(OTL_CPP_11_ON)
    	// C++11 (or higher) compiler
    	for (auto& it : i) {
    #if defined(OTL_ANSI_CPP_11_VARIADIC_TEMPLATES)
    		otl_read_row(it, f1, f2);
    #else
    		// when variadic template functions are not supported by the C++
    		// compiler, OTL provides nonvariadic versions of the same template
    		// functions in the range of [1..15] parameters
    		otl_read_row(it, f1, f2);
    
    		// the old way (operators >>() / <<()) is available as always:
    		// it>>f1>>f2;
    #endif
    		cout << "f1=" << f1 << ", f2=" << f2 << endl;
    	}
    #else
    	// C++98/03 compiler
    	while (!i.eof()) { // while not end-of-data
    		i >> f1 >> f2;
    		cout << "f1=" << f1 << ", f2=" << f2 << endl;
    	}
    #endif
    
    }
    
    int main()
    {
    	otl_connect::otl_initialize(); // initialize ODBC environment
    	try {
    
    		//	CString strCon;
    		//strCon.Format("driver=sql server;server=%s;UID=%s;PWD=%s;database=%s",
    		//	strServerIP.c_str(), strServerUID.c_str(), strServerPWD.c_str(), strServerDatabase.c_str());
    		string strCon1 = "DSN=testsqlserver;UID=sa;PWD=12345678;database=aa_note";
    		//strCon1 = "driver=sql server;server=127.0.0.1;UID=sa;PWD=12345678;database=aa";
    		db.rlogon(strCon1.c_str()); // connect to the database
    
    		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
    
    		otl_cursor::direct_exec
    		(
    			db,
    			"create unique index ind001 on test_tab(f1)"
    		);  // create unique index 
    
    		insert(); // insert records into table
    		select(); // select records from table
    
    	}
    
    	catch (otl_exception& p) { // intercept OTL exceptions
    		cout << p.code << endl; // print out error code
    		cout << p.sqlstate << endl; // print out error SQLSTATE
    		cout << p.msg << endl; // print out error message
    		cout << p.stm_text << endl; // print out SQL that caused the error
    		cout << p.var_info << endl; // print out the variable that caused the error
    	}
    
    	db.logoff(); // disconnect from the database
    
    	return 0;
    
    }
    

      

    string strCon1 = "DSN=testsqlserver;UID=sa;PWD=12345678;database=aa_note";
    //strCon1 = "driver=sql server;server=127.0.0.1;UID=sa;PWD=12345678;database=aa";
    db.rlogon(strCon1.c_str()); // connect to the database

    有3种连接方式 ,

    1,数据源odbc连接 

     

    这儿不选择,后面通过 程序来选择.

    2,代码直接 连接 "driver=sql server;server=127.0.0.1;UID=用户名;PWD=密码;database=数据库";


    3,USER/PASSWORD@TNS_ALIAS 这种方式  要注意 数据库密码有@时会报错

  • 相关阅读:
    定时任务的分布式调度
    springmvc 静态资源 配置
    activemq 持久化
    函数式编程与面向对象编程的比较
    LeetCode 108——将有序数组转化为二叉搜索树
    LeetCode 104——二叉树中的最大深度
    LeetCode 700——二叉搜索树中的搜索
    线性代数之——四个基本子空间
    线性代数之——线性相关性、基和维数
    线性代数之——秩和解的结构
  • 原文地址:https://www.cnblogs.com/bleachli/p/10069754.html
Copyright © 2011-2022 走看看