Access编程交流网
  • 设为首页|收藏本站|繁体中文|手机版
  •     
  • Access培训-Access开发平台-Access行业开发

  • 首页
  • 资讯
  • 技巧
  • 源码
  • 行业
  • 资源
  • 活动
  • 关于

技巧

ACCESS数据库

启动/设置/选项/背景

修复/压缩

安全/加密/解密

快捷键

版本升级/其它等

数据表

命名方式/设计规范

表设计

查询

Sql语言基础

选择查询

更新查询

删除查询

追加查询

生成表查询

交叉表查询

SQL特定查询

查询参数

查询综合应用

界面/窗体/控件

标签

文本框

命令按钮

组合框/列表框

选项组/复选框/选项按钮

选项卡

子窗体

窗体本身/综合应用

其它

报表打印

报表设计

高级报表

模块/函数/VBA/API/系统

VBA基础

内置函数

调试/跟踪/Debug

模块/类模块

API/COM/系统相关

字符数字日期

网络通信游戏

加密解密安全

文件处理

经典算法

宏/菜单/工具栏/功能区

宏/脚本

菜单/工具栏

功能区/Ribbon

图表/图形/图像/多媒体

图表

图形/图像

音频

视频/动画

DAO/链接表/ADO/ADP

DAO/链接表/ODBC

ADO/RDO

ADP

ActiveX/第三方控件/插件

Treeview树控件

ListView列表控件

Toolbar工具栏控件

微软其它控件

Dbi-Tech

CodeJock

Grid++Report

FastReport

ComponentOne

加载项/插件/Addin

OFFICE集成/导入导出/交互

Excel导入导出/交互

Word导入导出/交互

PPT交互

Outlook控制/邮件

Text文本文件/INI/CSV

PDF/SWF/XML格式

CAD格式

Sharepoint/其它Office

SqlServer/其它数据库

表

视图

存储过程/触发器

函数

用户/权限/安全

调试/维护

SqlServer其它/综合

发布/打包/文档/帮助

开发版/运行时

打包/发布/部署

开发文档/帮助制作

Access完整行业系统

采购管理系统

销售管理系统

仓库管理系统

人力资源管理HRM

CRM管理系统

MRP/ERP管理系统

BRP/流程优化

其它管理系统

心得/经验/绝招
其它/杂项
Excel技巧

Excel应用与操作

Excel开发编程

Word技巧

Word应用与操作

Word开发编程

Outlook技巧

Outlook应用与操作

Outlook开发编程

热门文章

  • ADO直接读Excel的数..
  • DAO基础(3)
  • 用代码创建mdb格式的Ac..
  • null值在SQL 语句和..
  • DAO与ADO创建索引时一..
  • SQL语句集锦1

最新文章

  • 实验报告 --DAO与AD..
  • 用代码创建mdb格式的Ac..
  • 连接后台数据库提示 无法启..
  • 64位windows系统如..
  • Access的DAO准确获..
  • 利用代码自动创建ODBC源

联系方式

Access交流网(免费Access交流)

QQ:18449932 

网  址:www.access-cn.com

当前位置:首页 > 技巧 > DAO/链接表/ADO/ADP
DAO/链接表/ADO/ADP

Access中MDB转ADP最先遇到的问题以及解决方法



引言:

 
《没用过access+SQL2000的,跟我来搞!前辈们都来帮忙啊(之五) 》

 

以下文章是一个有经验的 MDB 老手从 MDB 编程转向 ADP 编程最先遇到的几个问题以及解决方案。供各位初试 ADP 的网友参考:

首先,非常感谢各位前辈,对小弟的指导,并请各位前辈继续支持小弟!! 

本人用Access已近2年,但从来没有用过 SQL ,从现在起准备学习 SQL+access 
昨天已经安装并建立了SQL服务器,并将一些试验用的表导入了SQL,然后创建了ADP的 
access项目,现在碰到如下问题: 
--------- 以下问题已经通过各位前辈的指导解决,请各位新手参考  ------------ 

 


问题:

  1、原来的查询都找不到了,听说要用Create View创建,现在我直接在access里面手动 
“新建”了几个视图和存储过程,打开来后和原来的查询差不多,暂时先溜过去吧。

 

2、根据表,新建了几个窗体,准备进去乱输入点东西,但是发现无法添加新纪录。

3、原来的“自动编号”数据类型在sql里面是否存在,我应该怎么进行数据类型的转 
换(主要是转换成哪钟数据类型?),我将其转换为 timestamp 是否正确? 
我将 timestamp 作为主键,被证明是错误的,不能这样做。

4、我在创建存储过程的时候才知道,原来sql里面是不能调用我原来编写在“模块”里面 
的自定义函数的,只能在 SQL 里面用CREATE FUNCTION 创建,晕阿,难道这些东西全都要 
更改吗?工程太浩大了!请各位高手指点。

5、原来的查询可以通过 docmd.OpenQuery打开,现在哪?

6、原来的查询可以通过 QueryName.SQL = "select * from QueryName" 进行修改 sql 
语句,现在哪?

7、顺便问一下,在DAO中用currentdb.openrecordset,在ADO中有否类似语句? 
每次都像这样 

8、原来可以通过以下代码(DAO)建立一个新的空mdb文件,现在用ADO怎么做? 

      Dim wspDefault As dao.Workspace, DBS As dao.Database 
      Set wspDefault = DBEngine.Workspaces(0) 
      Set DBS = wspDefault.CreateDatabase("c:\a.mdb", & _ 
            dbLangChineseSimplified, dbVersion40) 
      Set DBS = Nothing 

 

9、用ADO备份整个数据库该怎么做,包括备份所有的表和存储过程,虽然SQL本身就有这样的功能,但我需要在数据库里面操作,有没有这样的代码? 

10、我用一下代码更新视图的源代码,却出现“对象或提供者不能执行所需的操作。” 
下面的代码演示如何使用 Command 属性更新视图的文本。
 

 

Sub ViewText() 

 

  Dim cnn As New ADODB.Connection 
  Dim cat As New ADOX.Catalog 
  Dim cmd As New ADODB.Command 

  ' Open the Connection 
  cnn.Open _ 
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
    "Data Source=c:\Program Files\Microsoft Office\" & _ 
    "Office\Samples\Northwind.mdb;" 

  ' Open the catalog 
  Set cat.ActiveConnection = cnn 

  ' Get the command 
  Set cmd = cat.Views("AllCustomers").Command 

  ' Update the CommandText of the Command 
  cmd.CommandText = _ 
    "Select CustomerId, CompanyName, ContactName From Customers" 

  ' Update the View 
  Set cat.Views("AllCustomers").Command. = cmd 

End Sub 


 

请问为什么?虽然我知道这个问题涉及的方面可能很多,但还是请高手指点 

11、可以用 access 做前台,sqlserver做后台进行开发吗?如何开发比较好?

 

 


回答:
 

 

 

1、可用Create View

2、这里的解决办法是要为数据源的表定义主键,SQL Server表更新时要设置主键或主索引(或称唯一索引),否则无法在access调用时更新数据
能否这样理解,如果没有唯一索引, SQL 语句根本无从判定用 SQL 语句操作哪条数据
您的理解是正确的!在ADP中,如果您创建的表格中没有唯一索引/主键,您的表格将无法进行插入,删除或者更新的操作。
原因就是access所使用的Jet引擎无法判定SQL语句操作的是哪条语句。具体的描述这个问题文档如下:
235267 ACC2000: Table in a Microsoft access Project Cannot Be Updated

http://support.microsoft.com/?id=235267
另外,当您尝试更新某一条记录的时候,您也会在整个access 窗体的左下角状态栏中看到"The Recordset is not Updateable"的信息。产生这个问题的原因是一样的:
304179 ACC2000: Status Bar Displays "Recordset Not Updateable" Message When You

http://support.microsoft.com/?id=304179
综上,解决问题的办法是为ADP中的Table加上唯一索引,或者直接加上主键来标示每一个记录。

3、将数据类型更改为int,然后在识别栏打勾,识别种子设定为 1 ,识 
别递增量设定为 1 即可。

4、谢谢各位高手的指点,虽然只有3个字(ADO)但对我帮助良多,现在 
我正在查看有关 ADO 和 ADOX 的帮助,并且适应新的编程方法,原来用的是DAO编程,看来 
现在要全部改过来才行了,顺便问一下,在DAO中用currentdb.openrecordset,在ADO中有否类似语句?

5、Execute 方法

6、使用以下过程 

Sub ProcedureText() 

 

  Dim cnn As New ADODB.Connection 
  Dim cat As New ADOX.Catalog 
  Dim cmd As New ADODB.Command 

  ' Open the Connection 
  cnn.Open _ 
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
    "Data Source=c:\Program Files\Microsoft Office\" & _ 
    "Office\Samples\Northwind.mdb;" 

  ' Open the catalog 
  Set cat.ActiveConnection = cnn 

  ' Get the Command 
  Set cmd = cat.Procedures("CustomerById").Command 

  ' Update the CommandText 
  cmd.CommandText = "Select CustomerId, CompanyName, ContactName " & _ 
    "From Customers " & _ 
    "Where CustomerId = [CustId]" 

  ' Update the Procedure 
  Set cat.Procedures("CustomerById").Command = cmd 

End Sub 


 

7、用以下代码


  Dim tbl As ADODB.Recordset, cn As ADODB.Connection 
  Set cn = CurrentProject.Connection 
  Set tbl = New ADODB.Recordset 
  tbl.ActiveConnection = cn 
  tbl.Open "TableName", cn, , adLockPessimistic, adCmdTable 

 

8、呵呵,ADO爆简单,代码如下: 

Sub CreateDatabase() 

 

  Dim cat As New ADOX.Catalog 
  cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\new.mdb" 

End Sub 



当然,你必须先在引用里面选中"Microsoft ADO Ext. X.X for DDL and Security" 

 

9、只完成了一部分,代码如下 

Private Sub 导出_Click() 
On Error GoTo Err_导出_click 
    Dim hShell As Long 
    Dim hProc As Long 
    Dim lExit As Long 
     
  Dim DirName1(3) As String 
  Dim FoundName1 As String 
  DirName1(1) = DBAppPath(1) & "\" & "winrar.exe" 
  DirName1(2) = DBAppPath(2) 
  FoundName1 = Dir(DirName1(1), vbNormal) 
  If FoundName1 = "" Then DirName1(0) = "Winrar文件未找到" & Chr(13) 
  FoundName1 = "" 
  FoundName1 = Dir(DirName1(2), vbDirectory) 
  If FoundName1 = "" Or FoundName1 = "." Then DirName1(0) = DirName1(0) & "compress 目录未建立" & Chr(13) & "请重新设定各项系统参数。" 
   
  If DirName1(0) <> "" Then 
    MsgBox "系统参数设置未完成:" & Chr(13) & DirName1(0) & Chr(13) & "请先进行参数设置!" 
    Exit Sub 
  End If 
     
    If (MsgBox("现在请先在软盘上做好标签,写上日期。" & Chr(13) & "如果您是要将数据备份至软盘,那么" & Chr(13) & "请确保以下位置:" & Chr(9) & DBAppPath(8) & Chr(9) & "没有您所需要的数据" & Chr(13) & "因为备份程序将清空其中所有文件及目录。" + Chr(13) + Chr(13) + Chr(13) + "  请确认现在是否执行导出操作?", 4, "是否开始导出...") = 6) Then 
    Else 
      Exit Sub 
    End If 
      Dim DirName As String, FoundName As String 
      DirName = DBAppPath(2) & "\" & DBAppPath(10) 
      FoundName = Dir(DirName, vbNormal) 
      If FoundName = "" Then 
      Else 
        MsgBox "现已检测到文件 " & DBAppPath(2) & "\" & DBAppPath(10) & "现在删除。可能您上次未成功,请检察!" 
        Kill DBAppPath(2) & "\" & DBAppPath(10) 
      End If 
       
      Dim fileName As String, CallShellText 
      Dim Cat As New ADOX.Catalog 
      Cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBAppPath(2) & "\" & DBAppPath(10) 

 

'-------------------------------------------- 
      Dim TDF As ADOX.Table, CN As ADODB.Connection 
      Set CN = CurrentProject.Connection 
      Set Cat.ActiveConnection = CN 
       
      For Each TDF In Cat.Tables 
        'Debug.Print TDF.Type & "--------" & TDF.Name 
        If TDF.Type = "Table" Then 
          'Debug.Print TDF.Type & "--------" & TDF.Name 
          DoCmd.TransferDatabase acExport, "microsoft access", DBAppPath(2) & "\" & DBAppPath(10), acTable, TDF.Name, TDF.Name, False 
        End If 
      Next TDF 
      '注意Application.CurrentProject.Path 的用法 
      Dim BackupToFile As String 
      '以下一段主要是判定输出的驱动器是何种类型,以便用不同的命令行来生成压缩包, 
      '写下面一段的原因,主要是因为将数据库以多卷压缩的形式输出到硬盘上行不通,因为如果硬盘上已经存在一个 
      '压缩包,那么WinRAR就无法对这个压缩包进行更新 
      Dim fs, d, t 
      Set fs = CreateObject("Scripting.FileSystemObject") 
      Set d = fs.GetDrive(fs.getdrivename(DBAppPath(2))) 
      Select Case d.DriveType 
        Case 0 
          t = "Unknown" 
        Case 1 
          t = "Removable" 
          BackupToFile = Chr(34) & DBAppPath(1) & "\winrar.exe" & Chr(34) & " m -vf -vd -vn " & Chr(34) & DBAppPath(8) & "\" & DBAppPath(9) & Chr(34) & " " & Chr(34) & DBAppPath(2) & "\" & DBAppPath(10) & Chr(34) 
        Case 2 
          t = "Fixed" 
          BackupToFile = Chr(34) & DBAppPath(1) & "\winrar.exe" & Chr(34) & " m " & Chr(34) & DBAppPath(8) & "\" & DBAppPath(9) & Chr(34) & " " & Chr(34) & DBAppPath(2) & "\" & DBAppPath(10) & Chr(34) 
        Case 3 
          t = "Network" 
          BackupToFile = Chr(34) & DBAppPath(1) & "\winrar.exe" & Chr(34) & " m " & Chr(34) & DBAppPath(8) & "\" & DBAppPath(9) & Chr(34) & " " & Chr(34) & DBAppPath(2) & "\" & DBAppPath(10) & Chr(34) 
        Case 4 
          t = "CD-ROM" 
        Case 5 
          t = "RAM Disk" 
      End Select 
       
      'BackupToFile = Chr(34) & dbapppath(1) & "\winrar.exe" & Chr(34) & " m -v1300 -vd -vn " & Chr(34) & dbapppath(8) & "\" & dbapppath(9) & Chr(34) & " " & Chr(34) & dbapppath(2) & "\" & dbapppath(10) & Chr(34) 
      hShell = Shell(BackupToFile, 1) 

  hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, hShell) 
  If hShell = 0 Then MsgBox "程序执行失败" 

  Do 
    GetExitCodeProcess hProc, lExit 
    DoEvents 
  Loop While lExit = STILL_ACTIVE 

  MsgBox "导出已经完成,请检查磁盘" 
     
Exit_导出_click: 
  Exit Sub 
   
Err_导出_click: 
  MsgBox Err.Description 
  Resume Exit_导出_click 
     
End Sub 


 

10、这是仅仅是因为现在后台是SQLSERVER,而不再是MDB了,关于如何修改View中的SQL文本,请到SQLSERVER的Books Online中查阅关键字:ALTER VIEW。

11、可以,用access做前台,sqlserver做后台开发,开发方式有好几种:
adp+sqlserver:使用access项目+sqlserver进行开发,可以直接操作table,procedure等,但是所有的存储过程、视图、自定义函数、触发器都是t-sql的。
mdb(link table)+sqlserver:使用链接表,链接sqlserver进行开发,你可以最大限度的保留先前基于mdb的程序
mdb(ado)+sqlserver:不使用任何表,完全将Access作为前台,用ado来操作sqlserver,这是目前为止access操作sqlserver最安全的一种方式。


发布人:cg1『文章…-Access911  
分享到:
点击次数:  更新时间:2005-02-06 17:47:55  【打印此页】  【关闭】
上一条:Sql Server中各系统表的作用  下一条:ACCESS2000升迁向导“溢出”错误处理方法



相关文章

  • • 实验报告 --DAO与ADO效率之比较
  • • 用代码创建mdb格式的Access文件
  • • 连接后台数据库提示 无法启动应用程序。工作组信息文件丢失,或是已被其它用户以独占方式打开 的解决办法
  • • 64位windows系统如何使用64位的ADO连接Accesss accdb数据库(ACE.OLEDB)
  • • Access的DAO准确获取记录集Recordset的记录数Recordcount
  • • 利用代码自动创建ODBC源
  • • 在打开Ado记录集之前尽量先判断记录集有否打开,如打开则先关闭之
  • • 快速获取Excel文件所有工作表表名

热门文章

  • [2015-01-18] ADO直接读Excel的数据access数据库
  • [2017-05-28] 64位windows系统如何使用64位的ADO连接Accesss accdb数据库(ACE.OLEDB)access数据库
  • [2013-09-20] Access中CurrentDb().Execute 和DoCmd.RunSQL 的异同access数据库
  • [2009-05-04] ADO打开带密码的ACCESS数据库access数据库
  • [2005-02-06] Sql Server中各系统表的作用access数据库
  • [2005-08-16] ADO三大对象的属性、方法、事件及常数(三)access数据库

热门产品

公司动态|在线留言|在线反馈|友情链接|会员中心|站内搜索|网站地图

中山市天鸣科技发展有限公司 版权所有 1999-2023 粤ICP备10043721号

QQ:18449932

Access应用 Access培训 Access开发 Access平台

access|数据库|access下载|access教程|access视频|access软件

Powered by MetInfo 5.3.12 ©2008-2025  www.metinfo.cn