VBA - 运行 使用 DAO 对象时出现时间错误 3271
VBA - Run Time Error 3271 using DAO object
我正在尝试使用 DAO.QueryDef
和 Microsoft Access 中的本地 Append
查询来更新 SQL 服务器数据库。我正在更新的一些字段包含非常长的字符串(从 0
到 700
个字符以上的任何地方)。
当字符串长度在 0
到 255
个字符的范围内时,我可以毫无问题地将它传递到我的查询中并更新相应的表。但是,当它们超过 255
个字符时,我会收到以下 运行 次错误:
我一直在使用 random string generator website 来创建和测试不同长度的字符串。我还检查了我的数据库中的列数据类型,它们都在 NVARCHAR(MAX)
需要的位置。 Microsoft Access 显示数据类型为 Long text
.
的相同列
下面是我的代码片段:
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
查询定义:
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];
您应该明确定义查询参数,至少是那些具有 LongText 数据类型的参数。否则 Access 必须猜测它们的数据类型。
您可以在查询设计编辑器中执行此操作,单击 "Parameters" 按钮。
或在 SQL 视图中,创建 PARAMETERS clause
PARAMETERS [parLongString] LongText;
UPDATE myTable
SET LongString = [parLongString]
WHERE ...
您面临 Access SQL 文本参数的限制。它们不能容纳超过 255 个字符的字符串值。
这是一个演示问题的简单示例。
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strUpdate As String
Dim strLongString As String
strLongString = String(300, "x")
strUpdate = "UPDATE tblFoo SET memo_field = [pLongString] WHERE id=2;"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strUpdate)
qdf.Parameters("pLongString").Value = strLongString
qdf.Execute dbFailOnError
该代码触发错误 #3271,"Invalid property value." ...与您看到的错误相同。
如果我更改 UPDATE
语句以包含这样的 PARAMETERS
子句...
strUpdate = "PARAMETERS [pLongString] LongText;" & vbCrLf & _
"UPDATE tblFoo SET memo_field = [pLongString] WHERE id=2;"
...结果还是错误#3271。
我认为没有任何方法可以克服访问 SQL 的限制。
所以如果你的文本参数值的长度大于 255 个字符,你需要一个不同的方法。
DAO.Recordset
方法是一种在字段中存储长文本字符串的简单替代方法。
Dim rs As DAO.Recordset
Dim strSelect
strSelect = "SELECT id, memo_field FROM tblFoo WHERE id=2;"
Set rs = db.OpenRecordset(strSelect)
With rs
If Not (.BOF And .EOF) Then
.Edit
!memo_field.Value = strLongString
.Update
End If
.Close
End With
除了,ADO好像没有这个问题
添加对 Microsoft ActiveX 数据对象 库的引用(工具 -> 引用...)(选择最高版本;在我的机器上是 6.1).
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = CurrentProject.AccessConnection
cmd.CommandText = "qryUpdateFile"
'the rest of the parameter values need to be included in the array
'omitted for brevity
cmd.Execute , Array(txtboxUpdateConversionName.Value, txtboxZipFileNameLogic.Value)
我正在尝试使用 DAO.QueryDef
和 Microsoft Access 中的本地 Append
查询来更新 SQL 服务器数据库。我正在更新的一些字段包含非常长的字符串(从 0
到 700
个字符以上的任何地方)。
当字符串长度在 0
到 255
个字符的范围内时,我可以毫无问题地将它传递到我的查询中并更新相应的表。但是,当它们超过 255
个字符时,我会收到以下 运行 次错误:
我一直在使用 random string generator website 来创建和测试不同长度的字符串。我还检查了我的数据库中的列数据类型,它们都在 NVARCHAR(MAX)
需要的位置。 Microsoft Access 显示数据类型为 Long text
.
下面是我的代码片段:
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
查询定义:
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];
您应该明确定义查询参数,至少是那些具有 LongText 数据类型的参数。否则 Access 必须猜测它们的数据类型。
您可以在查询设计编辑器中执行此操作,单击 "Parameters" 按钮。
或在 SQL 视图中,创建 PARAMETERS clause
PARAMETERS [parLongString] LongText;
UPDATE myTable
SET LongString = [parLongString]
WHERE ...
您面临 Access SQL 文本参数的限制。它们不能容纳超过 255 个字符的字符串值。
这是一个演示问题的简单示例。
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strUpdate As String
Dim strLongString As String
strLongString = String(300, "x")
strUpdate = "UPDATE tblFoo SET memo_field = [pLongString] WHERE id=2;"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strUpdate)
qdf.Parameters("pLongString").Value = strLongString
qdf.Execute dbFailOnError
该代码触发错误 #3271,"Invalid property value." ...与您看到的错误相同。
如果我更改 UPDATE
语句以包含这样的 PARAMETERS
子句...
strUpdate = "PARAMETERS [pLongString] LongText;" & vbCrLf & _
"UPDATE tblFoo SET memo_field = [pLongString] WHERE id=2;"
...结果还是错误#3271。
我认为没有任何方法可以克服访问 SQL 的限制。
所以如果你的文本参数值的长度大于 255 个字符,你需要一个不同的方法。
DAO.Recordset
方法是一种在字段中存储长文本字符串的简单替代方法。
Dim rs As DAO.Recordset
Dim strSelect
strSelect = "SELECT id, memo_field FROM tblFoo WHERE id=2;"
Set rs = db.OpenRecordset(strSelect)
With rs
If Not (.BOF And .EOF) Then
.Edit
!memo_field.Value = strLongString
.Update
End If
.Close
End With
除了
添加对 Microsoft ActiveX 数据对象 库的引用(工具 -> 引用...)(选择最高版本;在我的机器上是 6.1).
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = CurrentProject.AccessConnection
cmd.CommandText = "qryUpdateFile"
'the rest of the parameter values need to be included in the array
'omitted for brevity
cmd.Execute , Array(txtboxUpdateConversionName.Value, txtboxZipFileNameLogic.Value)