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

📄 bcp.c

📁 在Linux/Unix下面访问WINDOWS SQLSERVER 的ODBC驱动程序
💻 C
字号:
/*  * Purpose: Test bcp functions * Functions: bcp_batch bcp_bind bcp_done bcp_init bcp_sendrow  */#include "common.h"#include <assert.h>#if HAVE_SYS_STAT_H#include <sys/stat.h>#endif /* HAVE_SYS_STAT_H */#include "bcp.h"static char software_version[] = "$Id: bcp.c,v 1.14 2007/11/26 08:52:40 freddy77 Exp $";static void *no_unused_var_warn[] = { software_version, no_unused_var_warn };static char cmd[512];static int init(DBPROCESS * dbproc, const char *name);static void test_bind(DBPROCESS * dbproc);/* * Static data for insertion */int not_null_bit = 1;char not_null_char[] = "a char";char not_null_varchar[] = "a varchar";char not_null_datetime[] 		= "Dec 17 2003  3:44PM";char not_null_smalldatetime[] 	= "Dec 17 2003  3:44PM";char not_null_money[] = "12.34";char not_null_smallmoney[] = "12.34";char not_null_float[] = "12.34";char not_null_real[] = "12.34";char not_null_decimal[] = "12.34";char not_null_numeric[] = "12.34";int not_null_int        = 1234;int not_null_smallint   = 1234;int not_null_tinyint    = 123;static intinit(DBPROCESS * dbproc, const char *name){	int res = 0;	RETCODE rc;	fprintf(stdout, "Dropping %s.%s..%s\n", SERVER, DATABASE, name);	add_bread_crumb();	sprintf(cmd, "if exists (select 1 from sysobjects where type = 'U' and name = '%s') drop table %s", name, name);	dbcmd(dbproc, cmd);	add_bread_crumb();	dbsqlexec(dbproc);	add_bread_crumb();	while ((rc=dbresults(dbproc)) == SUCCEED) {		/* nop */	}	if (rc != NO_MORE_RESULTS)		return 1;	add_bread_crumb();	fprintf(stdout, "Creating %s.%s..%s\n", SERVER, DATABASE, name);	dbcmd(dbproc, create_table_sql);#if 1	dbfcmd(dbproc, 	"select colid, cast(c.name as varchar(30)) as name, c.length "			", '  '+ substring('NY', convert(bit,(c.status & 8))+1,1) as Nulls " 			"from syscolumns as c left join systypes as t on c.usertype = t.usertype "			"where c.id = object_id('%s') order by colid", name );#endif	if (dbsqlexec(dbproc) == FAIL) {		add_bread_crumb();		res = 1;	}	while ((rc=dbresults(dbproc)) == SUCCEED) {		dbprhead(dbproc);		dbprrow(dbproc);		while ((rc=dbnextrow(dbproc)) == REG_ROW) {			dbprrow(dbproc);		}	}	if (rc != NO_MORE_RESULTS)		return 1;	fprintf(stdout, "%s\n", res? "error" : "ok");	return res;}#define VARCHAR_BIND(x) \	bcp_bind( dbproc, (unsigned char *) &x, prefixlen, strlen(x), NULL, termlen, SYBVARCHAR, col++ )#define INT_BIND(x) \	bcp_bind( dbproc, (unsigned char *) &x, prefixlen, -1, NULL, termlen, SYBINT4,    col++ )#define NULL_BIND(x, type) \	bcp_bind( dbproc, (unsigned char *) &x, prefixlen, 0, NULL, termlen, type,    col++ )static voidtest_bind(DBPROCESS * dbproc){	enum { prefixlen = 0 };	enum { termlen = 0 };	enum NullValue { IsNull, IsNotNull };	RETCODE fOK;	int col=1;	/* non nulls */	fOK = INT_BIND(not_null_bit);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_char);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_varchar);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_datetime);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_smalldatetime);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_money);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_smallmoney);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_float);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_real);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_decimal);	assert(fOK == SUCCEED); 	fOK = VARCHAR_BIND(not_null_numeric);	assert(fOK == SUCCEED); 	fOK = INT_BIND(not_null_int);	assert(fOK == SUCCEED); 	fOK = INT_BIND(not_null_smallint);	assert(fOK == SUCCEED); 	fOK = INT_BIND(not_null_tinyint);	assert(fOK == SUCCEED); 	/* nulls */	fOK = NULL_BIND(not_null_char, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_varchar, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_datetime, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_smalldatetime, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_money, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_smallmoney, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_float, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_real, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_decimal, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_numeric, SYBVARCHAR);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_int, SYBINT4);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_smallint, SYBINT4);	assert(fOK == SUCCEED); 	fOK = NULL_BIND(not_null_tinyint, SYBINT4);	assert(fOK == SUCCEED); }intmain(int argc, char **argv){	LOGINREC *login;	DBPROCESS *dbproc;	int i, rows_sent=0;	int failed = 0;	const char *s;	const char *table_name = "all_types_bcp_unittest";	set_malloc_options();	read_login_info(argc, argv);	fprintf(stdout, "Start\n");	add_bread_crumb();	dbinit();	add_bread_crumb();	dberrhandle(syb_err_handler);	dbmsghandle(syb_msg_handler);	fprintf(stdout, "About to logon\n");	add_bread_crumb();	login = dblogin();	DBSETLPWD(login, PASSWORD);	DBSETLUSER(login, USER);	DBSETLAPP(login, "bcp.c unit test");	BCP_SETL(login, 1);	fprintf(stdout, "About to open %s.%s\n", SERVER, DATABASE);	add_bread_crumb();	dbproc = dbopen(login, SERVER);	if (strlen(DATABASE))		dbuse(dbproc, DATABASE);	add_bread_crumb();	dbloginfree(login);	add_bread_crumb();	add_bread_crumb();	if (init(dbproc, table_name))		exit(1);	/* set up and send the bcp */	sprintf(cmd, "%s..%s", DATABASE, table_name);	fprintf(stdout, "preparing to insert into %s ... ", cmd);	if (bcp_init(dbproc, cmd, NULL, NULL, DB_IN) == FAIL) {		fprintf(stdout, "failed\n");    		exit(1);	}	fprintf(stdout, "OK\n");	test_bind(dbproc);	fprintf(stdout, "Sending same row 10 times... \n");	for (i=0; i<10; i++) {		if (bcp_sendrow(dbproc) == FAIL) {			fprintf(stdout, "send failed\n");		        exit(1);		}	}		fprintf(stdout, "Sending 5 more rows ... \n");	for (i=15; i <= 27; i++) {		int type = dbcoltype(dbproc, i);		int len = (type == SYBCHAR || type == SYBVARCHAR)? dbcollen(dbproc, i) : -1;		if (bcp_collen(dbproc, len, i) == FAIL) {			fprintf(stdout, "bcp_collen failed for column %d\n", i);		        exit(1);		}	}	for (i=0; i<5; i++) {		if (bcp_sendrow(dbproc) == FAIL) {			fprintf(stdout, "send failed\n");		        exit(1);		}	}#if 1	rows_sent = bcp_batch(dbproc);	if (rows_sent == -1) {		fprintf(stdout, "batch failed\n");	        exit(1);	}#endif	fprintf(stdout, "OK\n");	/* end bcp.  */	if ((rows_sent += bcp_done(dbproc)) == -1)	    printf("Bulk copy unsuccessful.\n");	else	    printf("%d rows copied.\n", rows_sent);	printf("done\n");	add_bread_crumb();#if 0	fprintf(stdout, "select * from %s\n", table_name);	dbfcmd(dbproc, "select * from %s\n", table_name);#endif#if 1	dbfcmd(dbproc, 	"select   'nullable_char' as col, count(*) nrows"				", datalength(nullable_char) as len, nullable_char as value "			"from %s group by nullable_char\n", table_name);	dbfcmd(dbproc, 	"UNION\n"			"select   'nullable_varchar' as col, count(*) nrows"				", datalength(nullable_varchar) as len, nullable_varchar as value "			"from %s group by nullable_varchar\n", table_name);	dbfcmd(dbproc, 	"UNION\n"			"select   'nullable_int' as col, count(*) nrows"				", datalength(nullable_int) as len, cast(nullable_int as varchar(6))as value "			"from %s group by nullable_int\n", table_name);	dbfcmd(dbproc, "order by col, len, nrows\n");	dbsqlexec(dbproc);	while ((i=dbresults(dbproc)) == SUCCEED) {		dbprhead(dbproc);		dbprrow(dbproc);		while ((i=dbnextrow(dbproc)) == REG_ROW) {			dbprrow(dbproc);		}	}#endif	if ((s = getenv("BCP")) != NULL && 0 == strcmp(s, "nodrop")) {		fprintf(stdout, "BCP=nodrop: '%s..%s' kept\n", DATABASE, table_name);	} else {		fprintf(stdout, "Dropping table %s\n", table_name);		add_bread_crumb();		sprintf(cmd, "drop table %s", table_name);		dbcmd(dbproc, cmd);		add_bread_crumb();		dbsqlexec(dbproc);		add_bread_crumb();		while (dbresults(dbproc) != NO_MORE_RESULTS) {			/* nop */		}	}	add_bread_crumb();	dbexit();	add_bread_crumb();	failed = 0;	fprintf(stdout, "dblib %s on %s\n", (failed ? "failed!" : "okay"), __FILE__);	free_bread_crumb();	return failed ? 1 : 0;}

⌨️ 快捷键说明

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