INSERT null 到可为空的日期时间字段导致操作数冲突
INSERT null into nullable datetime field causes operand clash
我正在尝试将记录插入 table。所有字段都可以为空。
对于具有可为 null 的日期时间的字段,我希望值为 NULL,但出现运行时错误
"Operand type clash: text is incompatible with datetime"
谁能解释一下我做错了什么?
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=MyDB;User Id=MyUserName;Password=MyPassword;"
Call conn.Open
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandText = "INSERT INTO MyTable (StartDate,Place) VALUES (?,?)"
Call cmd.Execute(, Array(Null, "Home"))
编辑:table定义
CREATE TABLE [dbo].[MyTable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[StartDate] [datetime] NULL,
[Place] [char](10) NULL,
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
尝试改变这个
Call cmd.Execute(, Array(Null, "Home"))
至此
Call cmd.Execute(DBNull.Value, Array(Null, "Home"))
与其将参数作为 Execute
方法的一部分传递,不如使用 CreateParameter
。这允许您指定每个参数的类型以确保它与数据库中列的类型相匹配。
(不要忘记也将参数添加到 Parameters
集合中 - 一个常见的错误是假设 CreateParameter
会为您完成)。
将参数作为 Execute
方法的一部分传递的问题在于,您强制 ADO 推断 参数类型。 Null
不容易从中推断出类型信息(因为它对多种类型有效 "value")
事实证明这并不总是有效,所以我接受了 Damien_The_Unbeliever 的回答
cmd.CommandText = "INSERT INTO MyTable (StartDate,Place) VALUES (CAST(? AS NVARCHAR),?)"
Call cmd.Execute(, Array(Null, "Home"))
我正在尝试将记录插入 table。所有字段都可以为空。 对于具有可为 null 的日期时间的字段,我希望值为 NULL,但出现运行时错误
"Operand type clash: text is incompatible with datetime"
谁能解释一下我做错了什么?
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=MyDB;User Id=MyUserName;Password=MyPassword;"
Call conn.Open
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandText = "INSERT INTO MyTable (StartDate,Place) VALUES (?,?)"
Call cmd.Execute(, Array(Null, "Home"))
编辑:table定义
CREATE TABLE [dbo].[MyTable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[StartDate] [datetime] NULL,
[Place] [char](10) NULL,
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
尝试改变这个
Call cmd.Execute(, Array(Null, "Home"))
至此
Call cmd.Execute(DBNull.Value, Array(Null, "Home"))
与其将参数作为 Execute
方法的一部分传递,不如使用 CreateParameter
。这允许您指定每个参数的类型以确保它与数据库中列的类型相匹配。
(不要忘记也将参数添加到 Parameters
集合中 - 一个常见的错误是假设 CreateParameter
会为您完成)。
将参数作为 Execute
方法的一部分传递的问题在于,您强制 ADO 推断 参数类型。 Null
不容易从中推断出类型信息(因为它对多种类型有效 "value")
事实证明这并不总是有效,所以我接受了 Damien_The_Unbeliever 的回答
cmd.CommandText = "INSERT INTO MyTable (StartDate,Place) VALUES (CAST(? AS NVARCHAR),?)"
Call cmd.Execute(, Array(Null, "Home"))