Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 为什么根据检索顺序从ADO记录集获取空值而不是正确值?(DB表具有NTEXT值)_Asp.net_Sql Server_Datetime_Vbscript_Ado - Fatal编程技术网

Asp.net 为什么根据检索顺序从ADO记录集获取空值而不是正确值?(DB表具有NTEXT值)

Asp.net 为什么根据检索顺序从ADO记录集获取空值而不是正确值?(DB表具有NTEXT值),asp.net,sql-server,datetime,vbscript,ado,Asp.net,Sql Server,Datetime,Vbscript,Ado,我有一个DB表,其中有两个datetime可为空的列,我需要使用VBScript从ASP页面读取这些列 这是我写的代码: Set cmd = Server.CreateObject("ADODB.Command") With cmd .ActiveConnection = conn .CommandType = adCmdText .Prepared = True .CommandText = "SELECT * FROM storico_corsi WHERE

我有一个DB表,其中有两个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记录集中检索元素的顺序上做一个小小的改变会带来完全不同的结果

请注意,我使用的是意大利语言环境dd/mm/yyyy,stc_-inizio和stc_-scadenza虽然经常设置为午夜时间戳,但都是SQL类型的datetime

更新1:我将代码简化为两个字段的操作,添加了空性检查并删除了JSON内容,从而使代码更简单、更清晰。下面的一些评论是指以前更复杂的版本

更新2:如果我将SQL查询替换为

SELECT stc_inizio, stc_scadenza FROM storico_corsi WHERE stc_id = 5

它工作正常!但是为什么呢?这是我正在使用的DB表:

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列中的任何一列,就可以复制该问题。如果我不选择它们,就不会发生什么坏事。显然,ntext值打破了记录,但它们也以一种不可预测的方式打破了记录,这取决于其他字段的检索顺序


更新4:必须使用ADO最后获取BLOB/NTEXT。这句话听起来有点疯狂,但这正是我在这里发现的:它与我的经验是一致的。

鉴于我们进一步调查的结果,似乎问题源于您使用SELECT*隐式选择的NTEXT列。。。但不使用

正如您所注意到的,在使用ADO时,检索比SELECT列表末尾更早的大型二进制字段时,至少曾经出现过一些问题。当你链接到那篇文章时,我确实有一个模糊的记忆,来自遥远的过去,我以前也看到过这个建议

我怀疑您可能正在使用较旧版本的ADO,并且这个问题可能已在以后的版本中修复

考虑到在这种特殊情况下,您实际上不想从NTEXT列中检索值,只需将选择列表限制为实际需要的值,一切都应该正常工作

请注意,通常认为最佳做法是避免使用SELECT*,除了快速的临时查询。显式选择所需的列有几个好处。例如,在这种情况下,即使您的SELECT工作得很好,您仍然可能一直在通过网络从数据库检索NTEXT字段中可能存在的大量数据,但只会放弃而不使用它

另外请注意,在中,有一些关于将BLOB与ADO一起使用的建议,包括:

最后选择BLOB列。选择单个字段,而不是*。
为了消除明显的问题,数据库中是否只有一行stc_id为5?好的。所以,首先要做的是消除这种习惯的可能性?导致问题的jsArray类。如果您只是用原始代码打印rsstc_scadenza的值,它是否有值,或者是空值?此外,作为一个健全性检查,如果您将原始代码更改为只选择一行,例如从storico_corsi中选择*其中stc_id=5,您会得到什么值?这将消除先前或后续循环中的任何奇怪事件…正确。还是一样。事实上,我可能会更新这个问题,以删除妨碍理解核心问题的额外内容,并使其更容易确定关键点,让我试试。现在它真的,真的很奇怪。好的,最后一个请求:尝试完全消除自定义json对象的使用,同时仍然重现问题。因为如果你做不到这一点,那么json对象内部的代码中就会出现一些非常奇怪的事情,我们需要看到这些来解决问题。太棒了!我还更新了标题,让其他用户更容易发现这个讨厌的bug。我正在Windows10上使用SQLServer12.0.2269和ADO10.0。
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]