Мне будет очень интересно узнать, если вы придумаете другую причину, по которой это происходит, но я начинаю сомневаться в этом.Я вполне уверен, что вы где-то ловите или подавляете ошибку.
Примите во внимание следующее:
CREATE TABLE [Person]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[MemberID] [nchar](200) NULL,
[Data] [varchar](50) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
INSERT Person([MemberID],[Data]) VALUES ('1111111111', 'Test1');
INSERT Person([MemberID],[Data]) VALUES ('2222222222', 'Test2');
INSERT Person([MemberID],[Data]) VALUES ('3333333333', 'Test3');
INSERT Person([MemberID],[Data]) VALUES ('NON-NUMERIC', 'Test4');
SELECT * FROM Person WHERE MemberID = 2222222222
Приведенный выше запрос вернет (1) результат И ошибку,Итак, если ваш код выглядит следующим образом:
command = new SqlCommand(
@"SELECT * FROM Person WHERE MemberID = 2222222222", connection );
try
{
reader = command.ExecuteReader();
while ( reader.Read() )
{
Console.WriteLine( "MemberID = " + reader["MemberID"] );
}
// We'll never get here.
reader.Close();
}
catch { }
Результат, который вы получите, будет MemberID = 2222222222
.Это также может произойти, если вы используете блоки SQL TRY...CATCH
.Однако, если мы изменим порядок 1 записей:
TRUNCATE TABLE [Person]
INSERT Person([MemberID],[Data]) VALUES ('NON-NUMERIC', 'Test1');
INSERT Person([MemberID],[Data]) VALUES ('1111111111', 'Test2');
INSERT Person([MemberID],[Data]) VALUES ('2222222222', 'Test3');
INSERT Person([MemberID],[Data]) VALUES ('3333333333', 'Test4');
Вы получите (0) результаты, прежде чем будет сгенерировано исключение.Наконец, если вы измените свой запрос на:
SELECT T.* FROM
(
SELECT TOP 100 *
FROM Person
ORDER BY MemberID
) T
WHERE T.MemberID = 2222222222
... вы получите (1) запись и ошибку.
Мой совет будет выяснить, если и почему выподавляют ошибку.Мой общий совет - не сравнивать символьное поле с целым числом и полагаться на неявное преобразование.
1.Кластерные индексы не гарантируют порядок строк .Это почти наверняка будет в этом тесте, но это стоило указать.