通过ADO创建/编辑记录时索引的MySQL字段不保存值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了通过ADO创建/编辑记录时索引的MySQL字段不保存值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4260字,纯文字阅读大概需要7分钟。
内容图文
![通过ADO创建/编辑记录时索引的MySQL字段不保存值](/upload/InfoBanner/zyjiaocheng/905/5977c6f68f0f4ceb93b0465601c53d94.jpg)
我正在使用ADO将记录添加到MySQL表中.代码工作正常,数据发布到新记录,除了userid之外.我无法弄清楚为什么.
'---------------------------------------------------------------------------------------
' Procedure : IPhpList_AddHistory
' Author : Adam
' Date : 12/8/2014
' Purpose : Add a history record to the phpList account.
'---------------------------------------------------------------------------------------
'
Private Sub IPhpList_AddHistory(cUser As clsUser, cHistory As clsHistory)
Dim strSQL As String
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
strSQL = "phplist_user_user_history limit 0,1"
rst.Open strSQL, oConn, adOpenDynamic, adLockOptimistic
With rst
.AddNew
!userid = cUser.PhpListID
!ip = ""
![Date] = cHistory.AddDate
!Summary = cHistory.Subject
!Detail = cHistory.Body
!systeminfo = "Automated syncronization process. " & VBE.ActiveVBProject.Description
.Update
.Close
End With
' Clear reference
Set rst = Nothing
End Sub
看起来很简单,但MySQL中的结果记录缺少userid值.
列上有一个索引,但似乎不应该阻止我设置该值. (不,这张桌子上没有触发器.)
当我单步执行代码时,我可以看到该字段的值已设置,并且在更新记录时没有错误,但在添加记录时它会以某种方式恢复为零.
我意识到我可以使用.Execute(strSQL)添加记录,但我想了解为什么ADO代码难以为此列设置值.
更有意思的是,当我回去并尝试更新现有记录上的userid列时,我得到了类似的结果.我设置了值,它恢复为零(或之前的任何值).
更新
现在这变得非常令人困惑……我在表中添加了另一个具有相同数据类型,长度等的列,突然代码按预期工作.我可以编辑新列和/或用户标识列中的值. (并独立编辑值)
但是当我删除测试列时,它会回到之前的行为,不允许我更改userid中的值. (为什么会这样?)
更进一步,我在本地MySQL实例上创建了表,因此我可以在它们访问数据库时分析ADO查询.这揭示了一些非常有趣的行为.以下两个语句由相同的ADO代码生成,但第二个语句将测试列添加到表中.
INSERT INTO `test`.`phplist_user_user_history`(`id`,`userid`,`ip`,`date`,`summary`,`detail`,`systeminfo`)
VALUES (DEFAULT,DEFAULT,'',_binary'2014-12-18 11:51:13','My Subject','New Details','IBLP automated syncronization process. Version 1.0')
INSERT INTO `test`.`phplist_user_user_history`(`id`,`userid`,`ip`,`date`,`summary`,`detail`,`systeminfo`,`testcol`)
VALUES (DEFAULT,456,'',_binary'2014-12-18 13:22:44','My Subject','New Details','IBLP automated syncronization process. Version 1.0',1)
注意第一个insert语句如何输入DEFAULT而不是我通过ADO传递的值.
第二个调用代码是相同的,只是它在testcol中设置了一个值.当有两个INT(11)列而不是一个时,为什么这会以不同的方式运行?
进一步的线索是当我在我的测试数据库中对表运行代码时,我在VBA中得到以下错误(即使我明确设置了userid值):
添加测试列后,错误随后会弹出测试列.在测试列上显式设置值后,.Update成功,并且两个字段都正确更新.
这可能是ODBC驱动程序中的错误吗?我使用最新的MySQL ODBC连接器驱动程序(5.3.4),以及以下连接字符串:
"Driver=MySQL ODBC 5.3 Unicode Driver;SERVER=myserver;UID=myuser;PWD={mysecretpwd};DATABASE=test;PORT=3306;DFLT_BIGINT_BIND_STR=1"
解决方法:
我能够使用64位版本的MySQL ODBC 5.3 Unicode驱动程序(5.03.04.00)重新创建您的问题.当表中的最后一列是TEXT类型时,它似乎是ADO Recordset更新的问题.我甚至没有关于userid的索引,我得到了相同的结果.
一种可能的解决方法是使用带参数的ADODB.Command来使用与此类似的代码执行插入:
Dim oConn As ADODB.Connection
Dim cmd As ADODB.Command
Set oConn = New ADODB.Connection
oConn.Open _
"Driver=MySQL ODBC 5.3 Unicode Driver;" & _
"SERVER=localhost;" & _
"UID=root;" & _
"PWD=whatever;" & _
"DATABASE=mydb;" & _
"PORT=3306;" & _
"DFLT_BIGINT_BIND_STR=1"
Set cmd = New ADODB.Command
cmd.ActiveConnection = oConn
cmd.CommandText = _
"INSERT INTO phplist_user_user_history " & _
"(`userid`, `ip`, `date`, `Summary`, `Detail`, `systeminfo`) " & _
"VALUES (?,?,?,?,?,?)"
cmd.Parameters.Append cmd.CreateParameter("?", adInteger, adParamInput, , 456)
cmd.Parameters.Append cmd.CreateParameter("?", adVarWChar, adParamInput, 255, "")
cmd.Parameters.Append cmd.CreateParameter("?", adDBTimeStamp, adParamInput, 255, Now)
cmd.Parameters.Append cmd.CreateParameter("?", adVarWChar, adParamInput, 255, "cHistory.Subject")
cmd.Parameters.Append cmd.CreateParameter("?", adLongVarWChar, adParamInput, 2147483647, "cHistory.Body")
cmd.Parameters.Append cmd.CreateParameter("?", adLongVarWChar, adParamInput, 2147483647, "Automated syncronization process.")
cmd.Execute
Set cmd = Nothing
oConn.Close
Set oConn = Nothing
我从Access 2010数据库测试它,它对我来说很好.
内容总结
以上是互联网集市为您收集整理的通过ADO创建/编辑记录时索引的MySQL字段不保存值全部内容,希望文章能够帮你解决通过ADO创建/编辑记录时索引的MySQL字段不保存值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。