C#中的DateTime 及 数据库与TextBox的关联

 据说,积累经验是个好事儿,这就把这几天遇见的问题记录一下吧,免得哪天又洗脑了那损失就惨重了。

DateTime
DateTime 估计与UNIX时间戳类似,反正是个很精确的记录时间的类型,不过一是可以方便地转换成各种格式的string输出,二是比较精确,单位应该是 Ticks,即CPU时钟周期。用DateTime做数据库的索引是个不错的选择(当然,也可以设成int,然后自动增长),可以保证唯一性又便于按记录 的创建时间排序。只是发现,Sql Server里的DateTime类型比C#里的精度要低,至少要低10^+4,因为好好的DateTime.Now插入到数据库之后再输出,就发现 Ticks的最后四位都是0了,倒数第5位还不是截断出来的,也搞不清是四舍五入还是什么,比如xxxxxxxxxxxx567890,插到数据库里,就 可能变成xxxxxxxxxxxx560000,也可能是570000,还可能是580000或者550000……
另外,DataGridView的Cell显示只到秒量级,所以要使用Convert.toDateTime(Cell[x].value.toString())去数据库里查询,是万万不幸的。。。精度下降了,只到秒量级的话Ticks的最后7位都是0
好在,解决办法是肯定有的,就是取DataGridView的Cells[x].value做查询
如果想省去这些麻烦,对记录的具体插入时间不可以要求的话,用int型键值让它自动增长,也是个不错的选择。

数据库与TextBox关联
数 据库表格(DataGridView),放在页面上直接修改,据说不大安全,每个格子都挤在一块儿,也不大漂亮,说不定还不能用Tab键,所以每个表项做 个Textbox用来输入是个不错的主意。如果把Textbox和数据库的列绑定起来,就可以实现选中哪一行(或者该行的某个格子),textbox里的 内容就会跟着变。如果想添加表项,用Add函数就可以,textbox和数据库表格是等效的。
这看着确实不错,但有个问题,就是一旦修改 textbox的内容,那数据库的表格内容也会跟着变,就跟直接修改DataGridView一样,如果选中某格子之后,因为某种原因清空了 textbox,再去选中其他格子,那原来的格子内容就变了。。。这样,不是掩耳盗铃么?本质上还是直接修改了数据库,充其量只是改善了界面,让从前挤在 一块儿的格子们变成了TextBoxes...
所以如果想真正达到安全、美观,我的办法就是不绑定,这样如果添加一行的话,就只能用Insert 函数,一个个取textbox内容,一块儿插入数据库,如果想让textbox内容随着DataGridView格子的选中而改变,那就用 DataGridView类的CurrentCellChanged函数,不过里面要注意加上判断currentcell是否有效,有效则让每个 textbox内容=cell的value,无效则啥都不干,否则会在数据库内容不空的时候,打开程序,报错。据我猜测可能是在表格还没有load完的时 候,该函数就会被调用,原因未知。。。不过,加判断也是个好习惯,赖不得人家C#讨厌。
与CurrentCellChanged类似的还有两个函 数,CellClick和CellContentClick,一个是cell被单击的时候调用,平时的效果和CurrentCellChanged类似, 但是如果用键盘上下箭头改变currentCell就没法被调用,同样,由于上面的表项被删除于是currentcell自动移到下一行的情况下,此函数 也不生效,所以,如果想模拟关联的效果,还是用CurrentCellChanged的好。至于CellContentClick,一定要鼠标点击到 Cell的内容时才被调用,点击到空白处则不生效。。。这准头儿要求的也太严格了。。。真想不到啥情况会用到这函数。。。

明天就报到了。 前些天一直各种不舍,各种纠结,找各种机会在家呆着。可能是因为该办的大事儿,这两天竟然不知不觉地就瞬间都办得差不多了吧,不再担心开学了还得为这些事 儿忙活,于是现在倒不觉得怎么别扭了。上次去学校,还自己修理了车呢。就剩机器没有格,网页没有写。。。车都自己搞定了,我不会怕它们的。

明天,将是混乱忙碌的一天,将见到我未来的舍友们,将买个新脑脑,将是个new start!
真奇怪,纠结了怨念了这么多天,不知道为什么现在敢说这句话了。。。反正现在觉得,我可以学着不再纠结,忘掉所有不该属于我的东西,开始努力茁壮、快乐地活着了眨眼

版权声明:本文为xiaoyuemian原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。