PRB: RFX_LongBinary Not Optimized for SQL Server (153888)
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), when used with:
- Microsoft Visual C++, 32-bit Editions 4.0
- Microsoft Visual C++, 32-bit Editions 4.1
- Microsoft Visual C++, 32-bit Enterprise Edition 4.2
- Microsoft Visual C++, 32-bit Professional Edition 4.2
This article was previously published under Q153888 SYMPTOMS
Performing inserts of image fields into a SQL Server table using the
MFC database classes may result in less than optimum performance. Other
operations involving image fields, such as updates, do not suffer from
this reduced performance.
CAUSE
MFC's RFX_LongBinary function uses an obsolete method to specify the
size of the image field when binding the CLongBinary buffer for the
insertion.
Due to limitations of the SQL Server driver, MFC will always use SQL
statements instead of SQLSetPos functionality to perform inserts of
image fields to a recordset opened on a SQL Server database. MFC also
uses parameterized insert statements. As a result, SQLBindParameter()
is called to bind the CLongBinary variable's buffer to the parameter
in the insert statement. MFC specifies that the length of the long
binary field is SQL_DATA_AT_EXEC, a symbol that signifies that data
will be transferred via SQLPutData() without providing any information
about the field's size. The SQL Server driver generates an internal
plan for the insert that contains a subquery of the form
"SELECT ... LIKE" that results in a table scan that can be quite time-
consuming.
RESOLUTION
To avoid unnecessary table scans when inserting data into image fields,
you can modify MFC to use the SQL_LEN_DATA_AT_EXEC() macro that provides
information about the size of the image data and thereby minimizes the
need for table scans.
NOTE: Visual C++ version 5.0 now uses the SQL_LEN_DATA_AT_EXEC() macro.
STATUS
This behavior is by design.
REFERENCES
ODBC Programmer's Reference.
Modification Type: | Major | Last Reviewed: | 12/1/2003 |
---|
Keywords: | kbDatabase kbinterop kbprb kbprogramming kbusage KB153888 |
---|
|