将null插入无效的DateTime字段导致操作数冲突



我正在尝试将记录插入表中。所有字段都是无效的。对于具有不可用DateTime的字段,我想要值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"))

编辑:表定义

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]

而不是作为Execute方法的一部分传递参数,而是应该使用CreateParameter。这使您可以指定每个参数的类型,以确保其匹配数据库中的列的类型。

(不要忘记也将参数添加到Parameters集合 - 一个常见的错误是假设CreateParameter会为您做到这一点)。

作为Execute方法的一部分传递参数的问题是,您将ADO强加于推论参数类型。Null从从多种类型的有效"值"中推断出类型信息并不容易。

尝试更改此

Call cmd.Execute(, Array(Null, "Home"))

到这个

Call cmd.Execute(DBNull.Value, Array(Null, "Home"))

这并不总是有效

cmd.CommandText = "INSERT INTO MyTable (StartDate,Place) VALUES (CAST(? AS NVARCHAR),?)"
Call cmd.Execute(, Array(Null, "Home"))

最新更新