DataTable操作的两个疑问?

问题描述

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

时间: 2024-12-10 22:41:17

DataTable操作的两个疑问?的相关文章

VB.NET窗体操作技巧两则

VB.NET窗体操作技巧两则 2003-03-18· ·刘红军 刘乐坤 ··yesky 一.如何拖动没有边框的窗体? 这个功能在VB6中,需要借助于API函数才能实现.而在VB.NET中,凭自己的功能就能实现.首先设置窗体的FormBorderStyle属性为none以去掉窗体的边框,然后在窗体上添加一个按钮.窗体中的代码如下: Public Class Form1 Inherits System.Windows.Forms.Form Private mouse_offset As Point

并行计算-linux 下用p,V操作对两线程的操作

问题描述 linux 下用p,V操作对两线程的操作 计算/打印线程的同步:两个线程共享公共变量a线程1负责计算(+1)线程2负责打印 解决方案 我不太理解你问的问题的意图!公共变量a,在满足什么条件下,两线程的开始分配工作,你没有说清楚我假设你a==1时生产者工作,当a==2时,生产完成,线程2(即消费线程)开始工作即,打印a那么代码如下: #include <stdio.h>#include <stdlib.h>#include <pthread.h>pthread_

indows编程 句柄-关于winnt.h头文件中有关句柄(HANDLE)的一段源代码的两个疑问,求大神解答。

问题描述 关于winnt.h头文件中有关句柄(HANDLE)的一段源代码的两个疑问,求大神解答. 大家好!我对winnt.h中的这段代码有疑问: #ifdef STRICT typedef void *HANDLE; #if 0 && (_MSC_VER > 1000) #define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name #else #define DECLARE_HANDLE(nam

visual c++-VISUAL C++开发对话框的两个疑问

问题描述 VISUAL C++开发对话框的两个疑问 MFC不使用DOC/VIW模式,如何用CFile读取文本文件,并且显示在CEdit上.另外CEdit的高度怎么设置? 解决方案 http://xiaojun123hello.blog.163.com/blog/static/361666562011101933326392/http://www.cnblogs.com/ty--90/archive/2008/02/20/1075276.html

java-关于openjdk的两个疑问,基础问题..

问题描述 关于openjdk的两个疑问,基础问题.. 问题可能比较幼稚,本来想找一个windows版本的openjdk但是发现http://openjdk.java.net/ 上好像没有,那是不是意味着如果想要windows版本的openjdk只能自己下源码然后自行编译一个windows版本的openjdk?我接着搜索了windows版本怎么编译openjdk,然后看到一个帖子 http://blog.csdn.net/nannandetian/article/details/9146091 上

如何将一个项目中的功能加到另一个项目中,实现一次操作运行两个项目的功能

问题描述 如题,有两个项目分别实现两个功能,如何将一个项目中的功能加到另一个项目中,实现一次操作运行两个项目的功能 解决方案 解决方案二:第三个项目(解决方案),它应用了两个项目,调用(系统集成)了两个项目.这种事情,自己多想想.不要怕出错.你若没有动手动手能力,你就总想着哄别人给你一个源代码.你若有动手能力,你就不怕出错,而用你自己的实践来提问(而不是在刚刚空白的状态下提问).解决方案三:新建一个解决方案,将这两个项目加至同一个解决方案,然后在你的主项目中引用其他项目,就可以直接调用其他项目的

取datatable中的两列

问题描述 取datatable中的两列绑定到gridview中.谁知道?谢谢!!!! 解决方案 解决方案二:没看明白.其它列不用?为什么不在SQL里先筛选.解决方案三:在gridview就设置两个绑定列.绑到你相应的datatable列上.同意一楼的看法..不用的列为啥不在sql里去掉解决方案四:解决方法:可以使用ToTable方法,用法如下:DataTabledt=GetData();//这里假设是获取数据源DataTablenewdt=dt.DefaultView.ToTable(false

java 管道流的读写操作 用于两个线程之间的通信

  /* java 管道流的读写操作 用于两个线程之间    PipedOutputStream    PipedInputStream  连接起来就是一个管道     管道输出流可以向管道写入数据   管道输入流可以从管道读取数据     这种Decorator 装饰 的设计模式 大大增强了java流的功能  可以在构造流的时候连接 管道输入输出流 也可以通过connect函数连接 */ import java.io.*  ; class  PipeTest {  public  static

DataTable 操作问题

问题描述 SqlDataAdapterda=newSqlDataAdapter("select*from表",conn);DataSetds=newDataSet();da.Fill(ds,""); ds.Tables[0]获取到了数据,现在我想得到数据集里的前100-200行的数据,接下来怎么操作..我是菜鸟,请贴代码!!! 解决方案 解决方案二:本帖最后由 bdmh 于 2011-06-02 11:26:54 编辑解决方案三:datatable对象.select