C#Datepicker值未保存在MySql数据库中

时间:2015-04-23 14:30:54

标签: c# mysql datetimepicker

我使用C#Winforms创建一个Master / Detail的凭证系统,使用MySql作为后端。创建凭证类以设置以下内容:

1.创建新凭证 2.保存凭证 3.查询凭证

目前我遇到了保存凭证的问题,我设置了插入/更新/删除命令,为了简化这篇文章我发布了插入命令,以便明确应用程序的概念:

类变量

// primaryStage.setScene(new Scene((Parent) scene));
primaryStage.setScene(new Scene(scene.getView()));

以下是NewVoucher程序,它将使用空白记录设置VoucherForm:

    ClsMgt da = new ClsMgt();

    MySqlDataAdapter sqlDataMaster = new MySqlDataAdapter();
    private DataSet oDs = null;
    MySqlCommand selectcommand = null;
    MySqlCommand insertcommand = null;
    MySqlCommand updatecommand = null;
    MySqlCommand deletecommand = null;
    private DataTable dt = null;
    private DataTable dtDet = null;
    private String sSelProcName = null;
    private String sInsProcName = null;
    private String sDelProcName = null;
    private String sUpdProcName = null;
    private int voucType;

    public MySqlConnection oCn = new MySqlConnection();
    MySqlTransaction oTrn = null;

以下是SaveVoucher程序:

 public DataSet NewVoucher()
    {
        DataSet vDs = new DataSet();
        oCn = da.GetConnection();

        if (oCn == null)
        {
            oCn.Open();
        }
        try
        {

            DataTable dt = new DataTable();

            //===============================================================================
            //--- Set up the Select Command
            //===============================================================================
            String sqlSelect = "Select vID, vTypeID, vNo, accCodeDR, accCodeCR, vDate, vChqNo, vChqDt, vPayName, vRemarks, vAmount from vMaster";
            sqlDataMaster = new MySqlDataAdapter(sqlSelect, oCn);
            sqlDataMaster.FillSchema(dt, SchemaType.Source);
            vDs.Tables.Add(dt);

            VoucherDetails vdet = new VoucherDetails();
            DataTable dtDet = new DataTable();
            dtDet = vdet.NewVoucherDet();

            vDs.Tables.Add(dtDet);

            vDs.Tables[0].Columns["vID"].AutoIncrement = true;
            vDs.Tables[0].Columns["vID"].AutoIncrementSeed = -1;
            vDs.Tables[0].Columns["vID"].AutoIncrementStep = -1;

            vDs.Tables[1].Columns["vID"].AutoIncrement = true;
            vDs.Tables[1].Columns["vID"].AutoIncrementSeed = -1;
            vDs.Tables[1].Columns["vID"].AutoIncrementStep = -1;
            vDs.EnforceConstraints = false;
            vDs.Relations.Add("VouchersToVoucherDetails", vDs.Tables[0].Columns["vID"], vDs.Tables[1].Columns["vID"]);

        }
        catch (MySqlException e)
        {
            MessageBox.Show(e.ToString());
        }

        return (vDs);
    }

使用参数化的StoredProc在MySql数据库中保存数据,对于使用StoredProc后的插入记录:

 public void SaveVoucher(DataSet oDs)
    {
        oCn = da.GetConnection();
        oTrn = oCn.BeginTransaction();
        sqlDataMaster = new MySqlDataAdapter();
        try
        {

            if (oCn == null)
            {
                oCn.Open();
            }

            //===============================================================================
            //--- Set up the INSERT Command
           //===============================================================================
            sInsProcName = "prInsert_Voucher";
            insertcommand = new MySqlCommand(sInsProcName, oCn, oTrn);
            insertcommand.CommandType = CommandType.StoredProcedure;
            insertcommand.Parameters.Add(new MySqlParameter("nNewID", MySqlDbType.Int32, 0, "vID"));
            insertcommand.Parameters["nNewID"].Direction = ParameterDirection.Output;
            insertcommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
            insertcommand.Parameters.Add("svTypeID", MySqlDbType.Int32,0, "vTypeID");
            insertcommand.Parameters.Add("svNo", MySqlDbType.Int32, 0, "vNo");
            insertcommand.Parameters.Add("svaccCodeDR", MySqlDbType.VarChar, 12, "accCodeDR");
            insertcommand.Parameters.Add("svaccCodeCR", MySqlDbType.VarChar, 12, "accCodeCR");
            insertcommand.Parameters.Add("svDate", MySqlDbType.DateTime);
            insertcommand.Parameters["svDate"].SourceColumn = "vDate";
            insertcommand.Parameters.Add("svChqNo", MySqlDbType.Int32, 0, "vChqNo");
            insertcommand.Parameters.Add("svChqDt", MySqlDbType.DateTime);
            insertcommand.Parameters["svChqDt"].SourceColumn = "vChqDt";
            insertcommand.Parameters.Add("svPayName", MySqlDbType.VarChar, 100, "vPayName");
            insertcommand.Parameters.Add("svRemarks", MySqlDbType.VarChar, 70, "vRemarks");
            insertcommand.Parameters.Add("svAmount", MySqlDbType.Double, 0, "vAmount");

            sqlDataMaster.InsertCommand = insertcommand;
            //===============================================================================
            //--- Set up the UPDATE Command
            //===============================================================================
            sUpdProcName = "prUpdate_Voucher";
            updatecommand = new MySqlCommand(sUpdProcName, oCn, oTrn);
            updatecommand.CommandType = CommandType.StoredProcedure;
            updatecommand.Parameters.Add("nNewID", MySqlDbType.Int32, 4, "vID");
            updatecommand.Parameters.Add("svTypeID", MySqlDbType.Int32, 0, "CustomerID");
            updatecommand.Parameters.Add("svNo", MySqlDbType.Int32, 0, "vNo");
            updatecommand.Parameters.Add("svaccCodeDR", MySqlDbType.VarChar, 12, "accCodeDR");
            updatecommand.Parameters.Add("svaccCodeCR", MySqlDbType.VarChar, 12, "accCodeCR");
            updatecommand.Parameters.Add("svDate", MySqlDbType.DateTime);
            updatecommand.Parameters["svDate"].SourceColumn = "vDate";
            updatecommand.Parameters.Add("svChqNo", MySqlDbType.Int32, 0, "vChqNo");
            updatecommand.Parameters.Add("svChqDt", MySqlDbType.Date);
            updatecommand.Parameters["svChqDt"].SourceColumn = "vChqDt";
            updatecommand.Parameters.Add("svPayName", MySqlDbType.VarChar, 100, "vPayName");
            updatecommand.Parameters.Add("svRemarks", MySqlDbType.VarChar, 70, "vRemarks");
            updatecommand.Parameters.Add("svAmount", MySqlDbType.Double, 0, "vAmount");
            sqlDataMaster.UpdateCommand = updatecommand;

           //===============================================================================
            //--- Set up the DELETE Command
            //===============================================================================
            sDelProcName = "prDelete_Voucher";
            deletecommand = new MySqlCommand(sDelProcName, oCn, oTrn);
            deletecommand.CommandType = CommandType.StoredProcedure;
            deletecommand.Parameters.Add("nNewID", MySqlDbType.Int32, 4, "vID");
            sqlDataMaster.DeleteCommand = deletecommand;

            sqlDataMaster.Update(oDs.Tables[0]);
            VoucherDetails vDet = new VoucherDetails();
            vDet.SaveVoucher(oTrn, oDs.Tables[1]);

            oTrn.Commit();
            MessageBox.Show("Records saved.", "Saving Records");

        }
        catch (MySqlException e)
        {
            //===============================================================================
            //--- Rollback the transaction
            //===============================================================================
            oTrn.Rollback();
            //MessageBox.Show(e.ToString());
            MessageBox.Show(e.Message +" Error code: "+ e.Number);
            oDs.Tables[0].Rows[0]["vNo"] = DBNull.Value;

        }

    }

问题: vChqDt是MySql DateTime字段,我在C#Winform中使用DateTimePicker供用户选择日期。 svChqDt是我在SaveVoucher过程中使用的参数,所有字段都被正确保存,除了vChqDt ....它只获得NULL。我在这个论坛上搜索解决方案,并发现使用ToString将日期格式更改为yyyy-mm-dd就可以了。但问题是我应该把它放在哪里?

编辑:(原因=添加表单代码)

DELIMITER $$
USE `generalledger`$$

DROP PROCEDURE IF EXISTS `prInsert_Voucher`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `prInsert_Voucher`(
IN svTypeID INT, 
IN svNo INT, 
IN svaccCodeDR VARCHAR(12),
IN svaccCodeCR VARCHAR(12), 
IN svDate DATETIME,
IN svChqNo INT, 
IN svChqDt DATETIME, 
IN svPayName VARCHAR(100), 
IN svRemarks VARCHAR(70), 
IN svAmount DOUBLE,  
OUT nNewID INT)
BEGIN

INSERT INTO vMaster (vTypeID, vNo, accCodeDR,accCodeCR,vDate, vChqNo, vChqDt, vPayName, vRemarks, vAmount)
VALUES (svTypeID, svNo, svaccCodeDR, svaccCodeCR, svDate, svChqNo, svChqDt, svPayName, svRemarks, svAmount);
SET nNewID = LAST_INSERT_ID();
END$$

DELIMITER ;

1 个答案:

答案 0 :(得分:0)

好的,我让它工作..只需要改变这个:

txtChqDt.DataBindings.Add(new Binding("Text", bs, "vChqDt"));

txtChqDt.DataBindings.Add(new Binding("Value", bs, "vChqDt", true));

由于

艾哈迈德