While the OLE DB for the ODBC Programmer article is excellent, there is a mistake in it.
The rgParamBindInfo array should not have names for the parameters (they should be NULL) because the prepared statement doesn’t use named parameters (they are unnamed (?,?,?,?)’s)
Because the author does not check the HRESULTS that come back from his SetParameterInfo() invokation, he doesn’t know about this error. But if you check this line:
pICmdWithParams->SetParameterInfo(nParams, rgParamOrdinals,
rgParamBindInfo);
with
if( FAILED( pICmdWithParams->SetParameterInfo(nParams, rgParamOrdinals,
rgParamBindInfo) )
{
puts( "The 1997 article by Michael Pizzo, Jeff Cochran has a mistake in it" ) ;
}
you find it throws an error because rgParamBindInfo is wrong (it should look like this:)
DBPARAMBINDINFO rgParamBindInfo[] =
{
OLESTR("DBTYPE_CHAR"), 0 /* OLESTR("CustomerID")*/, 5,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("CompanyName")*/, 40,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("ContactName") */, 30,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("ContactTitle") */, 30,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("Address") */, 60,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("City") */, 15,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("Region") */, 15,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("PostalCode") */, 10,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("Country") */, 15,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("Phone") */, 24,
DBPARAMFLAGS_ISINPUT, 0, 0,
OLESTR("DBTYPE_VARCHAR"), 0 /* OLESTR("FAX") */, 24,
DBPARAMFLAGS_ISINPUT, 0, 0,
};
Because the prepared statement looks like this:
WCHAR wSQLString[] =
OLESTR("insert into Customers (CustomerID, CompanyName, ContactName,")
OLESTR(" ContactTitle, Address, City, Region, PostalCode, Country,")
OLESTR(" Phone, Fax)")
OLESTR(" values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
If the prepared statement used named parameters, it would look something like this:
WCHAR wSQLString[] =
OLESTR("insert into Customers (CustomerID, CompanyName, ContactName,")
OLESTR(" ContactTitle, Address, City, Region, PostalCode, Country,")
OLESTR(" Phone, Fax)")
OLESTR(" values (:CustomerID, :CompanyName, :ContactName, ")
OLESTR(" :ContactTitle, :Address, :City, :Region, :PostalCode, :Country, ")
OLESTR(" :Phone, :Fax)");
That’s why the docs also say The name of the parameter; it is a null pointer if there is no name. Names are normal names. The colon prefix (where used within SQL text) is stripped.
One Trackback/Pingback
[...] Bobobobo’s Weblog technology and the internets About MECG 1CG 2INDEXbrowse « Mistake in “OLE DB for the ODBC Programmer” [...]