vb,如何向access数据库读写用户定义类型的数据?

比如我的用户类型为:
Public Type 联系信息类型
姓名 As String
手机 As String
公司电话 As String
End Type

dim 联系方式0 as 联系信息类型
再对 联系方式0 赋值

然后我在access数据库中的 表1 中添加了一个字段:联系方式,现在的问题是:
1. 这个 联系方式 字段该设置为何种数据类型?
2. 我如何将 联系方式0 写入 access数据库中的 联系方式0?
3. 写入了又该如何读出来呢?

备注:我用的是adodb连接的数据库

请各位高手帮帮忙,问题解决后定会追加分数,谢谢各位!

1、可设置为备注字段
2、写入数据库前把 联系方式0 用某种定界符(比如||)合并为一个长字符串:
s = 联系方式0.姓名 & "||" & 联系方式0.手机 & "||" & 联系方式0.公司电话
然后把s存入数据库即可
3、从数据库读出上述字符串后,根据定界符分解后分别赋值给用户定义类型的各个元素即可:
s = rs("联系方式0")
dim ss() as string
ss=split(s,"||")
联系方式0.姓名=ss(0)
联系方式0.手机=ss(1)
联系方式0.公司电话=ss(2)追问

这种方法固然可行,可我想要这一个字段存储多条数据,如果用这种方法怕是影响运行速度。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-09
Private mycon As New ADODB.Connection
Private myrecordset As New ADODB.Recordset
Dim Constring As String, Recstring As String
Dim n As Integer
Dim flag As Boolean

Private Sub Combo1_Click()
If Combo1.Text <> "" Then
If InStr(Combo1.Text, "、") = 0 Then
Call myFind(Combo1.Text)
Else
myFind Mid(Combo1.Text, InStr(Combo1.Text, "、") + 1, Len(Combo1.Text))
End If
If myrecordset.EOF Then
MsgBox "没有相匹配的标题!", vbOKOnl + vbCritical, "提示"
myrecordset.MoveLast
Else
Text1.Text = myrecordset.Fields(2)
Text2.Text = myrecordset.Fields(0)
Combo1.Text = myrecordset.Fields(1)
End If
Else
MsgBox "编号或标题不能同时为空!", vbOKOnl + vbCritical, "提示"
End If
End Sub

Private Sub Command1_Click()
If Combo1.Text <> "" Then
If InStr(Combo1.Text, "、") = 0 Then
Call myFind(Combo1.Text)
Else
myFind Mid(Combo1.Text, InStr(Combo1.Text, "、") + 1, Len(Combo1.Text))
End If
If myrecordset.EOF Then
MsgBox "没有相匹配的标题!", vbOKOnl + vbCritical, "提示"
Combo1.Text = ""
myrecordset.MoveLast
Text1.Text = myrecordset.Fields(2)
Text2.Text = myrecordset.Fields(0)
Combo1.Text = myrecordset.Fields(1)
Else
Text1.Text = myrecordset.Fields(2)
Text2.Text = myrecordset.Fields(0)
Combo1.Text = myrecordset.Fields(1)
End If
Else
MsgBox "编号或标题不能同时为空!", vbOKOnl + vbCritical, "提示"
End If
End Sub

Private Sub Command2_Click()
myrecordset.MovePrevious
If Not myrecordset.BOF Then
Text1.Text = myrecordset.Fields(2)
Text2.Text = myrecordset.Fields(0)
Combo1.Text = myrecordset.Fields(1)
Else
myrecordset.MoveFirst
Text1.Text = myrecordset.Fields(2)
Text2.Text = myrecordset.Fields(0)
Combo1.Text = myrecordset.Fields(1)
MsgBox "已经是第一条记录", vbOKOnly, "提示"
End If
End Sub

Private Sub Command3_Click()
myrecordset.MoveNext
If Not myrecordset.EOF Then
Text1.Text = myrecordset.Fields(2)
Text2.Text = myrecordset.Fields(0)
Combo1.Text = myrecordset.Fields(1)
Else
myrecordset.MoveLast
Text1.Text = myrecordset.Fields(2)
Text2.Text = myrecordset.Fields(0)
Combo1.Text = myrecordset.Fields(1)
MsgBox "已经是最后一条记录", vbOKOnly, "提示"
End If
End Sub

Private Sub Command4_Click()
myrecordset.AddNew
Text1.Text = ""
n = n + 1
Text2.Text = n
Combo1.Text = ""
Combo1.SetFocus
End Sub

Private Sub Command5_Click()
myrecordset.Fields(0) = Int(Text2.Text)
myrecordset.Fields(1) = Combo1.Text
myrecordset.Fields(2) = Text1.Text
myrecordset.Update
Combo1.AddItem n & "、" & Combo1.Text
MsgBox "记录写入成功!", vbOKOnly, "提示"
End Sub

Private Sub Command6_Click()
Dim i As Integer
i = MsgBox("确定删除当前记录", vbYesNo + vbQuestion, "提示")
If i = vbYes Then
myrecordset.Delete
n = 0
myrecordset.MoveFirst
Do While Not myrecordset.EOF
n = n + 1
myrecordset.Fields(0).Value = n
myrecordset.Update
Combo1.AddItem n & "、" & myrecordset.Fields(1)
myrecordset.MoveNext
Loop
Combo1.RemoveItem n
myrecordset.MoveFirst
Text1.Text = myrecordset.Fields(2).Value
Text2.Text = myrecordset.Fields(0).Value
Combo1.Text = myrecordset.Fields(1).Value
End If
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyZ And Shift = vbAltMask Then
Command4.Enabled = Not Command4.Enabled
Command5.Enabled = Not Command5.Enabled
Command6.Enabled = Not Command6.Enabled
flag = Not flag
End If
End Sub

Private Sub Form_Load()
Show
Constring = "Driver={Microsoft Access Driver (*.mdb)};Dbq= " + App.Path + "\病例模板集.mdb" + ";persist security info=false;"
Set mycon = New ADODB.Connection
mycon.ConnectionString = Constring
mycon.Open
Set myrecordset = New ADODB.Recordset
myrecordset.Open "病例", mycon, adOpenDynamic, adLockPessimistic, adCmdTable
n = 0
myrecordset.MoveFirst
Do While Not myrecordset.EOF
n = n + 1
Combo1.AddItem n & "、" & myrecordset.Fields(1)
myrecordset.MoveNext
Loop
myrecordset.MoveFirst
Text1.Text = myrecordset.Fields(2).Value
Text2.Text = myrecordset.Fields(0).Value
Combo1.Text = myrecordset.Fields(1).Value
Command4.Enabled = False
Command5.Enabled = False
Command6.Enabled = False
flag = False
End Sub

Private Sub myFind(ByVal filValue As String)
myrecordset.MoveFirst
Do While Not myrecordset.EOF
If myrecordset.Fields(1).Value = filValue Then
Exit Do
Else
myrecordset.MoveNext
End If
Loop
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
If flag = False Then
KeyAscii = 0
End If
End Sub
这是我以前写的,你拿去参考下吧
没有注解可能看懂不容易追问

我想问下你的这段程序中哪里涉及到用户定义类型的数据了?

追答

用户定义类型自己定义一个不就行了
Public Type 联系信息类型
姓名 As String
手机 As String
公司电话 As String
End Type
然后将之定义数据类型的姓名、手机、公司电话与Access数据段的姓名、手机、公司电话对应
我这是用的ADO对象操作ACCSSS数据库,没用ADO控件

追问

你说的方法我都知道,我不想一个一个的对应,我想要一个字段解决问题,不知能否解决?

第2个回答  2011-11-11
你想一个字段多存几种不同类型的东西;这首先是违法数据库基本原则:数据库的字段的数据必须是原子,不可分的。这样才能方便的查询和检索。
其次节省了空间就会浪费处理时间。这对硬件发展速度超过软件应用能力的现实是完全的倒行逆施。我们现在编程的思想更应该是节省了时间浪费了空间?你的明白?

姓名 As String 字段a
手机 As String 字段b
公司电话 As String 字段c
不要把他们合成一个字段,自讨苦吃。合成一个字段的恶果:代码复杂可读性差程序运行缓慢。追问

你说的对,我的明白。不过我还有个问题想请教下:
如果一条记录中对应多个姓名呢?比如说:
我的数据库是关于供应商信息管理的,在一个 供应商代码 下对应多个联系人及相关联系方式,我该怎么安排字段呢?可以把 数组 放到字段中吗?还是必须用分隔符把多条数据隔开,读的时候再拆分?

追答

需要建立一个企业联系人表
字段为:企业id 、 联系人ID
查询某企业联系人信息的sql (假设企业ID为xxx)
select * from 联系人表 where 联系人ID in (select 联系人ID from 企业联系人表
where 企业id=‘xxx’ )

追问

这个方法确实不错,不过不行啊,查不到记录。
能否帮忙修改一下,谢谢啦。
还有一个问题想顺便问下:我如何把这种查询到的记录赋给MSHflexGrid控件显示出来?要保证数据是一一对应的。

追答

'名称 sub_InitFlg
'作者   morn Woo
'功能 通用表格列标题加载过程
'参数 sTableName 数据源(表或视图); oFlg 需要设定的表格对象,inoneedcol 不需要显示的列数
Sub sub_InitFlg(ByVal sTablename As String, oFlg As Object, Optional ByVal sNoNeedField = "", Optional ByVal iNeedCaption = 0)
Dim oRd As New ADODB.Recordset
Dim iA, iB
Dim sA
Dim frm As Form

If InStr(1, LCase(sTablename), "select") < 1 Then sA = " select * from " & sTablename Else sA = sTablename

oRd.Open sA, goConnect.dbConObj
With oFlg
.Clear
.Rows = 2
.cols = oRd.Fields.Count + 2
.ColWidth(0) = 200
.ColWidth(1) = 0
.FixedCols = 3
iB = 0
If sNoNeedField = "" Then

For iA = 2 To oRd.Fields.Count + 1
iB = iA - 2
If iNeedCaption Then
sA = goConnect.fun_ReturnValueNew("select ccaption from tablefieldinfo where upper(tablename)='" & UCase(sTablename) & "' and upper(cfieldname)='" & UCase(oRd.Fields(iB).Name) & "'")
Else
sA = oRd.Fields(iA - 2).Name
End If
.TextMatrix(0, iA) = sA
.ColWidth(iA) = frmSysMain.picLeft.TextWidth(sA) + 100
Select Case oRd.Fields(iB).Type
Case adDecimal, adDouble, adInteger, adNumeric, adSingle, adSmallInt, adTinyInt, adUnsignedBigInt, adUnsignedInt, adUnsignedSmallInt, adUnsignedTinyInt
.ColAlignment(iA) = flexAlignRightCenter
Case Else
.ColAlignment(iA) = flexAlignLeftCenter
End Select
Next
Else

End If
End With
oRd.Close
Set oRd = Nothing

End Sub

本回答被提问者采纳
第3个回答  2011-11-10
你想的方法实现不了!~ 你怎么做都是一个对应一个 即使把几个东西放在一个字段里,还是需要你在程序里给打开,与其这么麻烦还不如一个字段就是一个字段 然后写一个函数给你这个自定义类型赋值追问

我是这么想的,既然可以将用户定义类型的数据写到文本文件中,那么应该也可以写到access中吧?

追答

文本中 是随便写东西的!~
你写道ACCESS中 ACCESS用什么类型接收呢?
我是不知道可以接受这种的类型!~

第4个回答  2011-11-11
这个问题的实质是: CopyMemory 自定义数据类型。
对于自定义数据类型含有字符型数据的,目前无法解决。
你可以网上搜索,结果同上。

怎么用VB来对ACCESS数据库读写,我想把表直接显示出来.
先插入一个模块,在模块里写代码 Public cn As ADODB.Connection Sub con()Set cn = New ADODB.Connection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\\数据库名.扩展名;Persist Security Info=False"(在一行里)End Sub 在窗体里写代码 call con...

怎样通过VB程序联接ACCESE数据库
要通过VB程序联接Access数据库,可以使用ADO(ActiveX Data Objects)或Data控件。首先,利用ADO或Data控件建立与Access数据库的连接。随后,通过ADO或Data控件将Access中的数据绑定到程序中相应的位置。ADO,即ActiveX Data Objects,是Microsoft提供的一种数据库访问组件。通过ADO对象,可以执行SQL查询、更新数...

VB编程如何实现ACCESS数据库记录的查询?
要查询数据库中的记录,首先需要创建一个连接对象,并使用其执行SQL查询语句。具体步骤如下:创建ADO连接对象并建立与数据库的连接。 创建一个命令对象,并设置其类型为“查询”。 在命令对象中编写SQL查询语句,例如:`"SELECT * FROM Students WHERE Age = '99'"`。 执行命令对象,并获取...

怎样用VB调用ACCESS中建立好的数据库中的数据?
首先你需要在部件中把这两个部件添加到工具栏中并将他们拖到窗口中 上面那个是VB连接数据库的必要的一个部件,我说一下大致的步骤吧 1.先把上面第一个部件拖到Frm1上,接着新建一个模块并输入下面这串代码 红色框内是你的数据库名称 打完之后先保存模块才能生效 2.在当前Frm1里面建几个text分别显...

关于VB查询ACCESS数据库的问题
定义ADODB.Recordset对象:Public rs As New ADODB.Recordset 接下来,使用Open方法打开查询。这里,我们查询数据库中的wjy字段,相应的SQL语句为"select wjy from zm"。确保连接参数正确赋值至conn变量。Open "select wjy from zm" ,conn 在查询完成后,检查结果集是否未到达尾部(EOF属性为False)。如果...

vb中如何调用Access数据表中的某一个记?
1. 首先,确保在项目中添加ADO控件。在“工程”菜单下的“部件…”选项中,选择并添加Microsoft ActiveX Data Objects 2.5 到工具箱。2. 将ADO控件拖至窗体,然后在代码编辑器中编写代码,通过ADO对象连接Access数据库。例如: `Dim con As ADODB.Connection`,`con.Open "Provider=Microsoft.Jet....

vb读写access数据库
nConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=111.mdb;Persist Security Info=False"nRs.Open "Select * form 表1 Teachers where ID=1", nConn, 3, 3 '读数据 Text1.Text = nRs("aaa").Value '修改数据 nRs("aaa").Value = "修改的数据"nRs.Update nRs.Close Set nRs...

怎么用VB读取ACCESS表中的某个值
rs.Open sql,conn,adOpenKeyset,adLockOptimistic If rs.EOF = True Then MsgBox "该同学不存在", , "提示"Else If rs.Fields(1) = Combo2.Text Then text.text = rs.Fields(2)Else MsgBox "科目错误", , "警告"Text2.Text = ""Text2.SetFocus End If rs就定义为第一句中那张表,rs...

VB如何往ACCESS的表中写入数据?
1、声明:Private conn As ADODB.Connection (连接数据库的ADO的Connecet 对象)Private Public strconn as string (连接字符串)Dim strSQLcmd AS String (SQL命令字符串)2、赋值 strconn= "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + App.Path + "\\XX.mdb; "SQL语句分两种情况:...

用VB调用到Access,如何读到表中的任意各单元的数据
这个我感觉没必要循环。如果你的表里的字段是固定的话,列的问题很好解决的,你想选择哪一列只要查询那个字段就可以了。至于列,我的想法是添加一个字段,类型为自动编号,这样的话,想选第几列只要这个字段的记录为几就可以了(比如你表里的ID号,但这样就不能删除记录,否则就不准了)。我水平有限...

相似回答