[freetds] A more proper workaround for this Perl DBD::ODBC workaround ....

James K. Lowden jklowden at freetds.org
Thu Mar 19 09:54:11 EDT 2009


Chad Johnson wrote:
> 
> I perused the ODBC docs at:
> 
> http://msdn.microsoft.com/en-us/library/ms712631(VS.85).aspx
> 
> And the correct `Attribute` to pass into SQLSetStmtAttr is not jumping
> out at me to increase the size of the buffer for one parameter.  I
> make no claims to being an ODBC guru, but, from what I can discern
> these `Attributes` effect the entire statement (as the name of the
> function would imply) as opposed to just one parameter on the
> statement.  Am I missing something obvious?

It wasn't clear to me from your first message what it was you wanted to
do.  But, as one nonguru to another, I don't think you're missing
anything.  

Given a buffer, you can of course change the length at any time by
modifying the value of the SQLLEN pointed to by StrLen_or_IndPtr when you
called SQLBindParameter().  

As you found, you can change all the parameter buffers with
SQLSetStmtAttr() SQL_ATTR_PARAM_BIND_OFFSET_PTR.  A singularly odd
operation, I must say.  

To change part of one binding, you can tweak the descriptor with
SQLSetDescField():

	"The SQLSetDescRec function sets a variety of fields that affect the data
type and buffer bound to a column or parameter (the SQL_DESC_TYPE,
SQL_DESC_DATETIME_INTERVAL_CODE, SQL_DESC_OCTET_LENGTH,
SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_DATA_PTR,
SQL_DESC_OCTET_LENGTH_PTR, and SQL_DESC_INDICATOR_PTR fields). SQLBindCol
or SQLBindParameter can be used to make a complete specification for the
binding of a column or parameter. These functions set a specific group of
descriptor fields with one function call."

IOW, SQLBindParameter() is supposed to behave as a set of calls to
SQLSetDescRec(), and you should be able to modify any particular part of
what it did using SQLSetDescRec().  To change the bound data buffer, you
want SQL_DESC_DATA_PTR.  

I'm just an ODBC tourist; Frediano and others wrote the code.  I read the
documentation and write the occasional test or demonstration program to
improve the driver and my understanding.  I can't promise it works or is
even supposed to work as described.  I'm just pointing out what it seems
to say.  

HTH.  

--jkl


More information about the FreeTDS mailing list