访问SQL以在未绑定的文本框中保存值不能保存超过255个字符

时间:2014-11-17 01:16:15

标签: sql ms-access access-vba ms-access-2013

我已经阅读了几篇类似的帖子,但没有找到解决此问题的方法:

我有一个带有未绑定的富文本格式的表单,多行文本框名为tbxNote。退出文本框时,我使用VBA代码创建一个SQL字符串,我随后执行该操作以使用未绑定文本框中的值更新表字段[Note]。 [注意]是一个"长文"字段(根据我的理解," Long Text"等同于以前被称为" Memo"字段)。后端是一个Access数据库。

问题是:只有tbxNote中的前250个字符才会存储在目标表字段[注意]中,即使其他"长文本"其他表中的字段接受的值远远超过250个字符。因此,它似乎不是后端表中字段类型或特征的问题。

此外,如果我手动打开目标表并将350个字符粘贴到目标表中的相同[Note]字段中,则会存储所有350个字符。但是,如果我将该记录加载到表单中或将相同的350个字符放入表单的tbxNote文本框中,则只有250个字符被拉入tbxNote或保存到[Note]。

有没有办法在代码中使用UPDATE SQL在未绑定的文本框中存储超过250个字符?

如果重要,这里我用来证明350个字符中只有250个字符的SQL代码被保存到表字段中[注意]:

dbs.Execute  "UPDATE tblSupeGenNotes " & _
    "SET [NoteDate] = #" & Me.tbxNoteDate & "#, " & _
        "[SupeType] = " & Chr(34) & Me.cbxSupeType & Chr(34) & ", " & _
        "[SupeAlerts] = " & alrt & ", " & _
        "[Note] = " & Chr(34) & String(350, "a") & Chr(34) & " " & _
    "WHERE [SupeGenNoteID] = " & Me.tbxSupeGenNoteID & ";"

当然,通常我会Me.tbxNote代替String(350, "a"),但String证明350个字符中只有250个存储在[Note]字段中。< / p>

我必须遗漏一些简单的东西,但我无法理解。

3 个答案:

答案 0 :(得分:1)

@ HansUp建议尝试使用DAO记录集来更新表。这就是诀窍!谢谢你,HansUp。 HansUp要求我发布答案,因此,这里的代码适用于遇到此主题的任何人:

Dim dbs As DAO.Database
Dim rsTable As DAO.Recordset
Dim rsQuery As DAO.Recordset

Set dbs = CurrentDb

'Open a table-type Recordset
Set rsTable = dbs.OpenRecordset("tblSupeGenNotes", dbOpenDynaset)

'Open a dynaset-type Recordset using a saved query
Set rsQuery = dbs.OpenRecordset("qrySupeGenNotes", dbOpenDynaset)

'update the values vased on the contents of the form controls
rsQuery.Edit
rsQuery![NoteDate] = Me.tbxNoteDate
rsQuery![SupeType] = Me.cbxSupeType
rsQuery![SupeAlerts] = alrt
rsQuery![Note] = Me.tbxNote
rsQuery.Update

'clean up
rsQuery.Close
rsTable.Close
Set rsQuery = Nothing
Set rsTable = Nothing

AH!解决方案的另一个问题是,在使用DAO记录集之前,我将表中的值拉入列表框,并从列表框中拉入表单控件(而不是直接从表中控制表单控件)。部分问题(我相信)是我然后从列表框中的选定项目而不是直接从表格填充表单控件。我相信列表框在任何一列中只允许255个字符(250个字符?),因此,每次我从列表框中将值拉入文本框时,代码只将前255个字符拉入文本框。然后,当文本框退出时,代码使用完整的文本框文本更新表格,但是当它通过列表框被拉回到表单中时,我们将返回到255个字符。当然,当我切换到DAO方法时,我也切换到直接从表中读取文本框值而不是从列表框中拉出它。

道德:注意通过列表框提取长文本值!

感谢所有帮助我解决此问题的人。很抱歉这样的新手错误看起来比以前更复杂。

答案 1 :(得分:1)

不幸的是,您发布的测试代码有效,但您未能发布失败的实际更新字符串。一个常见的(也是已知的)问题是如果在SQL中包含函数(尤其是聚合),则限制为255个字符。

实际上,如果你有一个围绕未绑定文本框并在查询中使用的函数,这可以适用。

所以这样的更新应该并且可以工作,但是这种混合中的引入函数可能会导致查询处理器出现问题。

如果您包含实际更新,则可能已确定上述问题。 所以解决方法是:

不要在SQL更新字符串中直接使用任何“函数”,而是构建字符串。

代替说:

Dbs.Execute "update tblTest set Notes = string(350,’a’)"

注意上面的字符串函数是如何嵌入sql。

因此,您可以将函数置于查询外部,从而预先构建字符串 - 查询处理器不执行,甚至不会看到此类函数。

所以我们可以根据你的例子改变上面的内容:

例如:

Dbs.Execute "update tblTest set Notes = ‘" & string(350,’a’) & "’"

(这是您发布的示例的工作方式/原因,但可能是您的实际代码失败的原因)。因此,函数可以(并且应该)移出实际的查询字符串。

还要确保文本框的格式中没有FORMAT,因为再次将文本框截断为255.

如前所述,另一个建议是考虑使用记录集更新来代替SQL更新。

使用记录集通常可以删除分隔符和函数问题,然后成为非问题。

所以这样的SQL更新可以超过255个字符,但是在查询处理器按照上面的示例获取数据之前,需要在VBA代码中评估函数。

如上所述,删除文本框中的任何“格式”(属性表,格式选项卡)。

答案 2 :(得分:0)

我假设您使用的是SqlClient库。在这种情况下,我建议尝试SqlParameter而不是按照您的方式创建SQL字符串。使用SqlParameter,您可以指定每个参数的大小。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2。我是C#dev,所以我对在C#中执行下面的示例代码道歉:

string param = "Hello World";
byte [] encodedStr = Encoding.UTF8.GetBytes(param);
SqlParameter sqlParam = new SqlParameter();
sqlParam.Size = encodedStr.Count;  // uses byte count

你可以通过调用Encoding.UTF8.GetBytes(param).Count来压缩它。无论如何,这可能会解决您的问题