LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   ODBC Programming Question with SQLBulkOperations (https://www.linuxquestions.org/questions/programming-9/odbc-programming-question-with-sqlbulkoperations-139323/)

sleepymish 01-27-2004 03:28 PM

ODBC Programming Question with SQLBulkOperations
 
Hi,

I'm trying to use SQLBulkOperations and this is my code:

*************************************************
#include <stdio.h>
#include <string.h>

#include "table.h"

// structure to hold info
typedef struct{
// SQLCHAR Bookmark[10];
// SQLINTEGER BookmarkLen;
SQLCHAR field1[6];
SQLINTEGER field1Len;
SQLCHAR field2[6];
SQLINTEGER field2Len;
}calcStruct;


void main(int argc, char *argv[])
{

// create
cDataTable db((SQLCHAR*) "test");

SQLCHAR *dsn = (SQLCHAR *) "test";
SQLCHAR *uid = (SQLCHAR *) "root";
SQLCHAR *pwd = (SQLCHAR *) "";

//SQLRETURN rc;

db.Connect(dsn, uid, pwd);

// allocate 10 calcStruct
calcStruct CalcArray[10];
SQLRETURN rc;
SQLHSTMT hstmt = db.m_hStmt;
SQLUSMALLINT RowStatusArray[10];
SQLINTEGER BindOffset = 0, numInserts=0;


// set the following attributes
SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)
SQL_CURSOR_KEYSET_DRIVEN, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER)
sizeof(calcStruct), 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) 10, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_USE_BOOKMARKS, (SQLPOINTER) SQL_UB_VARIABLE,
0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER) RowStatusArray,
0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_OFFSET_PTR,
(SQLPOINTER)&BindOffset, 0);


// get new calc data
strcpy((char*)CalcArray[0].field1, "test2");
CalcArray[0].field1Len=sizeof(CalcArray[0].field1);
strcpy((char*)CalcArray[0].field2, "test3");
CalcArray[0].field2Len=sizeof(CalcArray[0].field2);;
numInserts++;

strcpy((char*)CalcArray[1].field1, "test4");
CalcArray[1].field1Len=sizeof(CalcArray[1].field1);
strcpy((char*)CalcArray[1].field2, "test5");
CalcArray[1].field2Len=sizeof(CalcArray[1].field2);
numInserts++;

strcpy((char*)CalcArray[2].field1, "test6");
CalcArray[2].field1Len=sizeof(CalcArray[2].field1);
strcpy((char*)CalcArray[2].field2, "test7");
CalcArray[2].field2Len=sizeof(CalcArray[2].field2);
numInserts++;

// print struct
int j;
for(j=0; j<numInserts; j++)
{
printf("Element %d - %s, %s\n", j, CalcArray[j].field1,
CalcArray[j].field2);
printf("Element %d - %d, %d\n", j, CalcArray[j].field1Len,
CalcArray[j].field2Len);
}

// send data to source
if(numInserts)
{
// execute a statement to retrieve rows from the table
rc=SQLExecDirect(hstmt, (SQLCHAR*) "SELECT field1, field2 FROM
calc_table", SQL_NTS);

rc = SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)
numInserts, 0);

// bind arrays
// rc=SQLBindCol(hstmt, 0, SQL_C_VARBOOKMARK, &CalcArray[0].Bookmark,
sizeof(CalcArray[0].Bookmark), &CalcArray[0].BookmarkLen);
rc=SQLBindCol(hstmt, 1, SQL_C_CHAR, &CalcArray[0].field1,
sizeof(CalcArray[0].field1), &CalcArray[0].field1Len);
rc=SQLBindCol(hstmt, 2, SQL_C_CHAR, &CalcArray[0].field2,
sizeof(CalcArray[0].field2), &CalcArray[0].field2Len);
printf("bind rc:%s\n", rc);

//BindOffset=sizeof(calcStruct);
BindOffset=0;

printf("bindoffset %d\n", BindOffset);
printf("numInserts %d\n", numInserts);
rc = SQLBulkOperations(hstmt, SQL_ADD);
if(rc == SQL_ERROR)
{
printf("insert error\n");
db.PrintError();
}
else if(rc == SQL_SUCCESS)
{
printf("insert successful\n");
}
else if(rc == SQL_SUCCESS_WITH_INFO)
{
printf("Insert successful w/ info\n");
}
else
{
printf("not sure\n");
}

int i;
for(i=0; i<10; i++)
printf("status array %d\n", RowStatusArray[i]);

// reset
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)10, 0);
BindOffset = 0;
}

db.Disconnect();

}

*************************************************

This is what show up in my database:

field1 field2
------------------------
lalala tatata
test2 test3
*garbage* *garbage*
test3 test4


*garbage is just some random unicode

Does anyone know what I did wrong?

Thanks!
_________________________________________________________________
Learn how to choose, serve, and enjoy wine at Wine @ MSN.
http://wine.msn.com/


All times are GMT -5. The time now is 08:19 AM.