求救!关于数据集的问题

zhangzs8896 2005-02-23 03:39:34
部分代码:
Dim MySqlStr As String
MySqlStr = "select * from mat" --mat中的字段opn为char(1)
MyRs.Open MySqlStr

MyRs.MoveFirst
Do While Not MyRs.EOF
MyRs("opn") = Opn(Trim(MyRs("Opn").Value))---这里会报错误
'错误为:多步操作产生错误,请检查每步的状态值
'我必须去更改mat中的字段为char(4)才会正确,但是实际应用中mat为视图,也不允许更改它的设置
'因为里面存的全是1个字符的
MyRs.MoveNext
Loop

---函数
Function Opn(ByVal a As String)
Select Case a
Case "E"
Opn = "0020"
End Select
Case "L"
Opn = "0030"
Case "V"
Opn = "0040"
End Select
End Function
...全文
175 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hspcyeling 2005-02-23
  • 打赏
  • 举报
回复
借地一用,谢谢
spread控件为什么我在我的部件里找不到啊?
zhangzs8896 2005-02-23
  • 打赏
  • 举报
回复
全部代码如下:
Sub MatTotal()
Dim MyCon As New ADODB.Connection
Dim MyRs As New ADODB.Recordset
Dim ConStr As String
'由于本机没连到Oracle,暂用同结构的Sql Server中的表替代
ConStr = "Provider=SQLOLEDB;Persist Security Info=False;User ID=sa;PassWord=zhangzs;DataBase=mytest"
On Error GoTo Error:
MyCon.ConnectionString = ConStr
MyCon.CommandTimeout = 0
MyCon.Open
MyRs.CursorLocation = adUseClient
MyRs.ActiveConnection = MyCon


MyRs.LockType = adLockBatchOptimistic
MyRs.CursorType = adOpenDynamic

Dim MySqlStr As String
MySqlStr = "select mo,material,weight, opn from mat"
MyRs.Open MySqlStr

MyRs.MoveFirst
Do While Not MyRs.EOF
' MyRs("Material") = Change(Trim(MyRs("Material").Value))
' MsgBox MyRs("opn").DefinedSize
MyRs("opn") = Opn(Trim(MyRs("Opn").Value)) '报错的地方
MyRs.MoveNext
Loop

Set DataGrid1.DataSource = MyRs
DataGrid1.Refresh
DataGrid1.Columns(2).Width = 700

Exit Sub
Error:
MsgBox Err.Description, vbOKOnly, "error"
End Sub

Function Opn(ByVal a As String)
Select Case a
Case "E"
Opn = "0020"
End Select
Case "L"
Opn = "0030"
Case "V"
Opn = "0040"
End Select
End Function
zhangzs8896 2005-02-23
  • 打赏
  • 举报
回复
还有
如果:
MySqlStr = "select mo,material,weight,cast(opn as char(4)) as opn from mat"
那么即使我更改opn字段长度,也会报这个错误!

晕死了,到底哪的事啊。
icedut 2005-02-23
  • 打赏
  • 举报
回复
我试了
不行
报了oledb错误
icedut 2005-02-23
  • 打赏
  • 举报
回复
是否是你的记录集直接动态帮定了数据库

MyRs("opn") = Opn(Trim(MyRs("Opn").Value))---这句话直接改称你的操作好了





zhangzs8896 2005-02-23
  • 打赏
  • 举报
回复
谢谢!
这个是返回4位的,我奇怪就奇怪在这个地方了
MySqlStr = "select mo,material,weight,cast(opn as char(4)) as opn from mat"

....

MyRs.MoveFirst
Do While Not MyRs.EOF
MsgBox MyRs("opn").DefinedSize '这里也返回4位了,可是错误依旧,问题在哪呢
MyRs("opn") = Opn(Trim(MyRs("Opn").Value))---这里会报错误
MyRs.MoveNext
Loop

icedut 2005-02-23
  • 打赏
  • 举报
回复
select datalength(cast(id as char(4))) from etamuser

我在自己系统里面测试,结果是4位阿,不过我没用vb测
icedut 2005-02-23
  • 打赏
  • 举报
回复
不管数据库是否不同
既然要防得别的地方,
把转换的结果直接放进去会很麻烦么
zhangzs8896 2005-02-23
  • 打赏
  • 举报
回复
因为属于不同的数据库,我这里是是简化了一些。
视图是oracle上的,应该转换后放到DB2上去的。
select cast(opn as char(4))...
试过了,不行,同样的错误。
icedut 2005-02-23
  • 打赏
  • 举报
回复
select * from mat


这句话里加一个转换行不
select cast(opn as char(4))...
icedut 2005-02-23
  • 打赏
  • 举报
回复
既然是转换就直接放到别的表里好了
为什么还要给MyRs复值
不理解
zhangzs8896 2005-02-23
  • 打赏
  • 举报
回复
Dim MySqlStr As String
MySqlStr = "select * from mat" --mat中的字段opn为char(1)
MyRs.Open MySqlStr

MyRs.MoveFirst
Do While Not MyRs.EOF
'也就是在这个地方改变一下MyRs("opn")的长度为4位?
MyRs("opn") = Opn(Trim(MyRs("Opn").Value))---这里会报错误
MyRs.MoveNext
Loop
zhangzs8896 2005-02-23
  • 打赏
  • 举报
回复
这个我知道是4位了啊,这里的函数是个转换而已,因为要放到别的表中去。
我从mat表得到MyRs后,那么MyRs中的各字段的长度应该是与mat中相应字段相同。
但是,我既不能更改字段的长度,还要必须实现这个功能。
问:有没有办法改变一下MyRs的字段长度?如果能,应该怎么改?
icedut 2005-02-23
  • 打赏
  • 举报
回复
Opn结果是4位
icedut 2005-02-23
  • 打赏
  • 举报
回复
MyRs("opn") = Opn(Trim(MyRs("Opn").Value))---

Opn(Trim(MyRs("Opn").Value))---是4位
icedut 2005-02-23
  • 打赏
  • 举报
回复
Opn = "0020"
就是4位了

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧