access2007从窗体向表中输入数据

INSERT INTO 购票信息登记表
values ( [forms]![购票登记信息界面]![Text0] ,
[forms]![购票登记信息界面]![Text2] ,
[forms]![购票登记信息界面]![Text4] ,
[forms]![购票登记信息界面]![Text6] ,
[forms]![购票登记信息界面]![Text8] ,
) ;

为什么说是语法错误?我想把在一个窗体输入的数据导入表中。。。

要将窗体中非绑定文本框输入的数据插入数据表中比绑定控件的方法要灵活得多,但是对于一个数据库及其应用程序编程初学者来说这绝非一件易事,因为其中涉及的相关知识和细节很多不太容易弄清楚,稍有不慎就会出错!这常常会让不少初学者们感到沮丧。现在手把手一一道来。

首先我们来分析一下你贴出的SQL代码,这是一个在INSERT INTO 语句中直接引用窗体控件的SQL代码,其思路是对的,但是有一点小毛病,结尾括号前多了一个逗号,应予以删除。另外,该语句未指定字段名称,这种情况下就必须在后面的values()内指定全部参数值,而且顺序不能搞错,否则语句运行时会报错。建议修改如下:
INSERT INTO 购票信息登记表 (字段1,字段2,字段3,字段4,字段5)
values ([forms]![购票登记信息界面]![Text0] ,
[forms]![购票登记信息界面]![Text2] ,
[forms]![购票登记信息界面]![Text4] ,
[forms]![购票登记信息界面]![Text6] ,
[forms]![购票登记信息界面]![Text8] )
特别说明一下,这种在SQL语句中直接引用窗体控件的写法只能应用于ACCESS窗体属性、控件属性和ACCESS查询对象中(用编程的方法设置为相应的控件值也行),其它情况下ACCESS数据库JET引擎无法识别。如果你要在ACCESS窗体点击某个按钮运行上述SQL代码,可以这样做,先将上述直接引用控件的SQL代码保存为一个操作查询,取名“插入购票信息”,在该按钮的单击事件过程里用DoCmd对象的OpenQuery方法运行该查询即可,
具体写法为:DoCmd.OpenQuery "插入购票信息"
这里强调一下,即使操作查询的SQL代码完全正确也不能保证其可以正确运行,我们还要充分考虑插入数据的类型、数据完整性、有效性规则、是否允许空值、不能向自动ID字段插入数据和是否唯一索引等诸多因素,否则出错在所难免。

为了便于理解,下面给出一个在ACCESS窗体中将非绑定文本框中输入数据插入数据表的实例供参考,请仔细阅读相关代码和注释,这对提高你的ACCESS水平非常有用。

编写实例前先假设购票信息登记表结构如下:
购票ID(文本,无重复,必填字段)
票名称(文本,允许重复,必填字段)
数量(长整型数字,允许重复,必填字段)
购票日期(时间日期,允许重复,必填字段)
备注(文本,允许重复,非必填字段)

在窗体中一般推荐使用非直接引用窗体控件(常规)的SQL代码,事实上JET引擎是无法直接识别窗体控件的。上列直接引用窗体控件的SQL代码之所以可以运行,其实ACCESS系统在背后进行自动转换将控件上的具体数值告诉了JET引擎所致,当然其能应用的场所是有限制的(具体见上面所述)。

由于实例中要使用常规的INSERT INTO语句,现就插入一条记录的语法作简要说明。
INSERT INTO 目标表(字段1,字段1,字段3,...) VALUES(数据值1,数据值1,数据值1,...)
说明:插入的字段和插入的数据值须一一对应,不能多也不能少,数据类型要匹配或者兼容;数据值为文本的须用单引号括住,数据值为日期时要用一对#号括住,这些数据值必须是一个个具体的值而不能是对控件的引用。

设计将Text0中的值插入“购票ID”字段、Text2中的值插入“票名称”字段、Text4中的值插入“数量”字段、Text6中的值插入“购票日期”字段、Text8中的值插入“备注”字段,添加一个命令按钮[Command1],当点击该按钮后对应控件中的资料随即写入购票信息登记表。

我们在向数据表插入记录时不能随意就将一些数据写入相应的字段里,而必须遵循一定的规则,不然表中的数据就不能被有效利用,甚至完全不可利用,数据库也就失去了存在的价值。例如在“数量”的对应控件[Text4]输入“7B”,又或者在“购票日期”的对应控件[Text6]输入“2011-13-21”那么将这样的数据写入数据表显然是不妥当,为了避免这种情况的发生,我们可以手动设置[Text4]的“格式”属性为“常规数字”,[Text4]的“格式”属性为“长日期”这样当不小心输入错误数据时系统就会拒绝并予以提示。

现在给出具体代码如下:
为COMMAND1添加下列单击事件过程

Private Sub Command1_Click()

Dim strSql as String ‘为合成INSERT INTO 语句声明一个字符串型变量
If IsNull(Me!Text0) Then '如果Text0为空
MsgBox "请输入购票ID", , "提示" '弹出提示框
Me!Text0.SetFocus '焦点移至Text0
Exit Sub '终止SUB过程
ElseIf DLookup("[购票ID]", "购票信息登记表", "[购票ID]=[Forms]![购票登记信息界面]![Text0]")= Me.Text0 Then
'利用DLookup函数查找[Text0]输入的值是否已存在于表中,以避免输入重复值
MsgBox "购票ID已用,请更换", , "提示"
Me!Text0.SetFocus
Exit Sub
ElseIf IsNull(Me!Text2) Then '如果Text2为空
MsgBox "请输入票名称", , "提示"
Me!Text2.SetFocus
Exit Sub
ElseIf IsNull(Me!Text4) Then '如果Text4为空
MsgBox "请输入数量", , "提示"
Me!Text4.SetFocus
Exit Sub
ElseIf IsNull(Me!Text6) Then '如果Text6为空
MsgBox "请输入购票日期", , "提示"
Me!Text6.SetFocus
Exit Sub
End If
'Text8允许留空故不作空白审核。上面一系列“IF THEN”语句判断不允许留空的控件是否已经填写了数据以及判断购票ID有否重复。事实上你可以用这种思路充分发挥想象力添加任意复杂的所谓 “企业规则”
'现在开始根据各个控件填写的值,合成数据库JET引擎能够识别的常规 INSERT INTO SQL 语句
strSql = "INSERT INTO 购票信息登记表(购票ID,票名称,数量, 购票日期,备注) "
strSql = strSql & "VALUES('"
strSql = strSql & [Forms]![购票登记信息界面]![Text0]
strSql = strSql & "','" & [Forms]![购票登记信息界面]![Text2]
strSql = strSql & "'," & [Forms]![购票登记信息界面]![Text4]
strSql = strSql & ",#" & [Forms]![购票登记信息界面]![Text6]
strSql = strSql & "#," & IIf(IsNull([Forms]![ 购票登记信息界面]![Text8]), "Null", "'" & [Forms]![购票登记信息界面]![Text8] & "'")
strSql = strSql & ")"
'注意:在上述SQL语句步骤中TEXT8使用了IIF函数,这也是因为TEXT8存在留空的可能,所以使用该函数在TEXT8为空白时为“备注”字段指定一个“NULL”值以免运行出错。而其它控件已经排除了空白的可能故直接引用就行了
'经过上述合成代码我们已经将窗体控件中输入的具体数值写入SQL语句的VALUE参数里面。
'假设我们分别向TEXT0,TEXT2,TEXT4,TEXT6,TEXT8填入 201112-001,午餐票,200,2011-12-07,空白
'那么字符串变量strSql的实际值等于:
'INSERT INTO 购票信息登记表(购票ID,票名称,数量, 购票日期,备注) VALUES(‘201112-001’,'午餐票',200,#2011-12-07#,Null)
'假设我们分别向TEXT0,TEXT2,TEXT4,TEXT6,TEXT8填入 201112-002,晚餐票,200,2011-12-07,三菜一汤
'那么字符串变量strSql的实际值等于:
'INSERT INTO 购票信息登记表(购票ID,票名称,数量, 购票日期,备注) VALUES(‘201112-002’,'晚餐票',200,#2011-12-07#,’三菜一汤')
'请留意对于字符串值加了单引号,日期被#号括住,留空的那个控件则填入NULL值

DoCmd.RunSQL strSql ‘此句代码使用DoCmd对象的RunSql方法运行合成出来的SQL操作查
'询语句,将窗体未绑定控件中输入的值写入购票信息登记表中。

'弹出提示框,告知插入新纪录成功
MsgBox "成功向购票信息登记表插入一条新纪录", , "提示"

End Sub
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-06
ACCES可以绑定表,为何不直接绑定呢?2007没用过,如果可以转成2003版本,可以发给我看看。
相似回答