注意:我正在寻找为什么会发生这种情况以及如何修复它,而不是寻找解决方法。这似乎是一个服务器(SQL Server或连接字符串)问题。
我有一个连接到SQL Server 2008数据库(Database A)的程序,并且我有使用内联SQL运行的代码,其中包含整数和字符串返回,一切正常。但是我被要求切换到另一个SQL Server 2008数据库(Database B),现在所有内容都以字符串形式返回,我从C#获取了指定的类型转换无效错误,而当我连接到SQL Server 2008(Database A)时,它不会出现此错误。这是一条内联SQL语句,因此SQL语句不会更改,数据库的表模式也是相同的。它在整数主键上执行此操作。有人有任何想法吗?
我最初认为这是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)
两个数据库的DB兼容级别都是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: 指定的转换无效。
C# 代码(请注意读取器类型为 SQLDataReader)
if (!(reader.IsDBNull(reader.GetOrdinal("FileTypeID"))))
{
file.FileTypeID = reader.GetInt32(reader.GetOrdinal("FileTypeID"));
}
这里是列定义:[FileTypeID] [int] NULL
,表中没有空值。
我认为这段 C# 代码与此无关,它是一个可空的整数: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,
< p > 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
我也可以绕过这个问题,但是我想知道为什么我已经在表中将类型设置为整数,却还需要这样做。我可能会把所有类型都放在表中作为字符串。目前我不想寻找解决方法,我想了解为什么它没有像应该的那样工作。
FileTypeID
是一个int
类型(而不是long
等其他类型)吗? - Kirk Wollvarchar
。 - Adam V