#include <iostream>
#include <string>
#include <ibase.h>

using namespace std;

int main(int argc, char* argv[])
{
	isc_db_handle    hDb = NULL;
	isc_tr_handle    hTrn = NULL;
	isc_stmt_handle  hStmt = NULL;
	ISC_STATUS_ARRAY status;

	char* dpb = NULL;
	short dpbLen = 0;
	
	isc_expand_dpb(&dpb, &dpbLen, isc_dpb_user_name, "SYSDBA",
	               isc_dpb_password, "masterkey", NULL);
	if (isc_attach_database(status, 0, "E:\\db\\test.fdb", &hDb, dpbLen, dpb)) {
		cerr << "Failed to attach dadabase. status=" 
		     << isc_sqlcode(status) << endl;
		return 1;
	}
	if (isc_start_transaction(status, &hTrn, 1, &hDb, 0, NULL)) {
		cerr << "Failed to start transaction. status=" 
		     << isc_sqlcode(status) << endl;
		return 1;
	}
	
	char* sql = "SELECT * FROM sample1 WHERE ITEM1 = ?";
	
	XSQLDA* inDa = (XSQLDA*)new char[XSQLDA_LENGTH(1)];
	inDa->version = SQLDA_VERSION1;
	inDa->sqln = 1;
	
	XSQLDA paraDa;
	paraDa.version = SQLDA_VERSION1;
	paraDa.sqln = 1;
	
	if (isc_dsql_allocate_statement(status, &hDb, &hStmt)) {
		cerr << "Failed to allocate statement. status=" 
		     << isc_sqlcode(status) << endl;
		return 1;
	}
	if (isc_dsql_prepare(status, &hTrn, &hStmt, 0, sql, 1, &paraDa)) {
		cerr << "Failed to prepare statement. status=" 
		     << isc_sqlcode(status) << endl;
		return 1;
	}
	if (isc_dsql_describe_bind(status, &hStmt, 1, inDa)) {
		cerr << "Failed to describe bind. status=" 
		     << isc_sqlcode(status) << endl;
		return 1;
	}
	if (inDa->sqld > inDa->sqln) {
		short sqld = inDa->sqld;
		delete [] inDa;
		inDa = (XSQLDA*)new char[XSQLDA_LENGTH(sqld)];
		inDa->sqln = sqld;
		inDa->version = SQLDA_VERSION1;
		if (isc_dsql_describe_bind(status, &hStmt, 1, inDa)) {
			cerr << "Failed to describe bind. status=" 
			     << isc_sqlcode(status) << endl;
			return 1;
		}
	}
	XSQLVAR *var;
	int i;
	for (i = 0, var = inDa->sqlvar; i < inDa->sqld; i++, var++) {
		switch (var->sqltype & ~1) {
		case SQL_VARYING:
			var->sqldata = (char *)new char[var->sqllen + 2];
			break;
		default:
			var->sqldata = (char *)new char[var->sqllen];
			break;
		}
		if (var->sqltype & 1) {
			var->sqlind = (short *)new short;
			*(var->sqlind) = 0;
		}
	}
	
	var = inDa->sqlvar;
	*(short*)(var->sqldata) = 2;

	XSQLDA* outDa = (XSQLDA*)new char[XSQLDA_LENGTH(paraDa.sqld)];
	outDa->version = SQLDA_VERSION1;
	outDa->sqln = paraDa.sqld;

	if (isc_dsql_describe(status, &hStmt, 1, outDa)) {
		cerr << "Failed to describe. status=" 
		     << isc_sqlcode(status) << endl;
		return 1;
	}

	for (i = 0, var = outDa->sqlvar; i < outDa->sqld; i++, var++) {
		switch (var->sqltype & ~1) {
		case SQL_VARYING:
			var->sqldata = (char *)new char[var->sqllen + 2];
			break;
		default:
			var->sqldata = (char *)new char[var->sqllen];
			break;
		}
		if (var->sqltype & 1) {
			var->sqlind = (short *)new short;
		}
	}
	if (isc_dsql_execute(status, &hTrn, &hStmt, 1, inDa)) {
		cerr << "Failed to execute statement. status=" 
		     << isc_sqlcode(status) << endl;
		return 1;
	}
	int w_len;
	string w_str;
	int w_row = 0;
	long fetch_stat;
	while ((fetch_stat = isc_dsql_fetch(status, &hStmt, 1, outDa)) == 0) {
		cout << "== Row Index: " << w_row++ << "============" << endl;
		for (i = 0, var = outDa->sqlvar; i < outDa->sqld; i++, var++) {
			cout << "   Column Index: " << i << endl;
			switch (var->sqltype & ~1) {
			case SQL_VARYING:
				cout << "     type: SQL_VARYING:" 
				     << var->sqltype << endl;
				if ((var->sqltype & 1) && (*(var->sqlind) == -1)) {
					cout << "   data: NULL" << endl;
				} else {
					w_len = *(short*)var->sqldata;
					w_str.assign(var->sqldata + 2, w_len);
					cout << "     data: " 
					     << w_str << endl;
				}
				break;
			case SQL_TEXT:
				cout << "     type: SQL_TEXT:" 
				     << var->sqltype << endl;
				if ((var->sqltype & 1) && (*(var->sqlind) == -1)) {
					cout << "     data: NULL" << endl;
				} else {
					w_len = var->sqllen;
					w_str.assign(var->sqldata, w_len);
					cout << "     data: " 
					     << w_str << endl;
				}
				break;
			case SQL_LONG:
				cout << "     type: SQL_LONG:" 
				     << var->sqltype << endl;
				if ((var->sqltype & 1) && (*(var->sqlind) == -1)) {
					cout << "     data: NULL" << endl;
				} else {
					cout << "     data: " 
					     << *(long*)var->sqldata << endl;
				}
				break;
			case SQL_SHORT:
				cout << "     type: SQL_SHORT:" 
				     << var->sqltype << endl;
				if ((var->sqltype & 1) && (*(var->sqlind) == -1)) {
					cout << "     data: NULL" << endl;
				} else {
					cout << "     data: " 
					     << *(short*)var->sqldata << endl;
				}
				break;
			default:
				cout << "     type: " 
				     << var->sqltype << endl;
				cout << "     data: Not implement." << endl;
				break;
			}
		}
	}
	if (fetch_stat != 100L) {
		cerr << "Failed to fetch. status="
		     << isc_sqlcode(status) << endl;
		return 1;
	}
	if (isc_commit_transaction(status, &hTrn)) {
		cerr << "Failed to commit transaction. status=" 
		     << isc_sqlcode(status) << endl;
		return 1;
	}
	isc_dsql_free_statement(status, &hStmt, DSQL_close);
	if (isc_detach_database(status, &hDb)) {
		cerr << "Failed to detach database. status=" 
		     << isc_sqlcode(status) << endl;
		return 1;
	}
	for (i = 0, var = inDa->sqlvar; i < inDa->sqld; i++, var++) {
		delete [] var->sqldata;
		if (var->sqltype & 1) {
			delete var->sqlind;
		}
	}
	delete inDa;
	for (i = 0, var = outDa->sqlvar; i < outDa->sqld; i++, var++) {
		delete [] var->sqldata;
		if (var->sqltype & 1) {
			delete var->sqlind;
		}
	}
	delete outDa;
	return 0;	
}
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送