Dav*_*son 10 c# sql-server casting
此错误看起来像是由于在服务器上安装框架4.5引起的,即使该项目仍然针对4.0.
4.5替换了CLR,看起来它在将tinyint类型的对象拆箱到int时发生了变化.这在4.0中工作,但在安装4.5后没有.
============================================
请在回答之前阅读整个问题,目前大多数答案都没有回答我提出的问题.
我们今天在从sql中的tinyint到int使用的转换中出现错误
Daterow datarow = GetOneDatarow(connection,
"SELECT tinyintcolumn FROM table1 WHERE id = 4");
int i = (int)datarow["tinyintcolumn"];
Run Code Online (Sandbox Code Playgroud)
这是旧代码已经在产品中存在了几年而没有任何变化,它一直在工作到昨天.(而且它不是确切的代码,只是足以显示上下文)
===更新
确切的错误消息是:"指定的强制转换无效!" 和最后一行
int i = (int)datarow["tinyintcolumn"];
Run Code Online (Sandbox Code Playgroud)
是我们的代码中输出错误的确切行,只更改了变量名和列名.
数据库列为tinyint,默认值为0,没有索引或其他约束.
===结束更新
===更新2
Henk Holterman在他的回复中告诉我,即使是专门为4.0编译的项目,FW 4.5也取代了4.0的CLR,这可以远程改变现有的4.0行为.
我会保持开放一段时间,但到目前为止他的回答是最有希望的:D ===结束
几个星期前我们从框架3.5改为4.0但是昨天下午重新编译之后才发生这种情况,昨天早上相同的代码(甚至在重新编译之后)就像发条一样工作.
有没有人知道为什么这个以前工作,现在不工作?
微软是否已经做了任何改变,删除了一个隐含的转换,或者之前它是否通过纯魔术工作?
我们通过将数据库列更改为int来解决它,但我仍然对可能导致它立即失败的原因感到好奇.
===更新3
只是为了完成这个.
我发现框架之间的变化.在更新中,Microsoft更改了装箱和拆箱的方式.这导致从字节到int的隐式转换,当字节被装箱时,旧的FW会失败,因为它在数据表中.
未装箱的字节将在4.5中隐式地转换为int,但是装箱的字节是不能隐式转换的通用对象.
不是,这在3.5 SP1中已更改,因此我们的FW 4.0也应该失败,除非SP1的更新不在4.0更新中.这还有待回答:)
Hen*_*man 21
它应该永远不会奏效.这使得框架中的某些内容得以修复.
C#中的问题:
byte b = 3; // TinyInt is a Byte
object o = b; // DataRow[i] is an object
int i = (int)o; // invalid cast
Run Code Online (Sandbox Code Playgroud)
修复:
int i = (byte)datarow["tinyintcolumn"];
Run Code Online (Sandbox Code Playgroud)
并从下面的评论线索:
我们已经安装了它,但是这个项目没有编译为4.5,只有4.0,......可能就是这样吗?
是的,框架4.5取代了4.0的部分.
一个TinyInt类型默认返回一个字节类型,它本身可以转换为int,但db的TinyInt类型不是,所以试试这个:
(int)(byte)datarow["tinyintcolumn"];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19278 次 |
最近记录: |