none
C#-日期列如何输入null值? RRS feed

  • 问题

  • 数据表有一个MaturityDate列,是Date类型,允许null,这日期是可以贷款时才输入。当不可以贷款而误输入日期后,想要修改为没有日期的null值时该如何设置?

    该列是绑在一个文本框上,文本框的Text该如何设置null值?

    2012年7月17日 5:01

答案

  • 您好,

    请问您的号码是PK的吗?

    我用一个范例来测试,运作上是确定的哦!

    1.建立测试的的SQL

    DROP TABLE buy;
    
    CREATE TABLE buy
    (
    [No] INT
    , BuyDate DATETIME
    , UnitCost INT
    , MatDate DATETIME
    , CONSTRAINT pk_buy_Id PRIMARY KEY ([No])
    );
    
    INSERT INTO dbo.buy
            ( No ,
              BuyDate ,
              UnitCost ,
              MatDate
            )
    VALUES  ( 1 , -- No - int
              '2012-07-18 08:31:48' , -- BuyDate - datetime
              100 , -- UnitCost - int
              '2012-07-18 08:31:48'  -- MatDate - datetime
            );
    
    
    SELECT * FROM buy;
    2.测试的代码。
    private void button1_Click(object sender, EventArgs e)
    {
    	SqlConnection cn = new SqlConnection();
    	DataSet ds = new DataSet();
    	SqlDataAdapter da;
    	SqlCommandBuilder cmdBuilder;
    	cn.ConnectionString = "Server=localhost;Database=TEST;UID=sa;PWD=okok;";
    	cn.Open();
    	da = new SqlDataAdapter("select [No], UnitCost, MatDate 'Jatuh_Tempo' from buy order by [No]", cn);
    	cmdBuilder = new SqlCommandBuilder(da);
    	cmdBuilder.ConflictOption = ConflictOption.OverwriteChanges;
    	//Populate the DataSet by running the Fill method of the SqlDataAdapter.
    	da.Fill(ds, "buy");
    	MessageBox.Show(ds.Tables["buy"].Rows[0]["Jatuh_Tempo"].ToString());
    	//Modify the value of the CustName field.
    	ds.Tables["buy"].Rows[0]["Jatuh_Tempo"] = DBNull.Value;
    	DataTable dtModify = ds.Tables["buy"].GetChanges();
    	////Post the data modification to the database.
    	da.Update(ds, "buy");
    	//Close the database connection.
    	cn.Close();
    }
    3.您可以看有改变的数据


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已标记为答案 栾涅 2012年7月18日 10:03
    2012年7月18日 8:44

全部回复

  • 你文本框什么也不要输入。或者尝试人为赋值:

    TextBox1.Text = DbNull.Value;

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月17日 5:24
    版主
  • 我的代码是这样的:

          //根据复选框的选择来设置dtpMatDate和tbxMatDate的贷款到期日
          private void chxCredit_Click(object sender, EventArgs e)
          {
             if (chxCredit.Checked)
             {
                tbxMatDate.Text = DateTime.Now.AddMonths(1).ToShortDateString();
                dtpMatDate.Value = DateTime.Now.AddMonths(1);
             }
             else
             {
                dtpMatDate.Value = DateTime.Now;

                tbxMatDate.Text = DBNull.Value; //出错!
             }
          }

    尝试用您的建议,但出错:错误 3 无法将类型“System.DBNull”隐式转换为“string” C:\A-Bizdata\Programming\C# Sample\EasyMeal\EasyMeal\BuyForm.cs 345 31 EasyMeal

    2012年7月17日 8:59
  • 您好,

    tbxMatDate.Text = string.Empty;

    只是您在更新  数据表 時,把空字串转成 DBNull.Value。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已标记为答案 栾涅 2012年7月17日 9:44
    • 取消答案标记 栾涅 2012年7月17日 10:33
    2012年7月17日 9:12
  • 您好!解决了,谢谢您!我把代码修改如下:

          //根据复选框的选择来设置dtpMatDate和tbxMatDate的贷款到期日
          private void chxCredit_Click(object sender, EventArgs e)
          {
             if (chxCredit.Checked)
             {
                tbxMatDate.Text = DateTime.Now.AddMonths(1).ToShortDateString();
                dtpMatDate.Value = DateTime.Now.AddMonths(1);
             }
             else
             {
                dtpMatDate.Value = DateTime.Now;
                tbxMatDate.Text = string.Empty;
                dgvBuy[8, dgvBuy.CurrentCell.RowIndex].Value = DBNull.Value;
             }
          }

    2012年7月17日 9:44
  • 乱马客,您好!

    对不起!我发现DataGridView里的MatDate均可以设置为DBNull.Value,但执行SqlDataAdapter.Update()后日期仍然存在,不知什么问题?

    2012年7月17日 10:32
  • 您好,

    可以貼出您的代碼嗎?

    在update時,DataTable中的值是DBNull嗎?

    Thanks.

    C#使用SqlDataAdapter.Update更新数据库


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年7月17日 11:11
  • 您好!Update的代码很简单:

          //更新数据
          private void btnUpdate_Click(object sender, EventArgs e)
          {
             try
             {
                bsBuy.EndEdit();
                daBuy.Update(dsBuy, "buy");
                tbxUpdate.ForeColor = Color.Gainsboro;
                tbxUpdate.Text = "Telah update pd " + System.DateTime.Now.ToString();
             }
             catch (SqlException f)
             {
                MessageBox.Show("Update gagal - Error Code " + f.ErrorCode.ToString());
             }
          }

    现在的问题是其他列可以Update,唯独MatDate不能。至于DataTable里的值是否已是DBNull.Value,我在上面的chxCredit_Click事件处理器里已有下列语句修改DataGridView里的值,不知是否有效?

          tbxMatDate.Text = string.Empty;

          dgvBuy[8, dgvBuy.CurrentCell.RowIndex].Value = DBNull.Value;

    现在可能是绑定的tbxMatDate必须直接输入DBNull.Value?

    2012年7月18日 2:06
  • 您好,

    請試一下,一併更新 DataTable中的值為DBNull.Value!

     
    dsBuy.Tables["buy"].Rows[dgvBuy.CurrentCell.RowIndex]["MatDate"] = DBNull.Value;


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年7月18日 2:40
  • 您好,我试了,错误提示是:

    Column 'MatDate' does not belong to table buy.

    但很奇怪,MatDate确实有在buy数据表里,我的查询句是这样的:

          string sqlBuy = "SELECT No, BuyDate 'Tgl_Beli'," +
                                "SID, PID, Quantity 'Jumlah'," +
                                "UnitCost 'Hrg_Pokok'," +
                                "Credit 'Cr'," +
                                "Discountable 'Disc'," +
                                "MatDate 'Jatuh_Tempo' FROM buy";

    另外一些相关的代码如下:(da=dataadapter, dt=datatable, dv=dataview, bs=bindingsource, ds=dataset)

          daBuy.Fill(dsBuy, "buy");
          conn.Close();
          dtBuy = dsBuy.Tables["buy"];
          dgvBuy.DataSource = dtBuy;
          dvBuy = dtBuy.DefaultView;
          bsBuy.DataSource = dsBuy.Tables["buy"];

    2012年7月18日 3:15
  • MatDate 變成了 Jatuh_Tempo了。

    MatDate 'Jatuh_Tempo' FROM buy

     


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年7月18日 3:44
  • 对,我忘了,这回没有错误提示,但Update后仍然无效!不知为何?
    2012年7月18日 4:24
  • 您好,

    可以取 DataTable.GetChanges 屬性 看一下修改的欄位是否為 DBNull.Value。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年7月18日 5:25
  • 您好!看了DataTable.GetChanged的帮助文件,满头雾水,不知该如何用它来查看栏位值,可否给一个查看MatDate的例子?
    2012年7月18日 8:15
  • 您好,

    请问您的号码是PK的吗?

    我用一个范例来测试,运作上是确定的哦!

    1.建立测试的的SQL

    DROP TABLE buy;
    
    CREATE TABLE buy
    (
    [No] INT
    , BuyDate DATETIME
    , UnitCost INT
    , MatDate DATETIME
    , CONSTRAINT pk_buy_Id PRIMARY KEY ([No])
    );
    
    INSERT INTO dbo.buy
            ( No ,
              BuyDate ,
              UnitCost ,
              MatDate
            )
    VALUES  ( 1 , -- No - int
              '2012-07-18 08:31:48' , -- BuyDate - datetime
              100 , -- UnitCost - int
              '2012-07-18 08:31:48'  -- MatDate - datetime
            );
    
    
    SELECT * FROM buy;
    2.测试的代码。
    private void button1_Click(object sender, EventArgs e)
    {
    	SqlConnection cn = new SqlConnection();
    	DataSet ds = new DataSet();
    	SqlDataAdapter da;
    	SqlCommandBuilder cmdBuilder;
    	cn.ConnectionString = "Server=localhost;Database=TEST;UID=sa;PWD=okok;";
    	cn.Open();
    	da = new SqlDataAdapter("select [No], UnitCost, MatDate 'Jatuh_Tempo' from buy order by [No]", cn);
    	cmdBuilder = new SqlCommandBuilder(da);
    	cmdBuilder.ConflictOption = ConflictOption.OverwriteChanges;
    	//Populate the DataSet by running the Fill method of the SqlDataAdapter.
    	da.Fill(ds, "buy");
    	MessageBox.Show(ds.Tables["buy"].Rows[0]["Jatuh_Tempo"].ToString());
    	//Modify the value of the CustName field.
    	ds.Tables["buy"].Rows[0]["Jatuh_Tempo"] = DBNull.Value;
    	DataTable dtModify = ds.Tables["buy"].GetChanges();
    	////Post the data modification to the database.
    	da.Update(ds, "buy");
    	//Close the database connection.
    	cn.Close();
    }
    3.您可以看有改变的数据


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已标记为答案 栾涅 2012年7月18日 10:03
    2012年7月18日 8:44
  • 您好,您的回复是正确的,我另创建一个工程来试验,确实有效。只是我目前在做的这个工程还是不能更改,可能是有用BindingSource对象的缘故?
    2012年7月18日 10:06
  • 您好,

    可以检查一下,GetChanges()出来的值,是否已改为Null。

    另外,也可看一下 da 的 UpdateCommand.CommandText 。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年7月18日 10:41
  • 您好!我知道问题出在BindingNavigator(bn)或BindingSource(bs),因为我在bn的MoveNextItem和MovePreviousItem事件中设置DGV的当前单元格时,可能把DGV和bs的索引搞混了?如果在调用Update前点击一下MoveNext或MovePrevious,Update就有效!

          private void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e)
          {
             if (dgvBuy.CurrentCell.RowIndex > 0)
             {
                dgvBuy.CurrentCell = dgvBuy[0, dgvBuy.CurrentCell.RowIndex - 1];
             }
          }

    bs的索引是Position,请问如何设置bn的索引?

    2012年7月19日 4:41