none
为什么窗体datagridview中录入的新记录某些列会变为NULL值 RRS feed

  • 问题

  • 1.窗体frmInfo中拖入一个datagridview控件dgvInfo;

    2.使用数据适配器adpt把数据库表的有6个字段填充到数据集ds.tables["tb"],查询使用一个"存储过程",

       同时用new SqlCommandBuilder(adpt)创建数据库操作命令;

    3.在窗体LOAD时,设置bindingsource控件bdsrcInfo的数据源为ds.tables["tb"],设置dgvInfo的数据源为

      bdsrcInfo;

    4.启动调试运行程序,能正常显示数据,但新增记录在保存时,有两个字段虽然输入了文本,却总是提示为NULL值导致保存失败; 而这两个字段在数据库中为:

    Na:char(50) Not NULL;addr:char(50) Not Null;

    5.我试着在数据库中把这两个字段改为允许NULL,再在窗体中录入文本,保存后,进数据库查看其它字段已保存,而这两个字段还是空白;

    这是我编程以来遇到的怪事,为什么这两列录入的值“只能看,不能保存”呢?哪些原因可能引起表格控件录入的值变为NULL?

    望各位老师不吝赐教,先谢过!


    LJH

    2013年1月12日 9:52

答案

  • 谢谢肖小勇老师的帮助,使用类型化数据集可以解决问题,但不够灵活。通过各种调试方法,我最终找到了这个问题的根源,写出来希望各位新手不再遇到类似问题:

    原来在创建数据适配器SqlDataAtapter时,我使用了一个存储过程作为SELECT命令,命令类型使用了commandType.StoredProcedure,当我把这个过程直接改为一条查询语句,把命令类型改为commandType.Text时问题就解决了,控件中录入的值不再提示为NULL可以正常保存。

    但我还有一点不明白:存储过程作为数据适配器的命令字符串时,为什么录入的文本型数据在保存会提示为NULL,不能保存,而数字型的数据则不会提示为NULL并且可以保存?而导致同一行新记录中的数字型字段可保存,而其它文本型字段不能保存?这是什么原理呢?希望各位老师帮我分析分析!


    LJH

    • 已标记为答案 SZLJH 2013年1月14日 3:51
    • 取消答案标记 SZLJH 2013年1月14日 3:52
    • 已标记为答案 SZLJH 2013年1月14日 3:52
    2013年1月14日 3:50
  • 你好!

    你说的这个问题在我们使用 DataSet 的时期时常出现,原因是数据库字段不允许为 NULL 但我们在为 DataTable 新增行时 DataTable 默认不会为所有字段设上默认值,这样在更新到数据库时产生了上述问题。

    我一般不会使用 DataGridView 行上直接新增的功能,使用弹出一个窗体或在界面上单独划开一个区域来填写新增的内容,这样在只在的同时把所有字段都赋上默认值,同时也避免了上述问题也得到了更新好用户体验。

    另外类型化数据集不需要你去关心过多的与数据库交互的问题,从而有更多的时候关心业务,如果你们现在的程序是基于 DataSet 建议你多了解一下。如果不是 Entity Framework 也是与数据交互的组件也是是目前微软主推的方向可以多看看。


    知识改变命运,奋斗成就人生!

    • 已标记为答案 SZLJH 2013年1月14日 7:37
    2013年1月14日 6:11
    版主

全部回复

  • 此题真怪,希望各位高手、各位版主、各位老师、各位路人不吝赐教,照顾新手!!

    补充一下:我用VS2010 C#编程,这是个窗体编程问题,在该编程环境里原来是可以这样修改并保存到数据库的。为了更好地学习DataGridView控件,我不过是模仿别人的做法,新建了一个类,这个类就是一个自定义的DataGridView控件,我在这个新建类里重写了处理Enter键的两个方法以便按回车键在单元格中向右移动,这个效果已实现了。可现在:即使不用这个自定义的datagridview做控件,直接用原始的datagridview拖入窗体,在新行中录入了数据,但在保存到数据库之前就是NULL值,好像我从来未录入过数据一样,但有一列是ID值,录入一个数字后,却不会为Null,而另外几个文本型的列,录入了就好像没录入一样,保存时总是提示为NULL不能插入数据库中,因为数据库中这几个字段是不允许NULL的。这个问题很明显,是在保存之前,表格中录入的数据“未生效”。我试着把数据库的这几个字段改变为允许NULL,保存记录后,在库中查看,只有ID字段有值,其它都是NULL.

    我反复检查了表格控件的设置:允许用户添加、删除、修改的属性都为true,EditModeOnEnter

    想了很多办法也没解决这个问题,不知道为什么录入的文本型值未生效?这种情况是否与protect overrid  bool processDataGridViewKey() {……}有关?


    LJH

    2013年1月13日 13:50
  • 我已为此苦想了一周始终不得其法,急盼版主、各位老师赐教!!!

    请各位英雄帮“顶”!


    LJH

    2013年1月13日 13:53
  • 你好!

    使用类型化数据集能使你上面的大部分代码自动生成,也能避免产生你上述问题。详细信息参考:

    如何创建类型化数据集:http://msdn.microsoft.com/zh-cn/library/04y282hb(v=vs.80).aspx


    知识改变命运,奋斗成就人生!

    • 已标记为答案 SZLJH 2013年1月14日 3:38
    • 取消答案标记 SZLJH 2013年1月14日 3:52
    2013年1月14日 3:13
    版主
  • 谢谢肖小勇老师的帮助,使用类型化数据集可以解决问题,但不够灵活。通过各种调试方法,我最终找到了这个问题的根源,写出来希望各位新手不再遇到类似问题:

    原来在创建数据适配器SqlDataAtapter时,我使用了一个存储过程作为SELECT命令,命令类型使用了commandType.StoredProcedure,当我把这个过程直接改为一条查询语句,把命令类型改为commandType.Text时问题就解决了,控件中录入的值不再提示为NULL可以正常保存。

    但我还有一点不明白:存储过程作为数据适配器的命令字符串时,为什么录入的文本型数据在保存会提示为NULL,不能保存,而数字型的数据则不会提示为NULL并且可以保存?而导致同一行新记录中的数字型字段可保存,而其它文本型字段不能保存?这是什么原理呢?希望各位老师帮我分析分析!


    LJH

    • 已标记为答案 SZLJH 2013年1月14日 3:51
    • 取消答案标记 SZLJH 2013年1月14日 3:52
    • 已标记为答案 SZLJH 2013年1月14日 3:52
    2013年1月14日 3:50
  • Hi SZLJH,

      欢迎来到MSDN 中文论坛。

      你最好将你的具体的代码贴出来,这样才能便于我们解决你的具体问题。

     


    Jason Wang [MSFT]
    MSDN Community Support | Feedback to us

    2013年1月14日 3:52
    版主
  • 你好!

    你说的这个问题在我们使用 DataSet 的时期时常出现,原因是数据库字段不允许为 NULL 但我们在为 DataTable 新增行时 DataTable 默认不会为所有字段设上默认值,这样在更新到数据库时产生了上述问题。

    我一般不会使用 DataGridView 行上直接新增的功能,使用弹出一个窗体或在界面上单独划开一个区域来填写新增的内容,这样在只在的同时把所有字段都赋上默认值,同时也避免了上述问题也得到了更新好用户体验。

    另外类型化数据集不需要你去关心过多的与数据库交互的问题,从而有更多的时候关心业务,如果你们现在的程序是基于 DataSet 建议你多了解一下。如果不是 Entity Framework 也是与数据交互的组件也是是目前微软主推的方向可以多看看。


    知识改变命运,奋斗成就人生!

    • 已标记为答案 SZLJH 2013年1月14日 7:37
    2013年1月14日 6:11
    版主
  • 再次感谢肖小勇老师的热心解答,让我在学编程的路上又前进了一步,谢谢!

    同时,也希望有更多的热心肠来帮助我等新手进步,在此,向各位无私奉献的老师们致敬!


    LJH

    2013年1月14日 7:40