Office中国论坛/Access中国论坛
标题:
我有一个综合性较强的问题,请tmtony MVP回答。
[打印本页]
作者:
ActualyMe
时间:
2005-4-8 23:23
标题:
我有一个综合性较强的问题,请tmtony MVP回答。
切入正题:
是这样的,我现在是在用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.
仍然产生。
(对不起,本来写的好好的话,不小心按了“后退”,结果内容全丢了,还好我保存了一部分,后面的得重写,后面的本来写的很好,一丢了,我就觉
作者:
ActualyMe
时间:
2005-4-8 23:29
哦,实在抱歉,我的配置忘了说了:
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是我的偶像)。
作者:
ActualyMe
时间:
2005-4-9 21:04
能回答一下这个问题吗?谢谢您们了~~~~~~~~~~~
作者:
tmtony
时间:
2005-4-10 10:08
不好意思,这几天在外面,复迟.
我没测试过,不过,replace是access的函数,你现在使用应是ADO(.net) ,你试试STUFF函数看看是否可以.
作者:
ActualyMe
时间:
2005-4-11 07:24
谢谢您的回复。
我这就去试试看。谢谢~~~
作者:
tmtony
时间:
2005-4-11 07:56
别客气,希望多交流. 这几天可能在客户实施,有事可发邮件给我.
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3