我有一个数据库表有两个datetime我需要使用 VBScript 从 ASP 页面读取可为空的列。
这是我写的代码:
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = conn
.CommandType = adCmdText
.Prepared = True
.CommandText = "SELECT * FROM storico_corsi WHERE stc_id = 5 "
Set rs = .Execute
Response.Write("stc_scadenza = {" & rs("stc_scadenza") & "}, ")
Response.Write("stc_inizio = {" & rs("stc_inizio") & "} ")
If IsEmpty(rs("stc_inizio")) Then
Response.Write("- ERROR!")
End If
End With
此代码给出以下输出:
stc_scadenza = {19/04/2014}, stc_inizio = {} - ERROR!
如果我将检索顺序交换为
...
Response.Write("stc_inizio = {" & rs("stc_inizio") & "}, ")
Response.Write("stc_scadenza = {" & rs("stc_scadenza") & "} ")
...
这是我得到的(正确的)结果:
stc_inizio = {19/02/2014}, stc_scadenza = {19/04/2014}
为什么从 ADO 记录集中检索元素的顺序发生微小变化会产生完全不同的结果?
请注意,我使用的是意大利语言环境(日/月/年) 然后stc_inizio
and stc_scadenza
,虽然经常设置为午夜时间戳,但属于 SQL 类型datetime.
更新#1:我通过将代码减少为仅操作两个字段、添加空值检查并完全删除 JSON 内容,使代码更简单、更清晰。下面的一些评论引用了以前的、更复杂的版本。
更新#2:如果我将 SQL 查询替换为
SELECT stc_inizio, stc_scadenza FROM storico_corsi WHERE stc_id = 5
or
SELECT stc_scadenza, stc_inizio FROM storico_corsi WHERE stc_id = 5
它工作正常!但为什么?这是我正在使用的数据库表:
CREATE TABLE [dbo].[storico_corsi] (
[stc_id] [bigint] IDENTITY(1,1) NOT NULL,
[stc_id_ute] [bigint] NOT NULL,
[stc_utente] [varchar](100) NULL,
[stc_anagrafica] [ntext] NULL,
[stc_id_can] [bigint] NULL,
[stc_canale] [varchar](500) NULL,
[stc_FE_id] [bigint] NULL,
[stc_quest_finale] [ntext] NULL,
[stc_quest_corretto] [ntext] NULL,
[stc_reg_fad] [ntext] NULL,
[stc_inizio] [datetime] NULL,
[stc_scadenza] [datetime] NULL,
[stc_terminato] [char](1) NULL
CONSTRAINT [DF_storico_corsi_stc_terminato_1] DEFAULT ('N'),
[stc_fine] [datetime] NULL,
[stc_tempo] [bigint] NULL
CONSTRAINT [DF_storico_corsi_stc_tempo] DEFAULT ((0)),
[stc_data_in] [datetime] NULL
CONSTRAINT [DF_storico_corsi_stc_data_in_1] DEFAULT (getdate()),
[stc_progressivo] [int] NULL,
[stc_anno] [int] NULL,
CONSTRAINT [PK_storico_corsi] PRIMARY KEY CLUSTERED ([stc_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] TEXTIMAGE_ON [PRIMARY]
更新#3:只要我包含这 3 个中的任何一个,就可以重现该问题ntext查询中的列。如果我不这样做SELECT
他们,没有什么不好的事情发生。显然,ntext值打破了记录,但它们也以一种不可预测的方式做到了这一点,这取决于其他字段的检索顺序。
更新#4: BLOBs/ntext必须最后使用 ADO 获取。这个说法听起来有点疯狂,但这是我在这里发现的:http://p2p.wrox.com/sql-server-2000/3211-cant-pull-data-ntext-field-into-recordset.html#post78234 http://p2p.wrox.com/sql-server-2000/3211-cant-pull-data-ntext-field-into-recordset.html#post78234这和我的经历是一致的。