[freetds] bulk copy error: Received invalid row length x from bcpclient. Minimum row size is y

Thompson, Bill D (London) bill_d_thompson at ml.com
Wed Jun 22 10:42:59 EDT 2005


Hi Patrick,

You are probably using the wrong version of the TDS protocol to talk to
your server. My guess is you'll be using the default version 4.2.

the TDS version needs to be 5.0 for Sybase, 7.0 for SQL Server.

you usually set this in the freetds.conf file.


Bill

-----Original Message-----
From: freetds-bounces at lists.ibiblio.org
[mailto:freetds-bounces at lists.ibiblio.org] On Behalf Of Patrick Dunnigan
Sent: 22 June 2005 15:34
To: freetds at lists.ibiblio.org
Subject: [freetds] bulk copy error: Received invalid row length x from
bcpclient. Minimum row size is y


Hi,

I am attempting a bulk copy from a c program into SQL Server 2000 using
DBLib in freeTDS 0.63 RC11 (gcc 3.4.3, RH 9). I am getting an error
message that I cannot find any documentation on. 

"Received invalid row length 2 from bcp client. Minimum row size is 4."

I know the row is longer 2 bytes (see below). Once this happened I
created a test table and C program. See below. Anyone with any ideas?

Thanks

Program output ----------------> 
$ ./test_bcp
bcp'ing This is a test with a length of 14
sent
Msg 4807, Level 16, State 1
Server 'CENTIVIA_10', Line 1
Received invalid row length 2 from bcp client. Minimum row size is 4.
done
<----------------------

Table ddl --------------------->
CREATE TABLE [xxx] (
 [col2] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
) ON [PRIMARY]
GO
<------------------------------------

Compiled using gcc ------------------->
gcc -g -I/home/test_user/dev/freetds-0.63RC11/include -Wall
-Wno-strict-aliasing -g -O2 -c -o test_bcp.o test_bcp.c
gcc -o test_bcp test_bcp.o -L/home/test_user/lib -lsybdb
<----------------------------------


program source (included the msg and error handler code)
-------------------------->
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sqldb.h>
int
syb_msg_handler(DBPROCESS * dbproc, DBINT msgno, int msgstate, int
severity, char *msgtext, char *srvname, char *procname, int line)
{
        char var_value[31];
        int i;
        char *c;

        if (msgno == 5701 ||    /* database context change */
            msgno == 5703 ||    /* language changed */
            msgno == 5704) {    /* charset changed */

                if (msgtext != NULL && (c = strchr(msgtext, '\'')) !=
NULL) {
                        i = 0;
                        for (++c; i <= 30 && *c != '\0' && *c != '\'';
++c)
                                var_value[i++] = *c;
                        var_value[i] = '\0';

                }
                return 0;
        }

        if (severity >= 0 || msgno == 0) {
                if (msgno > 0 && severity > 0) {
                        fprintf(stdout, "Msg %d, Level %d, State %d\n",
(int) msgno, (int) severity, (int) msgstate);
                        fprintf(stdout, "Server '%s'", srvname);
                        if (procname != NULL && *procname != '\0')
                                fprintf(stdout, ", Procedure '%s'",
procname);
                        if (line > 0)
                                fprintf(stdout, ", Line %d", line);
                        fprintf(stdout, "\n");
                        fprintf(stdout, "%s\n", msgtext);
                        fflush(stdout);
                } else {
                        fprintf(stdout, "%s\n", msgtext);
                        fflush(stdout);
                }
        }

        return 0;
}

int
syb_err_handler(DBPROCESS * dbproc, int severity, int dberr, int oserr,
char *dberrstr, char *oserrstr)
{
        if (dberr == SYBESMSG)
                return INT_CANCEL;
        env_set(g_env, "batch_failcount", "1");
        fprintf(stdout,
                "DB-LIBRARY error (severity %d, dberr %d, oserr %d,
dberrstr %s, oserrstr %s):\n",
                severity, dberr, oserr, dberrstr ? dberrstr : "(null)",
oserrstr ? oserrstr : "(null)");
        fflush(stdout);
        if ((dbproc == NULL) || DBDEAD(dbproc)) {
                if (dberr != SYBECOFL) {
                        exit(255);
                }
        }

        return INT_CANCEL;
}


int main(int argc, char *argv[])
{
        DBPROCESS *dbproc;
        LOGINREC *login;
        DBINT test_int = 99999999;
        DBCHAR test_char[32] = "This is a test";

        dbinit();
        dberrhandle(syb_err_handler);
        dbmsghandle(syb_msg_handler);
        login = dblogin();
        DBSETLPWD(login, "audit");
        DBSETLUSER(login, "audit");
        dbproc = dbopen(login, "192.168.58.1");
        dbuse(dbproc, "audit_dev");

        bcp_init(dbproc,"xxx", (BYTE *)NULL, (BYTE *)NULL, DB_IN);
        printf("bcp'ing %s with a length of
%d\n",test_char,strlen(test_char));
        //ii = bcp_bind(dbproc, (BYTE *) &test_int, 0, -1, NULL, 0,
SYBINT4, 1 );
        //printf("bound %d\n",ii;
        bcp_bind(dbproc, test_char, 0, strlen(test_char), NULL, 0,
SYBCHAR, 1 );
        bcp_sendrow(dbproc);
        printf("sent\n");
        bcp_batch(dbproc);
        printf("done\n");
        return 0;

}
<---------------------------------
_______________________________________________
FreeTDS mailing list
FreeTDS at lists.ibiblio.org
http://lists.ibiblio.org/mailman/listinfo/freetds
--------------------------------------------------------

If you are not an intended recipient of this e-mail, please notify the sender, delete it and do not read, act upon, print, disclose, copy, retain or redistribute it. Click here for important additional terms relating to this e-mail.     http://www.ml.com/email_terms/
--------------------------------------------------------


More information about the FreeTDS mailing list