2015-10-07 1 views
3

У меня есть таблица БД с двумя datetime нулевые столбцы, которые мне нужно прочитать с ASP-страницы, используя VBScript.Почему нулевые значения выбираются из набора записей ADO вместо правильных в зависимости от порядка извлечения? (Таблица БД имеет значения NTEXT)

Это код, который я написал:

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 и stc_scadenza, в то же время часто устанавливают в полночь метки времени, имеют тип SQL даты и времени.


UPDATE # 1: Я сделал код проще и понятнее за счет сокращения кода манипуляции всего два полей, добавив проверку пустоты и удаление JSON вещи в целом. Некоторые комментарии ниже относятся к предыдущим, более сложным версиям.


UPDATE # 2: Если я заменю запрос SQL с

SELECT stc_inizio, stc_scadenza FROM storico_corsi WHERE stc_id = 5 

или

SELECT stc_scadenza, stc_inizio 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] 

UPDATE # 3: Проблема может быть воспроизведена в любое время я включать любого из 3 NTEXT столбцов в запросе. Если я не сделаю SELECT их, ничего плохого не произойдет. По-видимому, значения ntext ломают запись, но они также делают это непредсказуемым образом, который зависит от порядка поиска других полей.


UPDATE # 4: BLOBs/NTEXT s должны быть выбраны в прошлом с помощью ADO. Это утверждение звучит немного сумасшедшим, но это то, что я нашел здесь: http://p2p.wrox.com/sql-server-2000/3211-cant-pull-data-ntext-field-into-recordset.html#post78234 Это согласуется с моим опытом.

+1

Как раз для того, чтобы устранить очевидное, существует определенная только одна строка в базе данных, где 'stc_id' равен 5? –

+0

Да. Я проверил прямо сейчас. :-) –

+1

Хорошо. Итак, первое, что нужно сделать, это исключить возможность того, что это (пользовательский?) Класс jsArray вызывает проблемы. Если вы просто распечатываете значение 'rs (" stc_scadenza ")' с исходным кодом, имеет ли оно значение или оно равно null? –

ответ

2

Учитывая результаты, которые вы видите, как мы исследовали дальше, кажется, что проблема связана с NTEXT столбцов, которые вы выбираете неявно с вашим SELECT * ... (но не используется.)

Как вам Было отмечено, что существует occasional hints on the web, что, по крайней мере, были проблемы с получением больших двоичных полей раньше, чем конец списка SELECT при использовании ADO. (Как только вы связались с этой статьей, у меня была смутная память из тусклого и далекого прошлого, что я тоже видел этот совет.)

Я подозреваю, что вы можете использовать более старую версию ADO, и эта проблема, возможно, была исправлена ​​в последующих выпусках.

Учитывая, что в этом конкретном случае вы фактически не хотите извлекать значения из столбцов NTEXT, вы должны просто ограничить свой список SELECT теми значениями, которые вам действительно нужны, и все должно работать нормально.

Обратите внимание на то, что в большинстве случаев рекомендуется избегать использования SELECT *, за исключением быстрых, специальных запросов. Явный выбор столбцов, которые вам нужны, имеет несколько преимуществ. Например, в этом случае, даже если ваш SELECT работал отлично, вы все равно извлекли потенциально большие объемы данных в свои поля NTEXT (возможно, по сети) из своей базы данных, чтобы отбросить его, не используя его. .

Отметим также, что в KB article 317016, "How To Read and Write BLOBs Using GetChunk and AppendChunk", есть некоторые "предложения по использованию BLOB-с АДО", в том числе:

  • Выберите столбцы BLOB последнего. Выберите отдельные поля, а не «*».
+1

Удивительное расследование Мэтт! Я также обновил название, чтобы облегчить другим пользователям узнавать об этой неприятной ошибке. Я использую SQL Server 12.0.2269 и ADO 10.0 в Windows 10. –

 Смежные вопросы

  • Нет связанных вопросов^_^