问题描述
1、数据是string类型,类似2016/1/22这种形式,如何把日期加上一天,如果是月末,则月份也变化。2、我把列类型设置为int,为什么计算时还提示object不能与int计算?dt.Columns.Add("Hour",typeof(int));inti=dt.Rows[i]["Hour"]+8;//报错
解决方案
本帖最后由 xiaocui2007 于 2016-01-22 18:42:09 编辑
解决方案二:
1转换成datetime类型,调用adddays方法,前一天就是-1,月份自动变。2tostring之后再转int再加
解决方案三:
DateTimetoday=DateTime.Now;DateTimeanswer=today.AddDays(1);inti=int.parse(dt.Rows[i]["Hour"])+8;/inti=convert.toint32(dt.Rows[i]["Hour"])+8;/
解决方案四:
引用1楼guwei4037的回复:
1转换成datetime类型,调用adddays方法,前一天就是-1,月份自动变。2tostring之后再转int再加
非常感谢!如果这样麻烦的话,typeof(int)定义有什么用?
解决方案五:
引用2楼kongwei521的回复:
DateTimetoday=DateTime.Now;DateTimeanswer=today.AddDays(1);inti=int.parse(dt.Rows[i]["Hour"])+8;/inti=convert.toint32(dt.Rows[i]["Hour"])+8;/
多谢!我已经定义typeof(int),为什么还要convert转换?
解决方案六:
typeof(int)定义只是限制datatable的row加入时的值类型。取出后要进行强制转换。
解决方案七:
引用5楼guwei4037的回复:
typeof(int)定义只是限制datatable的row加入时的值类型。取出后要进行强制转换。
哦,终于明白了。我用GetType查询DataTable数据类型为string,但是报错时怎么提示是object类型?奇怪。
解决方案八:
引用2楼kongwei521的回复:
DateTimetoday=DateTime.Now;DateTimeanswer=today.AddDays(1);inti=int.parse(dt.Rows[i]["Hour"])+8;/inti=convert.toint32(dt.Rows[i]["Hour"])+8;/
我的日期格式是2106/1/22,但是Adddays(1)之后格式怎么变成2016/1/2300:00:00了,怎么去掉后面的时间啊?
解决方案九:
写inti=(int)dt.Rows[i]["Hour"]+8;直接告诉编译器你的这个object最终实际上是int类型就足够了,不要多此一举去额外进行计算。
解决方案十:
引用楼主xiaocui2007的回复:
1、数据是string类型,类似2016/1/22这种形式,如何把日期加上一天,如果是月末,则月份也变化。
假设你的字符串用变量s来引用,那么这个结果就是这样计算varx=DateTime.Parse(s).AddDays(1).ToString("yyyy/M/d");
不要要注意,编程中尽量要使用强类型的方式,也就是DateTime类型声明变量。尽量不要、或者少用string。
解决方案十一:
引用6楼xiaocui2007的回复:
我用GetType查询DataTable数据类型为string,但是报错时怎么提示是object类型?奇怪。
这很自然。你并没有执行,你根本执行不了,因为连编译都通不过。编译器的一个最重要的作用就是识别变量的类型,验证其兼容性。这样能够让你的程序的bug在编译器就检查出来,而不至于在运行时、某些特定object类型的值改变时才在用户面前丢人地崩溃、甚至给用户造成损失。因此按照编译的基本知识来理解程序,是学习的必要的途径。编译器又不执行你的代码,它当然只是鉴别类型兼容性。你自认为dt.Rows[i]["mydate"]的数据类型是string,或者你自认为写了dt.Columns.Add("mydate",typeof(string)的代码,但是编译器只有能力判断这些代码静态规范,它只知道DataRow.Item[name]属性返回的属性声明的是object类型的,他不会去把上面Add代码去运行一遍,所以不知道"mydata"列是string类型。
解决方案十二:
我们在设计一个成熟的产品化的程序时,总是尽量强类型化。例如不会以为所谓string可以“万能表示任何数据”,而是强类型编程。同样地,我们也不会随便滥用object声明。但是一些古老的微软.net类库代码,以前的技术,那个时候不具有泛型等等新技术,又希望代码复用,是用了一些object类型声明的。比如说DataRow.Item属性就是这样。当你没有写inti=dt.Rows[i]["Hour"]+8;这类代码的时候,不代表着程序就没有bug,而是可能要到运行时、甚至特定数据改变了的时候才在用户面前崩溃。但是当你写了inti=dt.Rows[i]["Hour"]+8;这类代码,于是立刻就发现自己的设计概念上的问题了。所以“编译不过去”是件好事,不要当作坏事儿。它让你写出更加强类型、更靠谱的代码。
解决方案十三:
引用11楼sp1234_maJia的回复:
我们在设计一个成熟的产品化的程序时,总是尽量强类型化。例如不会以为所谓string可以“万能表示任何数据”,而是强类型编程。同样地,我们也不会随便滥用object声明。但是一些古老的微软.net类库代码,以前的技术,那个时候不具有泛型等等新技术,又希望代码复用,是用了一些object类型声明的。比如说DataRow.Item属性就是这样。当你没有写inti=dt.Rows[i]["Hour"]+8;这类代码的时候,不代表着程序就没有bug,而是可能要到运行时、甚至特定数据改变了的时候才在用户面前崩溃。但是当你写了inti=dt.Rows[i]["Hour"]+8;这类代码,于是立刻就发现自己的设计概念上的问题了。所以“编译不过去”是件好事,不要当作坏事儿。它让你写出更加强类型、更靠谱的代码。
非常感谢前辈在编程思想以及数据类型转换上的指点!我还有一点疑问:有的时候(int)强制转换不行,提示“Specifiedcastisnotvalid”,而Convert.ToInt却可以,为什么?
解决方案十四:
引用9楼sp1234的回复:
Quote: 引用楼主xiaocui2007的回复:
1、数据是string类型,类似2016/1/22这种形式,如何把日期加上一天,如果是月末,则月份也变化。假设你的字符串用变量s来引用,那么这个结果就是这样计算varx=DateTime.Parse(s).AddDays(1).ToString("yyyy/M/d");
不要要注意,编程中尽量要使用强类型的方式,也就是DateTime类型声明变量。尽量不要、或者少用string。
下面的Convert换为(double)强制转换为什么不对呢?Convert不报错。dt.Rows[i]["H2O_D"]=Convert.ToDouble(dt.Rows[i]["H2O"])*Convert.ToDouble(dt.Rows[i]["d_D"]);
解决方案十五:
Covnert.Toxxx()这个并不叫强制转换!
解决方案:
只是从一种数据类型,转换为另一种可兼容的数据类型吧。
解决方案:
引用15楼kensouterry1的回复:
只是从一种数据类型,转换为另一种可兼容的数据类型吧。
多谢。(int)dt.Rows[i]["H2O"]这样转换有时为什么为报错?Convert就不报错。
解决方案:
inti=dt.Rows[i]["Hour"]==DbNull.Value?0:Convert.ToInt32(dt.Rows[i]["Hour"])+8这样写更安全一些,如果(dt.Rows[i]["Hour"])的值是DBNull则给出0.
解决方案:
dt.Rows[i]["Hour"]这里你断点下看这个返回值就知道是object了,要转成数字或者日期型才可以进行下一步操作。
解决方案:
引用18楼smthgdin的回复:
dt.Rows[i]["Hour"]这里你断点下看这个返回值就知道是object了,要转成数字或者日期型才可以进行下一步操作。
恩,断点确实是object。请问,如何将DataTable某列的数据类型设置为2016/1/25这种数据格式,而且读出来也是这种日期格式,下面的方法都不行。dt.Columns.Add("Date",typeof(DateTime));//数据格式为2016/1/2500:00:00Convert.ToDateTime(dt.rows[i]["Date"]);//数据格式为2016/1/2500:00:00
解决方案:
楼上说的很对,typeof(int)是基础数据类型,datatable存的时候还是object