数据库技术讨论-------------------第一帖

tony_jian 2002-05-15 01:29:29
在学习数据库应用的过程里,很多问题其实不是真正的难题.只是缺少经验,有时甚至会因为这些小问题浪费很多时间和精力.希望大家能够把自己遇到的和解决的写出来.让别的程序员不用走那么多弯路.这张贴只是个开始.我会从最基本的开始.慢慢深入.

这张帖讨论的是:
ADO + ACCESS200 + DataGrid 的多条件查询操作.


实现功能:
在DataGrid里刷新显示查询结果.并支持直接对其中的数据进行编辑数据库即时更新.在打印按钮的Click事件里打印DataGrid中的数据.
...全文
60 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
孙小雄 2002-05-30
  • 打赏
  • 举报
回复
:)
WxmJun 2002-05-30
  • 打赏
  • 举报
回复
(上面言不达意.再来)
这里没有星级大将,但比星级大将气氛好多了.看来星级大将是有点架了的喔.

DATAGRID+ACCESS,或者说是ADODB.Recordset+ACCESS是有BUG的.
ACCESS数据源:
用ADODB.Recordset连接DATAGRID. (ADODB.Recordset取得数据后再赋于DATAGRID).当用ADODB.Connection删除了一些记录后,DATAGRID竟然不能实时反应,无论用ADODB.Recordset怎么Refresh,DATAGRIID依然存在这些记录.总要经过某操作(具体是什么也搞不懂,反正就是这里点一下或那里按一下)才会去掉.但如果在Refresh 前用了断点暂停.再Refresh .记录准会去掉.

用SQL SERVER数据源就不存在这些问题.
不知是不是ADODB.Recordset的BUG.
WxmJun 2002-05-30
  • 打赏
  • 举报
回复
这里没有星级大将,但比星级大将气氛好多了.

DATAGRID+ACCESS,或者说是ADODB.Recordset+ACCESS是有BUG的.
我试过用ACCESS数据源与SERVER数据源连接ADODB.Recordset,再用ADODB.Recordset连接DATAGRID. 当用ADODB.Connection删除了一些记录后,DATAGRID竟然不能实时反应,无论用ADODB.Recordset怎么Refresh,DATAGRIID就是存在这些记录.总要经过某操作(具体也搞不懂)才会去掉.但如果在Refresh 前用了断点暂停.再Refresh .记录准会去掉.
用SERVER就不存在这些问题.
不知是不是ADODB.Recordset的BUG.
胡楮智 2002-05-30
  • 打赏
  • 举报
回复
这张帖讨论的是:
ADO + ACCESS200 + DataGrid 的多条件查询操作.
呵呵,这里得毛病就出在 DataGrid上,
我想长时间使用vb做数据库得人一定不会再用DataGrid
一般会用flexgrid, 而且也应该比较痛恨帮定,
只有数据得非帮定才可以让人大展手脚。
嘿嘿,另外,帮定的处理占用资源也是大大的!!!!
孙小雄 2002-05-30
  • 打赏
  • 举报
回复
关于Access 路径问题 这个是建立系统的DSN

Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Private Const ODBC_ADD_SYS_DSN = 4
Private Declare Function SQLConfigDataSource Lib "odbccp32.dll" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

Public Function LoadDbSource2(StrDriver, StrAttributes As String) As Boolean
LoadDbSource2 = SQLConfigDataSource(0&, ODBC_ADD_SYS_DSN, StrDriver, StrAttributes)
End Function


Private Sub Command1_Click()
Dim StrAttributes As String
StrAttributes = "DSN=Access数据测试" & Chr(0) & "Desciption=动态加载ODBC示例" & Chr(0)
StrAttributes = StrAttributes & "Dbq=" & App.Path & "\1.mdb" & Chr(0) & "FIL=MS Access;" & Chr(0)
StrAttributes = StrAttributes & "MaxBufferSize=2048" & Chr(0) & "PageTimeout=5" & Chr(0)
Call LoadDbSource2("Microsoft Access Driver (*.mdb)", StrAttributes)
'点完按纽 去控制面班 里看odbc 的系统dsn 就有了 呵呵:)
End Sub
Private Sub Command2_Click()
connit = "DSN=Access数据测试" 'Uid=sss;Pwd=ss
conn.Open connit
'你在 c:\1.mdb
Mytable = "select * from users"
rs.Open Mytable, conn, 2, 2
Do While Not rs.EOF
List1.AddItem rs("name")
rs.MoveNext
Loop
rs.Close
conn.Close
End Sub

zcsone 2002-05-16
  • 打赏
  • 举报
回复
如何将查询出来的数据实现按某一个字段进行分组打印呢?谢谢!
tony_jian 2002-05-16
  • 打赏
  • 举报
回复
程序员们都来团结互助,共同提高!

这张帖讨论的是:
ADO + ACCESS200 + DataGrid 的多条件查询操作.

实现功能:
在DataGrid里刷新显示查询结果.并支持直接对其中的数据进行编辑数据库即时更新.在打印按钮的Click事件里打印DataGrid中的数据.

给出自己的一个模糊查询的例子 (最好where和like的条件有三个)
谢谢大家的参与!
tony_jian 2002-05-16
  • 打赏
  • 举报
回复
为了中国的程序员们团结互助,共同提高!
欢迎大家积极讨论,并帖出代码.

这张帖讨论的是:
ADO + ACCESS2000 + DataGrid 的多条件查询操作.

实现功能:
在DataGrid里刷新显示查询结果.并支持直接对其中的数据进行编辑数据库即时更新.在打印按钮的Click事件里打印DataGrid中的数据.

请贴出你的一个模糊查询的例子 (最好where和like的条件有三个)
谢谢参与!
sanjianxia 2002-05-15
  • 打赏
  • 举报
回复
关于打印刷新的问题
' 数据环境初始化
Private Sub DataEnvironment_Initialize()
DataEnv.Cnc_Unit.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\unit1.mdb;Persist Security Info=False;Jet OLEDB:Encrypt Database=True"
DataEnv.Cnc_Unit.Open
DataEnv.Cnt_User.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & App.Path & "\YH_user.mdb"
DataEnv.Cnt_User.Open
End Sub
'报表打印
Private Sub mnuFilePrintPreview_Click()
' 打印报表 < < 必须生成记录集> >
If DataEnv.rsCmd_unit.State = adStateOpen Then DataEnv.rsCmd_unit.Close
DataEnv.Commands("Cmd_unit").CommandText = "select " & TableName & ".* from " & TableName
DataEnv.Cmd_unit
DtaRpt_unit.Refresh
DtaRpt_unit.Show
end Sub


——————————

http://sanjianxia.myrice.com
--------------------------------------------------------------------------------
总发帖数: 158 | 来源: 重庆 | 注册日期: 2002-03-23 IP: 已记录


sanjianxia



本版版主 发表于 2002-05-15.09:58:19               
--------------------------------------------------------------------------------

DATAREPORT的DATASOURCE即可以是一个DataEnvironment,也可以是一个RECORDSET。
如果直接把它设为一个RECORDSET,报表控件中的DATAMEMBER就不用设置了,只要把DATAFIELD设成RECORDSET中相应的字段名称就可以了。
下面是我常用的方法,在DATAREPORT声明一个RECORDSET,建立一个RptPrin方法用于打印,它的输入参数包括一个STRING,该STRING就是报表的SQL语句,当然也可以输入其它报表中要用的变量,通过下面的方法对报表中的某一个控件进行写值
DataReport1.Sections("section2").Controls("label1").Caption=值(Textbox也可以),不过,在Section中是无法动态地增加或删除控件的。
记得在报表的Terminate事件中一定要关闭RECORDSET。
如果要做一个通用的报表,可以把DETAIL中的TEXTBOX的DATAFIELD统一设为FIELD1、FIELD2、FIELD3...,然后,在SQL语句中统一使用别名就可以了。

如:select id as field1,name as field2 ....
select cargo as field1,typr as field2...

具体代码如下:

Dim rsP As New ADODB.Recordset
Public Sub RptPrint(ByVal strSql As string,byval vsDate as date,byval veDate as Date)
On Error GoTo Handel
If rsP.State <> 0 Then rsP.Close
rsP.Open strSql, oConn, adOpenStatic, adLockOptimistic
Set Me.DataSource = rsP
Me.Sections("section2").Controls("lbldate").Caption = vsDate & "至" & veDate
Me.Show 1
Exit Sub
Handel:
If rsP.State <> adStateClosed Then rsP.Close
Set rsP = Nothing
MsgBox Err.Description
End Sub

Private Sub DataReport_Terminate()
If rsP.State <> adStateClosed Then rsP.Close
Set rsP = Nothing
End Sub


——————————

http://sanjianxia.myrice.com

simaomeiqiong 2002-05-15
  • 打赏
  • 举报
回复
我支持你,真是造福于民呀!

tony_jian 2002-05-15
  • 打赏
  • 举报
回复
to:naomi77(naomi77)
我上面贴出的例子可以回答你的两个问题
naomi77 2002-05-15
  • 打赏
  • 举报
回复
这儿人气很旺,我想问一个问题!
'引用microsoft activex data objects 2.5 library
'添加部件Microsoft Hierarhicial Flexgrid control 6.0
Dim cnn1 As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cnnstr As String
Private Sub Command1_Click()
cnnstr = " provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\40db2.mdb;"
cnn1.Open cnnstr
With rst
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open "select * from 表1", cnnstr
End With
Set Form1.MSHFlexGrid1.DataSource = rst
rst.Close
cnn1.Close
End Sub
以上代码能显示数据库,但如果我把部件MSHFlexGrid1换成DataGrid1就不行,是怎么回事?另外,app.path怎么用?
tony_jian 2002-05-15
  • 打赏
  • 举报
回复
to:kofkim(小金)
你说的独到不是贬意词吧^v^呵呵.好像你也发过很多数据库的贴子,贴点经验出来大家共享吧.
kofkim 2002-05-15
  • 打赏
  • 举报
回复
呵呵~看来你确实有独到的一面~标记收藏
tony_jian 2002-05-15
  • 打赏
  • 举报
回复
各位能否给出自己的一个模糊查询的例子 (最好where和like的条件有三个)
golden24kcn 2002-05-15
  • 打赏
  • 举报
回复
其实对于常规的使用datagrid没有什么不好,而msflexgrid看起来外观不错,还可以加上图片,不过,要填充数据(500条以上)明显比datagrid的绑定使用慢很多,如果你用的是access数据库那么一次填充百条以上的数据定让你感觉十分不爽,不说也要秒钟,它们各有所长!
tony_jian 2002-05-15
  • 打赏
  • 举报
回复
to:hahahahahaha(哈,哈哈,哈哈哈...)
因为我们要讨论的是VB对数据库的操作
Hahahahahaha 2002-05-15
  • 打赏
  • 举报
回复
数据库技术讨论怎么不到数据库版??

哈,哈哈,哈哈哈......
yuanquana 2002-05-15
  • 打赏
  • 举报
回复
我才开始用VB时都是使用datagrid控件,但后来发现确实毛病太多,我发现多数程序员会使用MSflexgrid控件,这样加然没有了数据绑定功能,但其实格式上更加灵活。至于多条件查询,很容易实现。用datagrid绑定ADO控件以后,datagrid就可以看成是一个记录集对象,用recordset.open语句,只要加上不同的条件查询很容易实现。
tony_jian 2002-05-15
  • 打赏
  • 举报
回复
to:no_com(探花)
ADO+DataGrid是刚开始学的时候很多书都介绍的组合.
我个人认为动态的显示数据库比用ADODC绑定好.


to: lightninglu(小陆初学者)
我认为在触发查询操作的时候可以先清空DataGrid,打印当然是连表格一起打印.你那么处理的话更繁琐.

下面是一个显示数据库记录的例子:
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\database\123.mdb;Jet OLEDB:Database Password=password;Persist Security Info=False"
With rs
If .State = adStateOpen Then
.Close
End If
.ActiveConnection = cn
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockBatchOptimistic
.Source = "select 用户名,是否为管理员 from USER"
.Open
End With
Set DataGrid1.DataSource = rs

下面的处理可以用于显示Boolean型的值
DataGrid1.Columns("是否为管理员").NumberFormat = "否;是"

谢谢大家,请继续!(建议大家贴出的代码都是针对某一个功能的,怕人家看的眼花^v^)
加载更多回复(6)

1,217

社区成员

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

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