这更像是一个观察而不是一个真实的问题:MS-Access(以及一般的VBA)极度缺少一个可以自动生成错误处理代码的工具,以及发生错误时可以显示行号的工具.你找到了解决方案吗?它是什么?我刚刚意识到,自从几年前我找到了解决这个基本问题的正确答案以来,我有多少个小时,我希望看到你在这个非常重要的问题上有什么想法和解决方案.
我们已经开发了相当重的ms访问应用程序,有大约300个表单(是的!).当代码实例化这些表单(并且不只是"打开"它们)时,我们可以在屏幕上显示同一表单的多个实例.
为了绕过VBA的限制,以及它对一些面向对象概念(如继承,接口,封装等)的不良实现,代码管理:
因此,作为一个例子,当我想要达到我的一个实例的标准属性时,我可以写:
MyWindows.accessWindow(hWnd).name
Run Code Online (Sandbox Code Playgroud)
其中hWnd是Windows提供的句柄,并命名标准form().name属性
但是如果我想要达到我的一个实例的特定属性,我可以写:
MyWindows.ghostWindow(hWnd).originalRecordset
Run Code Online (Sandbox Code Playgroud)
其中'originalRecordset'包含原始ADODB.recordset,它是在表单第一次实例化时加载的(意味着在用户进行任何更改之前......可能很有趣!)
它工作得很好,但是对它进行编码可能是一个真正的PITA,特别是当人们知道在C#中做类似的事情是多么明亮,只要可以将MS-Access表单对象封装到更通用的C#对象中.所以这就是问题:可以将MS-Access表单嵌入到自制的C#dll中吗?它可行吗?
我不希望得到一个完整的答案,但我期待一些帮助才能走上正轨.好朋友好吗?
在专家交流和teck共和国有一些文献可以 使用combobox.recordset属性来填充Access表单中的组合框.
这些控件通常在控件的"rowsource"属性中填充"SELECT*"字符串,引用应用程序客户端上可用的表或查询.当我需要在组合框中显示服务器端数据时,我创建一个临时本地表并导入请求的记录.这非常耗时,特别适用于大型桌子.
能够使用记录集来填充组合框控件将允许用户直接显示来自服务器端的数据.
受前面两个例子的启发,我写了一些代码如下:
Dim rsPersonne as ADODB.recordset
Set rsPersonne = New ADODB.Recordset
Set rsPersonne.ActiveConnection = connexionActive
rsPersonne.CursorType = adOpenDynamic
rsPersonne.LockType = adLockPessimistic
rsPersonne.CursorLocation = adUseClient
rsPersonne.Open "SELECT id_Personne, nomPersonne FROM Tbl_Personne"
fc().Controls("id_Personne").Recordset = rsPersonne
Run Code Online (Sandbox Code Playgroud)
哪里:
不幸的是,它不起作用!
在调试模式下,我能够检查记录集是否已正确创建,具有请求的列和数据,并且与组合框控件正确关联.不幸的是,当我显示表单时,我不断得到一个空的组合框,没有记录!任何帮助都非常感谢.
编辑:
这个记录集属性确实可用于特定的组合框对象,而不是标准控制对象,几天前我发现它非常惊讶.我已经尝试使用combobox的回调函数,或者使用组合框的"addItem"方法填充列表.所有这些都很耗时.
我回忆起了一段时间.只需按以下步骤操作:
在office 2003中创建一个.doc/.xls/.ppt文件.在那里保留一些测试数据并关闭文件.现在重命名该文件,将其文件扩展名更改为随机字符串,注意它是无关联的,如test.asdfghjkl等.双击该文件,它在父应用程序中无缝打开.
现在AFAIK,windows检查文件的文件扩展名并使用它来执行操作,即打开一个应用程序并将文件传递给它打开.那么办公套件如何设法做到这一点?
编辑:扩展名更改为与另一个应用程序关联的扩展名的情况如何.是否有适当的优先级算法来处理?
我打算将一些"和平"(你可以称之为组织)带到我在家里做的个人工作(小项目等).
我想使用a SCM和a issue tracker来捕获提交并自动将它们显示为更改集等.
请注意,所有上述应用程序都应该用于个人用途,因此更喜欢某些东西,FOSS并且在系统要求方面也需要超轻量级.
您有什么推荐的吗?
编辑: 以下是我的一些疑虑/担忧:
Git用GitHub看起来很不错.但我对公开代码库不太满意GitHub.你说什么?GitHub提供问题跟踪器?我的意思是,我可以在GitHub提供的问题跟踪器上打开一个问题并针对该问题提交吗?SCM(在我的笔记本电脑上)并使用remote issue tracker像FogBugz这样的东西吗?但我只是不明白远程问题跟踪器如何捕获我的提交.任何的想法?更新:
我终于Mercurial和BitBucket一起去了.到目前为止工作真棒!
我们最近从SQL Server 2005升级到SQL Server 2008(R2,SP1).此升级包括一些发布,其中所有表都使用基于"以后获胜"原则的默认冲突解决程序发布.它的智能名称是'Microsoft SQL Server DATETIME(Later Wins)Conflict Resolver',相应的dll文件是ssrmax.dll.
众所周知,一旦使用冲突解决程序发布表,则必须在使用此表的所有后续发布中使用相同的冲突解决程序.很公平,但是,当将以前发布的表添加到新发布中,并指定要用于此表的完全相同的冲突解决程序时,我们收到一条错误消息:
use [myDb]
exec sp_addmergearticle
@publication = N'myDb_Pub',
@article = N'Tbl_blablabla',
@source_owner = N'dbo',
@source_object = N'Tbl_blablabla',
@type = N'table',
@description = N'',
@creation_script = N'',
@pre_creation_cmd = N'drop',
@schema_option = 0x000000000C034FD1,
@identityrangemanagementoption = N'none',
@destination_owner = N'dbo',
@force_reinit_subscription = 1,
@column_tracking = N'false',
@article_resolver = N'Microsoft SQL Server DATETIME (Later Wins) Conflict Resolver',
@subset_filterclause = N'',
@resolver_info = N'ddmaj',
@vertical_partition = N'false',
@verify_resolver_signature = 0,
@allow_interactive_resolver = N'false',
@fast_multicol_updateproc …Run Code Online (Sandbox Code Playgroud) sql-server sql-server-2005 resolver sql-server-2008 merge-replication
在过去的18个月里,我们一直在研究复杂的数据库和客户端界面.我们定期为此应用程序添加新功能,现在我们所有办公室(包括站点和海外)每天都有数十名用户使用它.这只是告诉你它是一个真正的应用程序与REAL数据库.
到目前为止,我们仍然没有编写任何存储过程,除了临时解决客户端版本和更新的数据库模型之间的小问题(旧的客户端版本将无法正确更新新创建的字段,直到每个人都安装最新的版).
同样,我们仍然不需要任何触发器.实际上,唯一的SP和触发器是系统的,或者是为复制目的而添加的.
我有一种奇怪的感觉,当开发人员认为数据库优化必须反对数据库规范化时,SP和触发器主要用于补偿数据库设计默认值和/或试图绕过数据库设计规则.
问题是这些工具很耗时(用于开发或维护).然后,每个开发人员都应该非常小心地使用它们,请记住它们是在数据库中维护的最"昂贵"的项目.
我们是否可以认为在数据库中没有或几乎没有存储过程/触发器是它的标准化水平和/或代码维护成本的良好指示?
编辑:
有些人为使用触发器和SP提供了公平的参数.但我一直认为,大多数时候这些工具是以不正当或过度的方式使用的.设置了多少个触发器来在表字段之间进行一些奇特的更新,或者重新计算总计或其他聚合数据?有多少SP用于构建用于报告问题的临时表?在开发人员使用这些工具的许多情况中,这些是2,我认为这通常说明了数据库设计/规范化缺陷.
其他一些人承认应严格控制SP和触发器的使用.我发现它也是必要的.
我必须承认,我试图找到一些崇尚参数,所有我们的其他数据库的工作,这些SQL怪才瞧不起我们,告诉自己的朋友:"你知道吗?他们甚至不使用SP和触发器!哈哈!"
triggers database-design stored-procedures platform-agnostic normalization
我正在使用ms-access开发用于数据库管理的前端解决方案.我必须承认ms-access VBA是大规模应用程序开发的一个固定限制,这就是为什么我一直在转变使用c#而不是VBA的想法.
实际上,除了一个东西:表单之外,很容易摆脱ms-access中的所有内容.在数据显示和编辑方面,这些特别快速有效.在最新版本的ms-access中,表单就像类一样,因此您可以在运行时专门管理同一表单的一个或多个实例.在连续模式下使用时,它们可用于操作数据"excel方式",具有行和列显示,过滤和排序的可能性.简而言之,我喜欢它.
当然可以在c#(或其他类似语言)下对这个表单对象进行反向工程,但这可能已经完成了:你曾经使用过库,activeX控件或任何其他类型的附加组件吗?在c#中操作类似msacces的形式的可能性?
编辑:根据Renaud的评论,我承认没有兴趣仅转换表单的布局部分,并且无法转换其自定义/ VBA部分.在我们的特定情况下,我们很久以前就停止在表单中使用自定义VBA代码,并且从模块管理表单属性,方法和事件.这甚至在这里讨论过.
实际上,我们所有的表单都依赖于一个通用模板,并且是自动构建的"表单"和"控件"表.所有基础事件管理代码生成都是自动化的:根据其类型,控件与选定事件相关联,事件代码提供应用程序模块中保存的标准\通用程序.这使我认为可以将我们的'ms-access表单技术'转移到.NET平台.
我今天发现(*),根据服务器的不同,我的TSQL命令区分大小写,这意味着,当一个表的列被命名时tableId,以下指令可能不会成功:
SELECT TableId FROM myTable
Run Code Online (Sandbox Code Playgroud)
取决于列的排序规则.SQL_Latin1_blablabla似乎不区分大小写,何时Latin1_blablabla是.
所以我的第一个问题是为什么!
第二个是:更新数据库中所有相关列的所有排序规则的最快技巧(sp?)是什么?
编辑:使事情非常清楚:
SELECT tableId FROM myTable
Run Code Online (Sandbox Code Playgroud)
适用于所有服务器
SELECT TableId FROM myTable
Run Code Online (Sandbox Code Playgroud)
仅在具有SQL_Latin_blablabla排序规则的服务器上有效.注意2个字符串之间的区别.我们不是在谈论数据整理,而是关于这种整理对我们编写代码的方式的影响!
(*)我可以在这里使用一些额外的和特定的词来限定我在'发现'后的心态,但所有这些都是成人评价的...
我注意到,在某些情况下(我仍然是R!的初学者),多行指令不能"按原样"合并到简单的行指令中.让我们举一个例子,这是我最近上线的一课:
> make.power <- function(n) {
+ pow <- function(x) {
+ x^n
+ }
+ pow
+ }
Run Code Online (Sandbox Code Playgroud)
是'make.power'函数的定义.然后我可以定义'立方体'或方形函数
> cube <- make.power(3)
> square <- make.power(2)
Run Code Online (Sandbox Code Playgroud)
然后,如果我尝试使用完全相同的语法在一行上定义make.power:
> make.power <- function(n) { pow <- function(x) { x^n } pow }
Run Code Online (Sandbox Code Playgroud)
这将引发"make.power中的意外符号...".这就是说,以下单行代码将起作用:
> make.power <- function(n) { pow <- function(x) { x^n }}
Run Code Online (Sandbox Code Playgroud)
并且,当切换到多线时,仍然可以工作!
> make.power <- function(n) {
+ pow <- function(x) {
+ x^n
+ }
+ }
Run Code Online (Sandbox Code Playgroud)
我必须承认我很困惑.我的问题如下:
编辑:在#Dwin回答之后,以下表达式确实如此:
> make.power <- function(n) { …Run Code Online (Sandbox Code Playgroud)