Примечание. Я ищу, почему это происходит и как это исправить, я не ищу обходного пути. Это похоже на проблему с сервером (SQL Server или Connection string).
У меня есть программа, которая связана с базой данных sql 2008 (база данных A), и у меня есть встроенный sql, который работает с возвращаемыми ints и строками, и он работает нормально. Но меня попросили переключиться на другую базу данных 2008 года (база данных B), и теперь все возвращается как строка, и я получаю задание, которое недействительно из С#, когда я подключен к sql 2008 (база данных A) не сказал этого. Это встроенный оператор sql, поэтому оператор sql не изменяется, а схема таблицы базы данных одинакова. Это делается на int primary keys. У кого-нибудь есть идеи?
Первоначально я думал, что это вопрос с 2000 по 2008 год, но теперь у меня есть проблема и с 2008 годом. Обе базы данных находятся в одном экземпляре sql-сервера, это строки подключения
Строки подключения
Server=Server01\instance;Database=Fraud_Micah; Trusted_Connection=yes <- Server 2008 (this one does not)
Server=Server02\instance;Database=Fraud; Trusted_Connection=yes <- Server 2008 (this one works)
Обе базы данных находятся на уровне совместимости БД, равном 100
Оператор select
select *, delimeter, file_filetype.LocalPath, ArchiveDir, EmailList
from file_importtable
join file_filetype on file_importtable.FileTypeID = file_filetype.ID
where importsuccessdate is null and transferdate is not null
and remotediscoverdate is not null
and OriginalFileName in ('Test987.xml.pgp')
fileTypeID
, где его разрыв → InvalidCastException: Specified cast is not valid.
Код С# (Note reader - тип SQLDataReader)
if (!(reader.IsDBNull(reader.GetOrdinal("FileTypeID"))))
{
file.FileTypeID = reader.GetInt32(reader.GetOrdinal("FileTypeID"));
}
Вот определение столбца: [FileTypeID] [int] NULL
, в таблице нет нулевых значений.
Я не думаю, что код С# исходит из этого, его int? public int? FileTypeID { get; set; }
В режиме отладки: reader["FileTypeID"]
→ "1" это на самом деле строка, но почему, когда я подключаюсь к базе данных 2008 года, она вернет 1 instaed из "1"
2008 Таблица A Def
[ProcessSuccessDate] [datetime] NULL,
[ProcessSuccessUser] [datetime] NULL,
[FileTypeID] [int] NULL,
[HoldDate] [datetime] NULL,
2008 Таблица B Def
ProcessSuccessDate] [datetime] NULL,
[ProcessSuccessUser] [datetime] NULL,
[FileTypeID] [int] NULL,
[HoldDate] [datetime] NULL,
file.FileTypeID = (int)reader["FileTypeID"];
дает тот же результат.
Выполнение
file.FileTypeID (int)reader.GetInt32(reader.GetOrdinal("FileTypeID"));
работает, но я не хочу этого делать для каждого столбца, который уже должен возвращаться как int, также записывающий sql, как этот
select Convert(int, FileTypeID) as FileTypeId, delimeter, file_filetype.LocalPath, ArchiveDir, EmailList
может обойти эту проблему, но я хочу знать, почему я должен это делать, если я уже установил тип как int в таблице. Я мог бы также положить все типы в виде строк в таблице. На данный момент я не ищу обходного пути, я хочу понять, почему он не работает, как это должно быть.