none
为什么DataGridView中输入的文本会自动变为NULL? RRS feed

  • 问题

  • 在winForm控件datagridview中,通过bindingsource绑定数据表dataTable,此表来源于数据库中的一张表,其中有个字段:Na ,库中的类型为char(50),录入新行后,在保存时提示该列为NULL值,反复输入,反复保存都是这样。我在保存按钮中输入的代码如下:

    protected void 保存SToolStripButton_Click(object sender, EventArgs e)
            {
                this.bdsourceInfo.EndEdit();
                this.dgvInfo.EndEdit();
                try
                {
                    dpt.Update(ds.Tables[tb]);
                    ds.AcceptChanges();
                    MessageBox.Show("保存成功");
                }
                catch (SqlException ex)
                {
                    MessageBox.Show(string.Format("存在非法数据,保存失败:{0}", ex.Message));
                }
            }


    LJH

    2013年1月10日 3:41

答案

全部回复

  • Na 此列是否是隐藏列?你是否有录入值,数据库是否允许为null呢?

    认真的活,认真的爱!

    2013年1月10日 4:25
    版主
  • 楼主,上传代码到SkyDrive(如果不会,请点击我红色签名,查看第三部分)。我们分析看看。

    帮助一起改进论坛质量?提交你的意见于此。
    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2013年1月22日 8:46
    版主
  • 你好,你所給的code完全不足夠,根本看不出那裡出錯。請你補上多些code來

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    2013年1月23日 3:43
  • 你好,現在情況怎樣了?

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    2013年1月29日 9:14
  • 经过多方试验,发现一个问题:

    如果数据适配器的查询命令中还有Rtrim()之类的函数,那么datagridview在保存数据时就会把文本类的值变为NULL,所以在保存时会出现非法提示.

    我为何要在查询语句中使用去空格函数呢?原因很简单,如字段类型为CHAR(50),表格中显示的栏位不够宽,会在后边出现省略号,其实很多时候实际值根本没有这么长,所以要去空格,这样大部分值就不会显示省略号了,空格是去掉了,省略号没了,但保存时却出了问题.不管查询命令是存储过程还是查询语句,都不能用去空格函数.

    后来,我在表格控件的CellFormatting事件中写了以下代码去掉了字段值多余的空格,省略号没了,可以正常保存了,问题得到了真正的解决:

    private void dgvInfo_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {//绘制单元格内容时去掉value的空格,以免空格太多显示不下时出现省略号
                if (e.Value != null)
                {
                    e.Value = e.Value.ToString().Trim();//去空格
                }
            }

    出现问题的查询命令是下边这个样子的:

    SELECT  姓名=RTRIM(Na),地址=RTRIM(Addr) FROM tbUsers;

    这样的命令不论放在存储过程还是直接写在C#中,作为数据适配器的命令,那么在保存时会将表格控件中所有的文本都变为NULL值,如果你的数据库中该字段不允许NULL则出现非法提示,如果允许NULL,将会保存为NULL值,你所做的一切都是徒劳!望各位像我一样的菜鸟不再用TRIM()之类的函数去空格


    LJH


    • 已编辑 SZLJH 2013年2月1日 7:09
    2013年2月1日 7:00
  • 当然,在数据库设计阶段如果使用varchar(50)之类的数据类型,则不会出现多余的空格,不过某些书中介绍:varchar,nvarchar之类的数据类型存储效率比char/nchar要低,不知道到底会损失多少性能,本人没测试过,如果损失的性能不多的话,我想直接使用varchar()或nvarchar()设计数据库则更好,这样不必为了去空格伤脑筋

    LJH

    2013年2月1日 7:14
  • varXX(N)类型,最大长度是N。

    如果不足,有几个字符就取几个字符。而不带“var”的则会导致后面补充多余空格(凑成最大的长度)。


    帮助一起改进论坛质量?提交你的意见于此。
    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2013年2月1日 7:42
    版主