I'm trying to update a SQL server database using DAO.QueryDef
and a local Append
query in Microsoft Access. Some of my fields that are being updated contain very long strings (anywhere from 0
to upwards of 700
characters).
When the string length is in the range from 0
to 255
characters, I have no problem passing it into my query and updating the respective tables. However when they exceed 255
characters, I receive the following run-time error:
I have been using a random string generator website to create and test strings with varying lengths. I have also checked my database for the column data types and they are all NVARCHAR(MAX)
where they need to be. Microsoft Access is showing the same respective columns with the data type Long text
.
See below for my code snippet:
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb
If Not IsNull(cmbboxFileNameLogic) Then
Set qdf = dbs.QueryDefs("qryUpdateFile")
qdf.Parameters("FileName").Value = txtboxUpdateConversionName.Value
qdf.Parameters("ZipFileName").Value = txtboxZipFileNameLogic.Value
qdf.Parameters("OutputFormat").Value = txtboxOutputFormat.Value
qdf.Parameters("Delimeter").Value = txtboxDelimeter.Value
qdf.Parameters("DestinationLocation").Value = txtboxDestinationLocation.Value
qdf.Parameters("DeliveryMechinism").Value = txtboxDeliveryMechinism.Value
qdf.Parameters("Note").Value = txtboxOutputFileInfoNotes.Value
qdf.Parameters("Criteria").Value = txtboxOutputFileInfoCriteria.Value
qdf.Parameters("CustomListKey").Value = txtboxCustomListKey.Value
qdf.Parameters("ExcludeCustomListKey").Value = txtboxExcludeCustomListKey.Value
qdf.Parameters("NewspaperFlag").Value = chkNewsPaperFlag.Value
qdf.Parameters("WebsiteFlag").Value = chkWebsiteFlag.Value
qdf.Parameters("MarketingFlag").Value = chkProfessionalMarketingFlag.Value
qdf.Parameters("PrintFlag").Value = chkProfessionalPrintFlag.Value
qdf.Parameters("WebsiteFlag").Value = chkWebsiteFlag.Value
qdf.Parameters("BrokerDealerFlag").Value = chkBrokerDealerFlag.Value
qdf.Parameters("ActiveOnly").Value = chkActiveOnly.Value
qdf.Parameters("OutputFormatting").Value = txtboxFileFormatting.Value
qdf.Parameters("Header").Value = txtboxHeader.Value
qdf.Parameters("Footer").Value = txtboxFooter.Value
qdf.Parameters("SQLStatement").Value = txtboxSQLStatement.Value
qdf.Parameters("OrderBy").Value = txtboxOrderBy.Value
qdf.Parameters("FileID").Value = cmbboxFileNameLogic.Value
qdf.Execute dbSeeChanges
qdf.Close
lblOutputFileInfoAction.Caption = "File successfully updated"
lblOutputFileInfoAction.Visible = True
Else
-- Insert new values
End If
Query Definition:
UPDATE myTableNameGoesHere SET fldFileNameLogic = [FileName],
fldZipFileNameLogic = [ZipFileName],fldOutputFormat = [OutputFormat],
fldDelimeter = [Delimeter],
fldDestinationLocation = [DestinationLocation], fldDeliveryMechinism = [DeliveryMechinism],
fldNote = [Note], fldCriteria = [Criteria], fldCustomListKey = [CustomListKey],
fldExcludeCustomListKey = [ExcludeCustomListKey], fldNewspaperFlag = [NewspaperFlag],
fldProfessionalWebsiteFlag = [WebsiteFlag], fldProfessionalMarketingFlag = [MarketingFlag],
fldProfessionalPrintFlag = [PrintFlag], fldWebsiteFlag = [WebsiteFlag],
fldBrokerDealerFlag = [BrokerDealerFlag], fldActiveOnly = [ActiveOnly],
fldFileOutputFormatting = [OutputFormatting], fldHeader = [Header],
fldFooter = [Footer], fldSQLStatement = [SQLStatement], fldOrderBy = [OrderBy]
WHERE [fldFileID] = [FileID];
qryUpdateFile
is a local Access object, does a plain vanillaINSERT
statement with long texts work, typed into the SQL view of a new query? (Without using VBA objects) – Macropterous'
and"
which was a pain. It's also open to SQL injection which is why I have chosen to revise my old code and use parameterized queries.qryUpdateFile
is a local access object, I am not calling any SQL stored procs or anything for now. – MildewqryUpdateFile
(including the PARAMETERS section) to your question? – Lilyliveredqdf.Fields("ProblematicField").Size
return? And as what type does the querydef interpret this field? (qdf.Fields("ProblematicField").Type
) – MacropterousItem not found in this collection
. I'm just declaring an integer and assigning it like so:fieldSize = qdf.Fields("SQLStatement").Size
. I have a breakpoint set which breaks with the exception. – Mildewdbs.QueryDefs("qryUpdateFile")
returns a querydef object based on the Acces object "qryUpdateFile".dbs.QueryDefs("qryUpdateFile").Fields("fldFileNameLogic")
returns a field object based on the field "fldFileNameLogic" in "qryUpdateFile". You have to specify the field name, not an SQL statement. – MacropterousPARAMETERS
statement in the update query. How are you defining them? Please also break lines in query to avoid horizontal scrolling. Also what line does debugger highlight? – HallowPARAMETERS
within the query itself. This was my first time trying to figure out this concept in MS Access and I think I misunderstood how they should be set up. The debugger in VBA will highlight any line in which a parameter length is over 255 characters. For example, if I am updating the fieldNote
and the textbox containing the text to update is1000
characters long, the exception will be thrown there. – MildewSQLStatement
, is not an actual SQL statement that is used for anything. It is simply just a text field that can be very large. It should have beenfldSqlStatement
according to your response.fldFileNameLogic
is a column inside my database andFileNameLogic
is the value I am passing into the query. – Mildewqdf.Fields("fldFileNameLogic ").Size
andqdf.Fields("fldFileNameLogic ").Type
return? – MacropterousItem not found in this collection
error. i.imgur.com/zHHXFVY.jpg – MildewfldFileNameLogic
inqryUpdateFile
, right? Btw.,test1
andtest2
cannot be objects in the code from the screenshot. Long should be ok, Variant will definetely work. – MacropteroustblFile
with a columnfldFileNameLogic
- this contains the name of a file. This field should be the first field in my queryqryUpdateFile
. – Mildew