MS Access VBA:窗体打开时创建含单条虚拟记录的唯一表
解决Access中新建表后无法插入数据的问题
看起来你遇到的是Access里一个挺常见的小坑——刚创建的空表在绑定控件或者执行INSERT操作时,偶尔会因为没有初始记录而出现异常,手动加一条后就正常了对吧?咱们直接修改代码,在创建表的同时自动插入一条虚拟记录就能解决。
修改后的完整代码:
Sub ViaVBA() Const strSQLCreateFoo_c As String = _ "CREATE TABLE Foo" & _ "(" & _ "MyField1 INTEGER," & _ "MyField2 Text(10)" & _ ");" Const strSQLAppendBs_c As String = _ "INSERT INTO Foo (MyField1, MyField2) " & _ "SELECT Bar.MyField1, Bar.MyField2 " & _ "FROM Bar " & _ "WHERE Bar.MyField2 Like 'B*';" ' 定义插入虚拟记录的SQL语句,用独特值避免和实际数据冲突 Const strSQLInsertDummy_c As String = _ "INSERT INTO Foo (MyField1, MyField2) VALUES (0, '__DUMMY__');" If Not TableExists("foo") Then CurrentDb.Execute strSQLCreateFoo_c ' 表创建完成后立即插入虚拟记录,确保表不为空 CurrentDb.Execute strSQLInsertDummy_c End If CurrentDb.Execute strSQLAppendBs_c ' 可选:如果不需要保留虚拟记录,可以在插入实际数据后删除它 ' CurrentDb.Execute "DELETE FROM Foo WHERE MyField2 = '__DUMMY__';" End Sub Private Function TableExists(ByVal name As String) As Boolean On Error Resume Next TableExists = LenB(CurrentDb.TableDefs(name).name) End Function
关键修改点:
- 新增了
strSQLInsertDummy_c常量,用来插入一条独特的虚拟记录(用__DUMMY__作为标识,避免和实际业务数据混淆) - 在创建表的分支里,执行完建表语句后立刻执行虚拟记录的插入,保证新表从一开始就至少有一条记录
- 如果不需要保留这条虚拟记录,可以解除最后一行的注释,插入完实际数据后自动删掉它
补充说明:
另外你可以检查下strSQLAppendBs_c的筛选条件是否真的能从Bar表中取出数据——如果Bar表本来就没有符合Like 'B*'的记录,那即使加了虚拟记录,新表也不会有新增的业务数据,但根据你描述的“手动加一条后就能正常保存”,核心问题还是空表的初始化问题,上面的修改应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Fikusek007
相关产品推荐
相关产品推荐

