问题
i want to insert null date into access database if user payment choose as cash then cheque date should be insert as empty for this im using masked textbox , i use debugger also but every time debugger going else condition and for that its giving me data mismatch exception here is im giving my insert code
string bank = txtbankname.Text;
bank = "";
string cheque = txtchequeno.Text;
cheque = "";
string billno = txtbillno.Text;
billno = "";
string codecreate = txtcodecreator.Text;
codecreate = "";
string connetionString = null;
connetionString = ConfigurationManager.ConnectionStrings["AccessConnectionString"].ConnectionString;
cnn.ConnectionString = connetionString;
string SqlString = "Insert Into Billing([FormNo],[Date],[TruckNo],[Office_Code],[Party_Code],[Party_Code1],[Location],[Supplier],[Item],[Invoice_no],[Invoice_date],[Package],[Weight],[Invest_Amount],[Percentage],[Amount],[Total_Amount],[Payment_Amount],[Payment_Type],[Bank_Name],[Cheque_No],[Cheque_Date],[Bill_No],[Bill_Date],[Code_Create]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
using (cmd = new OleDbCommand(SqlString, cnn))
{
cnn.Open();
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@FormNo", txtformno.Text);
cmd.Parameters.AddWithValue("@Date", txtdate.Text);
cmd.Parameters.AddWithValue("@TruckNo", txttruck.Text);
cmd.Parameters.AddWithValue("@Office_Code", txtofficecode.Text);
cmd.Parameters.AddWithValue("@Party_Code", txtpartycode.Text);
cmd.Parameters.AddWithValue("@Party_Code1", txtpartycode1.Text);
cmd.Parameters.AddWithValue("@Location", txtlocation.Text);
cmd.Parameters.AddWithValue("@Supplier", txtsupplier.Text);
cmd.Parameters.AddWithValue("@Item", txtitem.Text);
cmd.Parameters.AddWithValue("@Invoice_no", txtinvoice.Text);
cmd.Parameters.AddWithValue("@Invoice_date", DateTime.Parse(txtmaskinvoice.Text));
cmd.Parameters.AddWithValue("@Package", txtpackage.Text);
cmd.Parameters.AddWithValue("@Weight", txtwieght.Text);
cmd.Parameters.AddWithValue("@Invest_Amount", Convert.ToDouble(txtinvestamount.Text));
cmd.Parameters.AddWithValue("@Percentage", txtpercentage.Text);
cmd.Parameters.AddWithValue("@Amount", Convert.ToDouble(txtamount.Text));
cmd.Parameters.AddWithValue("@Total_Amount", Convert.ToDouble(txttotalamount.Text));
cmd.Parameters.AddWithValue("@Payment_Amount", Convert.ToDouble(txtpaymentamount.Text));
cmd.Parameters.AddWithValue("@Payment_Type", txtpaymenttype.Text);
if (txtbankname.Text == "")
{
cmd.Parameters.AddWithValue("@Bank_Name", bank);
}
else
{
cmd.Parameters.AddWithValue("@Bank_Name", txtbankname.Text);
}
if (txtchequeno.Text == "")
{
cmd.Parameters.AddWithValue("@Cheque_No", cheque);
}
else
{
cmd.Parameters.AddWithValue("@Cheque_No", txtchequeno.Text);
}
DateTime chequeDate;
var value = (object)DBNull.Value;
if (DateTime.TryParseExact(txtmaskchequedate.Text,"dd/MM/yyyy",null,System.Globalization.DateTimeStyles.None, out chequeDate))
{
value = chequeDate;
cmd.Parameters.AddWithValue("@Cheque_Date", value);
}
else
{
cmd.Parameters.AddWithValue("@Cheque_Date",(txtmaskchequedate.Text));
}
if (txtbillno.Text == "")
{
cmd.Parameters.AddWithValue("@Bill_No", billno);
}
else
{
cmd.Parameters.AddWithValue("@Bill_No", txtbillno.Text);
}
DateTime BillDate;
var value1 = (object)DBNull.Value;
if (DateTime.TryParseExact(txtmaskbilldate.Text, "dd/MM/yyyy", null, System.Globalization.DateTimeStyles.None, out BillDate))
{
value1 = BillDate;
cmd.Parameters.AddWithValue("@Bill_Date", value1);
}
else
{
cmd.Parameters.AddWithValue("@Bill_Date", (txtmaskbilldate.Text));
}
if (txtcodecreator.Text == "")
{
cmd.Parameters.AddWithValue("@Code_Create", codecreate);
}
else
{
cmd.Parameters.AddWithValue("@Code_Create", txtcodecreator.Text.ToString());
}
int n = cmd.ExecuteNonQuery();
cnn.Close();
if (n > 0)
{
MessageBox.Show("Data Inserted Successfully", "Data Inserted ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
回答1:
You check in if there is a valid date entered in your textbox control. But if it is not you use the content of the textbox as parameter value anyway. - This certainly is not right.
As value
is initialized to DBNull, you can add the parameter in any case and don't need the else part of your code at all.
Change your code:
DateTime chequeDate;
var value = (object)DBNull.Value;
if (DateTime.TryParseExact(txtmaskchequedate.Text,"dd/MM/yyyy",null,System.Globalization.DateTimeStyles.None, out chequeDate))
{
value = chequeDate;
}
cmd.Parameters.AddWithValue("@Cheque_Date", value);
The exact same problem with adding the text from textbox even though it is invalid, exists for the @Bill_Date
parameter. Rewrite the code for that parameter according to my sample as well.
来源:https://stackoverflow.com/questions/36566423/how-to-insert-null-date-into-access