设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1130|回复: 5
打印 上一主题 下一主题

[其它] 我有一个综合性较强的问题,请tmtony MVP回答。

[复制链接]
跳转到指定楼层
1#
发表于 2005-4-8 23:23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
切入正题:

是这样的,我现在是在用Microsoft .Net Framework做一个 访问Access数据库 的一个软件。其中它利用

一项,就是可以保存FullPath(全局目录)。下面

FullPath = "My\Name\ActualyMe\"

表示一个在My根目录下的Name,它下面还有一个分支叫ActualyMe。树形结构

------My
--------------Name
----------------------ActualyMe
----------------------Tmtony
----------------------BillGates
----------------------Joy

----------------------...
--------------NameYourself
----------------------ActualyMe

更加说明了这个东西。(它其实就像一个文件夹的树形结构)

那么我的问题比较有综合性,我在C#开发环境当中使用一个叫“OleDbCommand”的控件,他有一项

“ExecuteNonQuery”,表示不返回DataSet(数据设置的一个控件)而执行指定SQL内容。那么若我要

将"Name"修改为"Hello"的话,下列语句

UPDATE Directory SET FullPath = Replace( FullPath, "My\Name\", "My\Hello" ) Where FullPath

LIKE "My\Name%"

将会出现错误,“Undefined function 'Replace' in expression”。

后来我想一个办法,因为知道MDB文件只是一个调用者,那么Replace函数八成是Access自带的,可能Jet

不支持这个函数(因为其他像Left函数就被支持)。所以我尝试“查询(存储过程)”,同样的

UPDATE WrongTheme SET FullPath = Replace(FullPath,[OldPath],[NewPath])
WHERE FullPath LIKE [FindStr];

的查询若在Access中的"查询"中启动(查询-双击指定查询),会出现三个对话框,让您分别填入所需数

值,然后确定以后,Access 将告诉我是否更新5行内容,我按确定以后,下列分支

------My
--------------Hello
----------------------ActualyMe
----------------------Tmtony
----------------------BillGates
----------------------Joy

----------------------...
--------------NameYourself
----------------------ActualyMe

形成(若在后面不加斜线,如My\Name,那么NameYourSelf就可能变成HelloYourSelf,这不是我期望的。

那么,我兴奋的将该查询通过C#调用,代码

public void ExecuteProcedureNonQuery( string procedureName )
  {
   if ( procedureName == null )
    throw new ArgumentNullException( " 值不能为空,位于MyZone class。 " );

   _oleDbSelectCommand.CommandType = CommandType.StoredProcedure;
   _oleDbSelectCommand.CommandText = procedureName;

   _oleDbSelectCommand.Parameters.Clear( );

   try {
 _oleDbSelectCommand.Parameters.AddWithValue( "OldPath", "My\Name\" );
    _oleDbSelectCommand.Parameters.AddWithValue( "NewPath", "My\Hello\" );
    _oleDbSelectCommand.Parameters.AddWithValue( "FindStr", "My\Name\*" );
    // tmtony老师,是这样的,我试验了一下"FindStr", "My\Name\%"发现它并无效果,在Access中显

示“更新0行”,而“*”(星号通配符)则变成了“更新5行”

    _oleDbSelectCommand.ExecuteNonQuery( );
   } catch ( InvalidOperationException ioex ) {
    throw new InvalidOperationException( "在ExecuteSQLQuery( string )中出现错误" +
     ioex.Message + ioex.StackTrace + ioex.Source );
   }
  }

在启动的时候却出现了异常。位置在_oleDbSelectCommand.ExecuteNonQuery();

Undefined function 'Replace' in expression.

仍然是这个问题。Source = "Microsoft JET Database Engine"

于是我将改为SQL并在C#中使用,问题依旧。但奇怪的是,在Access中运行正常,最重要的是,我调用的

是Access的“查询”功能,“查询”不是在Access环境中运行吗?我只是调用了查询,并非是Access独有的函

数。而独有的函数在Access查询中均运行正常。就同我刚才说的一样(在Access自带的“查询”功能中启用

时成功更新5行)。

我Google,yahoo,百度了好几个地方,连Microsoft MSDN全球Knowledge Library都查了个遍,却没有解

释这个问题的。但也有几个方法,我试了试也不管用。
如:将函数分开,这好像是您提供的方法。代码忘记了,好像是有一个
fReplace函数,他实际上就是调用了Replace函数,只是封装了一下,目的是解决Access 2000的兼容问题

。然后我把Replace函数改为fReplace,但

Undefined function 'fReplace' in expression.
仍然产生。



(对不起,本来写的好好的话,不小心按了“后退”,结果内容全丢了,还好我保存了一部分,后面的得重写,后面的本来写的很好,一丢了,我就觉
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2005-4-8 23:29:00 | 只看该作者
哦,实在抱歉,我的配置忘了说了:

PIII 1.13Gb ,剩下内存什么的好像不怎么重要。

Microsoft Office 2003(Access 2003),.Net Framework 2.0,Microsoft C# .Net 2005 Express Edition。操作系统是Windows XP Service Pack 2。

还有,忘了加一条(本来是有的,后来因为误点击“后退”导致丢失)

        祝 Office中国 越办越好,我永远支持Microsoft产品(Bill Gates是我的偶像)。
3#
 楼主| 发表于 2005-4-9 21:04:00 | 只看该作者
能回答一下这个问题吗?谢谢您们了~~~~~~~~~~~

点击这里给我发消息

4#
发表于 2005-4-10 10:08:00 | 只看该作者
不好意思,这几天在外面,复迟.
我没测试过,不过,replace是access的函数,你现在使用应是ADO(.net) ,你试试STUFF函数看看是否可以.
5#
 楼主| 发表于 2005-4-11 07:24:00 | 只看该作者
谢谢您的回复。

我这就去试试看。谢谢~~~

点击这里给我发消息

6#
发表于 2005-4-11 07:56:00 | 只看该作者
别客气,希望多交流. 这几天可能在客户实施,有事可发邮件给我.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-10-6 20:25 , Processed in 0.103338 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表