⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blob1.c

📁 在Linux/Unix下面访问WINDOWS SQLSERVER 的ODBC驱动程序
💻 C
字号:
/* Testing large objects *//* Test from Sebastien Flaesch */#include "common.h"static char software_version[] = "$Id: blob1.c,v 1.1.2.5 2008/01/12 00:21:39 freddy77 Exp $";static void *no_unused_var_warn[] = { software_version, no_unused_var_warn };#define CHECK_RCODE(t,h,m) \   if ( rcode != SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO && rcode != SQL_NO_DATA && rcode != SQL_NEED_DATA ) { \      fprintf(stderr,"Error %d at: %s\n",rcode,m); \      getErrorInfo(t,h); \      exit(1); \   }#define NBYTES 10000static int failed = 0;static voidgetErrorInfo(SQLSMALLINT sqlhdltype, SQLHANDLE sqlhandle){	SQLRETURN rcode = 0;	SQLCHAR sqlstate[SQL_SQLSTATE_SIZE + 1];	SQLINTEGER naterror = 0;	SQLCHAR msgtext[SQL_MAX_MESSAGE_LENGTH + 1];	SQLSMALLINT msgtextl = 0;	rcode = SQLGetDiagRec((SQLSMALLINT) sqlhdltype,			      (SQLHANDLE) sqlhandle,			      (SQLSMALLINT) 1,			      (SQLCHAR *) sqlstate,			      (SQLINTEGER *) & naterror,			      (SQLCHAR *) msgtext, (SQLSMALLINT) sizeof(msgtext), (SQLSMALLINT *) & msgtextl);	fprintf(stderr, "Diagnostic info:\n");	fprintf(stderr, "  SQL State: %s\n", (char *) sqlstate);	fprintf(stderr, "  SQL code : %d\n", (int) naterror);	fprintf(stderr, "  Message  : %s\n", (char *) msgtext);}static voidfill_chars(char *buf, size_t len, unsigned int start, unsigned int step){	size_t n;	for (n = 0; n < len; ++n)		buf[n] = 'a' + ((start+n) * step % ('z' - 'a' + 1));}static intcheck_chars(const char *buf, size_t len, unsigned int start, unsigned int step){	size_t n;	for (n = 0; n < len; ++n)		if (buf[n] != 'a' + ((start+n) * step % ('z' - 'a' + 1)))			return 0;	return 1;}static intreadBlob(SQLHSTMT * stmth, SQLUSMALLINT pos){	SQLRETURN rcode;	char buf[4096];	SQLLEN len, total = 0;	int i = 0;	int check;	printf(">> readBlob field %d\n", pos);	while (1) {		i++;		rcode = SQLGetData(stmth, pos, SQL_C_BINARY, (SQLPOINTER) buf, (SQLINTEGER) sizeof(buf), &len);		if (!SQL_SUCCEEDED(rcode) || len <= 0)			break;		if (len > (SQLLEN) sizeof(buf))			len = (SQLLEN) sizeof(buf);		printf(">>     step %d: %d bytes readed\n", i, (int) len);		if (pos == 1)			check = check_chars(buf, len, 123 + total, 1);		else			check =	check_chars(buf, len, 987 + total, 25);		if (!check) {			fprintf(stderr, "Wrong buffer content\n");			failed = 1;		}		total += len;	}	printf(">>   total bytes read = %d \n", (int) total);	if (total != 10000)		failed = 1;	return rcode;}intmain(int argc, char **argv){	SQLRETURN rcode;	SQLHSTMT m_hstmt = NULL;	int i;	int key;	SQLLEN vind0;	char buf1[NBYTES];	SQLLEN vind1;	char buf2[NBYTES];	SQLLEN vind2;	int cnt = 2;	use_odbc_version3 = 1;	Connect();	Command(Statement, "CREATE TABLE #tt ( k INT, t TEXT, b IMAGE, v INT )");	/* Insert rows ... */	for (i = 0; i < cnt; i++) {		m_hstmt = NULL;		rcode = SQLAllocHandle(SQL_HANDLE_STMT, Connection, &m_hstmt);		CHECK_RCODE(SQL_HANDLE_DBC, Connection, "SQLAllocHandle StmtH");		rcode = SQLPrepare(m_hstmt, (SQLCHAR *) "INSERT INTO #tt VALUES ( ?, ?, ?, ? )", SQL_NTS);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLPrepare");		SQLBindParameter(m_hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &key, 0, &vind0);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLBindParameter 1");		SQLBindParameter(m_hstmt, 2, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARCHAR, 0x10000000, 0, buf1, 0, &vind1);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLBindParameter 2");		SQLBindParameter(m_hstmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, 0x10000000, 0, buf2, 0, &vind2);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLBindParameter 3");		SQLBindParameter(m_hstmt, 4, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &key, 0, &vind0);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLBindParameter 4");		key = i;		vind0 = 0;		fill_chars(buf1, NBYTES, 123, 1);		vind1 = SQL_LEN_DATA_AT_EXEC(NBYTES);		fill_chars(buf2, NBYTES, 987, 25);		vind2 = SQL_LEN_DATA_AT_EXEC(NBYTES);		printf(">> insert... %d\n", i);		rcode = SQLExecute(m_hstmt);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLExecute StmtH");		while (rcode == SQL_NEED_DATA) {			char *p;			rcode = SQLParamData(m_hstmt, (SQLPOINTER) & p);			CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLParamData StmtH");			printf(">> SQLParamData: ptr = %p  rcode = %d\n", (void *) p, rcode);			if (rcode == SQL_NEED_DATA) {				SQLRETURN rcode = SQLPutData(m_hstmt, p, NBYTES);				CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLPutData StmtH");				printf(">> param %p: total bytes written = %d\n", (void *) p, NBYTES);			}		}		rcode = SQLFreeHandle(SQL_HANDLE_STMT, (SQLHANDLE) m_hstmt);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLFreeHandle StmtH");	}	/* Now fetch rows ... */	for (i = 0; i < cnt; i++) {		m_hstmt = NULL;		rcode = SQLAllocHandle(SQL_HANDLE_STMT, Connection, &m_hstmt);		CHECK_RCODE(SQL_HANDLE_DBC, Connection, "SQLAllocHandle StmtH");		if (db_is_microsoft()) {			rcode = SQLSetStmtAttr(m_hstmt, SQL_ATTR_CURSOR_SCROLLABLE, (SQLPOINTER) SQL_NONSCROLLABLE, SQL_IS_UINTEGER);			CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLSetStmtAttr SQL_ATTR_CURSOR_SCROLLABLE");			rcode = SQLSetStmtAttr(m_hstmt, SQL_ATTR_CURSOR_SENSITIVITY, (SQLPOINTER) SQL_SENSITIVE, SQL_IS_UINTEGER);			CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLSetStmtAttr SQL_ATTR_CURSOR_SENSITIVITY");		}		rcode = SQLPrepare(m_hstmt, (SQLCHAR *) "SELECT t, b, v FROM #tt WHERE k = ?", SQL_NTS);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLPrepare");		SQLBindParameter(m_hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &i, 0, &vind0);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLBindParameter 1");		SQLBindCol(m_hstmt, 1, SQL_C_BINARY, NULL, 0, &vind1);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLBindCol 2");		SQLBindCol(m_hstmt, 2, SQL_C_BINARY, NULL, 0, &vind2);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLBindCol 3");		SQLBindCol(m_hstmt, 3, SQL_C_LONG, &key, 0, &vind0);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLBindCol 1");		vind0 = 0;		vind1 = SQL_DATA_AT_EXEC;		vind2 = SQL_DATA_AT_EXEC;		rcode = SQLExecute(m_hstmt);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLExecute StmtH");		rcode = SQLFetchScroll(m_hstmt, SQL_FETCH_NEXT, 0);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLFetchScroll StmtH");		printf(">> fetch... %d  rcode = %d\n", i, rcode);		rcode = readBlob(m_hstmt, 1);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "readBlob 1");		rcode = readBlob(m_hstmt, 2);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "readBlob 2");		rcode = SQLCloseCursor(m_hstmt);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLCloseCursor StmtH");		rcode = SQLFreeHandle(SQL_HANDLE_STMT, (SQLHANDLE) m_hstmt);		CHECK_RCODE(SQL_HANDLE_STMT, m_hstmt, "SQLFreeHandle StmtH");	}	Disconnect();	return failed ? 1 : 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -