I came across a problem on project where trying to create a new record with a string attribute that ends in \ (backslash) was causing an OLE error to pop up through the DBI driver.
For example, if you had a model with a string attribute called name and you tried to do
Model.create! :name => 'foo\\' you would get the following error:
DBI::DatabaseError: Execute OLE error code: 80040E14 in Microsoft OLE DB Provider for SQL Server Incorrect syntax near '\'. HRESULT error code:0x80020009 Exception occured.: INSERT INTO completables ([project_id], [type], [description], [completion]) VALUES(2, 'Deliverable', 'bar\', 0)
This happens with Rails 1.2.3 running on Windows Server 2003 talking to SQLServer 2005 using ruby-dbi 0.0.23 and version 0.1 of the ADO driver.
Normally SQLServer allows backslashes anywhere in a string. It uses a single quote as an escape for a single quote. But for some reason a backslash at the end of a string is treated differently.
The following bit of code put into
environment.rb will replace backslashes with calls to CHAR. 92 is the ASCII value of backslash.
1 2 3 4 5 6 7 8 9
module ActiveRecord module ConnectionAdapters class SQLServerAdapter def quote_string(string) string.gsub(/\'/, "''").gsub(/\\/, "' + CHAR + '") end end end end
Great job tracking this down and coming up with the workaround.
Thanks. awesome fix
Thank, it works with one minor correction. CHAR should be CHAR(92) like so: string.gsub(/\’/, “””).gsub(/\\/, “‘ + CHAR(92) + ‘”)
Comments are closed.