我正在为这项工作做一个小应用程序,它包含一个表单。当使用该表单的人没有在数据类型"数字"(比如 PIN 码)中输入值,甚至没有在我的"日期"数据类型字段之一(比如他的周年纪念日)中输入日期时,它会返回如下错误:
Error Type – Type d'erreur _Microsoft ODBC 驱动程序的 OLE DB 提供程序 (0x80004005)_ 错误:类型数字的输入语法无效:";执行查询时出错
Error Type – Type d'erreur _Microsoft ODBC 驱动程序的 OLE DB 提供程序 (0x80004005)_ 错误:语法错误位于或附近)";执行查询时出错
因此,当使用该表单的人不输入任何内容时,它似乎返回字符串"空",即"。为什么数值类型和数据类型不能将其读取为 NULL 条目?这些字段不是必需的,因此我需要有时将它们留空。
我怎样才能实现它?他们是否是一种继续使用"数字"和"日期"类型的方法,以便当用户在这些字段中不输入任何内容时,表格会用空白大小写填充而不是给我这个错误?
这是我的sql语句:
trsConn.EXECUTE "INSERT INTO ""TRS"".employeetbl ( "& _
"""firstName"", " & _
"""lastName"" , " & _
"""detContract"", " & _
"sle, " & _
"""posNumber"" "& _
") VALUES (" & _
"'" & Request.Form("empFirst") & "', " & _**
"'" & Replace(Request.Form("empLast"), "'", "`") & "', " & _
"'" & Request.Form("dateContract") & "', " & _
"'" & Request.Form("sle") & "', " & _
"'" & Request.Form("posNum") & "');"
(posNum 和 dateContract 都是"数字"和"日期"的类型
。非常感谢您的帮助。期待听到你们这些天才怎么说。
SQL 中 NULL 的概念非常混乱且不一致......但很明显,''
与NULL
不同.
''
不是NULL
,而是''
,空字符串。您无法将其转换为日期、数字等:
regress=# SELECT CAST('' AS DATE);
ERROR: invalid input syntax for type date: ""
LINE 1: SELECT CAST('' AS DATE);
^
regress=# SELECT CAST('' AS NUMERIC);
ERROR: invalid input syntax for type numeric: ""
LINE 1: SELECT CAST('' AS NUMERIC);
^
一些产品 - 特别是Microsoft Access和旧版本的MySQL - 对这个问题感到困惑。 NULL
为 NULL,''
为空字符串;它们不是一回事。您无法将一个转换为另一个。
因此,当使用该表单的人什么也没输入时,似乎 返回字符串 "empty" 即 "。为什么数字类型和 数据类型将其读取为空条目?这些字段不是必填字段 所以我需要让它们有时是空白的。
这是应用程序的工作。当你的应用看到数字、日期或类似内容的表单字段出现空字符串时,它应该NULL
发送到数据库,而不是''
。这通常是在将数据提供给数据库之前转换用户输入的数据的常规部分。进行此类转换至关重要;您永远不应该只是将用户的值直接发送到数据库。
快速搜索表明 asp classic 使用 null
或 undefined
作为其空值;当某些内容为 null 时,您应该能够将它们传递到准备好的语句中。
有关''
的错误之后出现语法错误的事实表明,您正在将 SQL 语句构建为字符串,而不是使用带有占位符的预准备语句。(感谢JayC的SO问题参考)。这是乞求SQL注入;换句话说,您的应用程序非常不安全。想象一下,如果用户输入"日期"会发生什么:
2012-01-01'); DROP SCHEMA public;--
您的应用程序很高兴地将其变成
INSERT INTO sometable (blah, blah, blah) VALUES (1, 2, DATE '2012-01-01'); DROP SCHEMA public;--');
然后DROP SCHEMA
愉快地执行,哎呀,啪啪啪,你的数据库去了。这也是最愚蠢、最简单的SQL注入攻击。