注意:我正在寻找为什么会发生这种情况以及如何解决它,我不是在寻找解决方法.这似乎是服务器(SQL Server或连接字符串)问题.
我有一个程序连接到一个sql 2008数据库(数据库A),我有内联sql运行,其中有int和字符串返回,它工作正常.但我被要求切换到另一个2008数据库(数据库B),现在一切都以字符串形式返回,我从C#获取指定的强制转换,当我连接到sql 2008(数据库A)时不说这个.这是一个内联sql语句,因此sql语句不会更改,并且数据库的表模式是相同的.它在int主键上执行此操作任何人都有任何想法?
我原本以为这是2000年至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)
Run Code Online (Sandbox Code Playgroud)
两个数据库的DB compatibility_level均为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')
Run Code Online (Sandbox Code Playgroud)
fileTypeID 是它破碎的地方 - > InvalidCastException: Specified cast is not valid.
C#代码(注释阅读器是类型SQLDataReader)
if (!(reader.IsDBNull(reader.GetOrdinal("FileTypeID"))))
{
file.FileTypeID = reader.GetInt32(reader.GetOrdinal("FileTypeID"));
}
Run Code Online (Sandbox Code Playgroud)
这是列定义:[FileTypeID] [int] NULL表中没有空值.
我不认为C#代码来自于它,它是一个int? public int? FileTypeID { get; set; }
在调试模式下:reader["FileTypeID"]- >"1"它实际上是一个字符串,但为什么当我连接到2008数据库时它会返回1个"1"的实例
2008表A Def
[ProcessSuccessDate] [datetime] NULL,
[ProcessSuccessUser] [datetime] NULL,
[FileTypeID] [int] NULL,
[HoldDate] [datetime] NULL,
Run Code Online (Sandbox Code Playgroud)
2008年表B Def
ProcessSuccessDate] [datetime] NULL,
[ProcessSuccessUser] [datetime] NULL,
[FileTypeID] [int] NULL,
[HoldDate] [datetime] NULL,
Run Code Online (Sandbox Code Playgroud)
file.FileTypeID = (int)reader["FileTypeID"]; 产生相同的结果.
做一个
file.FileTypeID (int)reader.GetInt32(reader.GetOrdinal("FileTypeID"));
Run Code Online (Sandbox Code Playgroud)
确实有效但我不想为每一个已经应该作为int返回的列也这样做,也写这样的sql
select Convert(int, FileTypeID) as FileTypeId, delimeter, file_filetype.LocalPath, ArchiveDir, EmailList
Run Code Online (Sandbox Code Playgroud)
我也可以解决这个问题,但是如果我已经在表格中将类型设置为int,我想知道为什么我必须这样做.我不妨把所有类型作为字符串放在表中.在这一点上,我不是在寻找一种解决方法,我想要理解为什么它不应该像它一样工作.
JNK*_*JNK 10
您列出的两个表都显示int为数据类型,但听起来就像是两个不同数据库中同一个表的两个版本.
我相信OTHER表是你JOIN在一个数据库中具有不同数据类型的表.
File_fileType.Id两个DB中的数据类型是什么?
你的JOIN:
join file_filetype on file_importtable.FileTypeID = file_filetype.ID
导致隐式转换.

上图显示了SQL Server如何允许或执行数据类型转换.
你能在上面的两个版本的两个版本中显示DDL JOIN吗?
对我而言,听起来有一些古怪的配置设置很难找到.有一个名为Redgate SQL Compare的工具在检测数据库模式之间的差异方面做得非常出色.
他们进行了为期14天的试验.我会尝试下载它并在您的数据库之间进行比较.
在计划中,我决定删除该表并使用重新创建它
[脚本表为] -> [创建]
从给我带来问题的同一张表中,然后重新插入所有相同的数据。这解决了这个问题。所以我不相信表的 DML 发生了变化,数据也没有改变,但这就是解决我的问题的原因。