注意:我正在寻找为什么会发生这种情况以及如何解决它,我不是在寻找解决方法。这似乎是服务器(SQL Server 或连接字符串)问题。
我有一个连接到 sql 2008 数据库(数据库 A)的程序,并且我有运行的内联 sql,它返回了整数和字符串,它工作正常。但是我被要求切换到另一个 2008 数据库(数据库 B),现在所有内容都以字符串形式返回,并且当我连接到 sql 2008(数据库 A)时,我从 C# 得到一个指定的强制转换无效不说这个。这是一个内联 sql 语句,因此 sql 语句没有变化,并且数据库的表模式是相同的。它在 int 主键上执行此操作有人有任何想法吗?
我最初认为这是 2000 年到 2008 年的问题,但我现在在 2008 年也遇到了一些问题。两个数据库都在同一个 sql server 实例上,这些是连接字符串
连接字符串
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 *, 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.
C# 代码(注意阅读器是 SQLDataReader 类型)
if (!(reader.IsDBNull(reader.GetOrdinal("FileTypeID"))))
{
file.FileTypeID = reader.GetInt32(reader.GetOrdinal("FileTypeID"));
}
这是列定义:[FileTypeID] [int] NULL
,表中没有空值。
我不认为 C# 代码来自这个,它是一个 int?public int? FileTypeID { get; set; }
在调试模式下:reader["FileTypeID"]
-> "1" 它实际上是一个字符串,但是为什么当我连接到 2008 数据库时它会返回 1 而不是 "1"
2008 表 A 定义
[ProcessSuccessDate] [datetime] NULL,
[ProcessSuccessUser] [datetime] NULL,
[FileTypeID] [int] NULL,
[HoldDate] [datetime] NULL,
2008 表 B 定义
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,我想知道为什么我必须这样做。我还不如把所有类型作为字符串放在表中。在这一点上,我不是在寻找解决方法,我想了解为什么它不能正常工作。