使用Windows窗体INSERT到Access数据库不工作,但不会抛出错误

时间:2015-02-24 05:42:51

标签: c# winforms datetime ms-access oledbcommand

我正在尝试将用户输入的数据插入到Windows窗体中的Access数据库中。在表单中,我使用了一个文本框,由db中的查找表填充的组合框和2个dateTimePickers。通过我自己的调试尝试,我想我已经缩小到dateTimePickers,但我不是100%肯定。我没有收到任何错误,没有异常被捕获,并且在执行查询后显示“成功消息”但没有任何内容添加到数据库中。

这是来自表单的方法调用:

try
{
    //get values from form
    int updatedRow;
    int ethnicityID = Convert.ToInt32(comboBoxEthnicity.SelectedValue);
    int genderID = Convert.ToInt32(comboBoxGender.SelectedValue);
    int raceID = Convert.ToInt32(comboBoxRace.SelectedValue);
    DateTime dob = dateTimePickerDoB.Value;
    DateTime dateOfConsent = dateTimePickerDateOfConsent.Value;
    int hhpid = Convert.ToInt32(textBoxHHPID.Text);

    //add new patient to db
    updatedRow = TrialDB.writePatient(dataSetTrial, ethnicityID, genderID, raceID, dob, dateOfConsent, hhpid);
    //success message, number of new patients added
    MessageBox.Show(updatedRow.ToString() + " patient record has been added to the database.");
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

以下是来自中间层的方法:

public static int writePatient(DataSetTrial dataSetTrial, int ethnicityID, int genderID, int raceID, DateTime dob, DateTime dateOfConsent, int hhpid)
{
    int addedRow;
    OleDbDataAdapter writePatientAdapter;

    try
    {
    //configure adapter
    writePatientAdapter = new OleDbDataAdapter();

    //insert command
    writePatientAdapter.InsertCommand = new OleDbCommand();
    writePatientAdapter.InsertCommand.CommandText = "INSERT INTO Patient (EthnicityID,GenderID,RaceID,DateOfBirth, " +
                                                                " DateOfConsent,HomeHealthPatientID) " +
                                                                " VALUES (?,?,?,?,?,?)";

     writePatientAdapter.InsertCommand.Connection = new     OleDbConnection(connectString);

     //insert command paramaters
     writePatientAdapter.InsertCommand.Parameters.Add("@EthnicityID", OleDbType.Integer);
     writePatientAdapter.InsertCommand.Parameters["@EthnicityID"].Value = ethnicityID; 


     writePatientAdapter.InsertCommand.Parameters.Add("@GenderID", OleDbType.Integer);
     writePatientAdapter.InsertCommand.Parameters["@GenderID"].Value = genderID; 

     writePatientAdapter.InsertCommand.Parameters.Add("@RaceID", OleDbType.Integer);
     writePatientAdapter.InsertCommand.Parameters["@RaceID"].Value = raceID;

     writePatientAdapter.InsertCommand.Parameters.Add("@DateOfBirth", OleDbType.Date);
     writePatientAdapter.InsertCommand.Parameters["@DateOfBirth"].Value = dob; 

     writePatientAdapter.InsertCommand.Parameters.Add("@DateOfConsent", OleDbType.Date);
     writePatientAdapter.InsertCommand.Parameters["@DateOfConsent"].Value = dateOfConsent; 

     writePatientAdapter.InsertCommand.Parameters.Add("@HomeHealthPatientID", OleDbType.Integer);
     writePatientAdapter.InsertCommand.Parameters["@HomeHealthPatientID"].Value = hhpid; 

    writePatientAdapter.InsertCommand.Connection.Open();

     addedRow = writePatientAdapter.Update(dataSetTrial, "Patient");

     }
     catch (Exception)
     {
         throw new ApplicationException(dbOrDeErrorMsg);
     }

         writePatientAdapter.InsertCommand.Connection.Close();

         return addedRow;
}

当我在调试模式下将DateTime变量添加到我的监视列表时,它无法评估来自dateTimePicker的格式的前导{。这就是我认为这是DateTime给我带来麻烦的原因。我直接尝试了DB中的INSERT语句并且它有效,但是当我手动输入时,我无法考虑日期格式。网络显示这样做有很多麻烦,但我找到的修复都没有帮助。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您正在混合两种不同的数据库访问方式。 一方面,您正在使用适用于数据集的适配器。您将对数据集中的表执行更改,然后在适配器上调用update。 但是您正在控制适配器内部的commmand对象本身传递参数值,只有在没有适配器的情况下从头开始使用命令时才会这样做。

我建议你google一下,找到正确使用的命令

你离解决方案只是实例化插入命令并不远,你已经这样做了,但只是为它创建自己的变量,不要使用适配器,并自己通过insertcommand进行更新。

你需要在insertcommand上使用这个api:

https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executenonquery(v=vs.110).aspx

只是丢失了适配器,在这个例子中你不需要它。

现在您没有看到任何错误的原因是因为没有任何更新发生。您没有对数据集进行任何更改,并且适配器上的更新不会执行任何操作。

public static int writePatient(DataSetTrial dataSetTrial, int ethnicityID, int genderID, int raceID, DateTime dob, DateTime dateOfConsent, int hhpid)
{
    int addedRow;
    //OleDbDataAdapter writePatientAdapter; don't need this

    try
    {
    //configure adapter
    //writePatientAdapter = new OleDbDataAdapter(); no, you don't need it

    //insert command
    var InsertCommand = new OleDbCommand();
    InsertCommand.CommandText = "INSERT INTO Patient (EthnicityID,GenderID,RaceID,DateOfBirth, " +
                                                                " DateOfConsent,HomeHealthPatientID) " +
                                                                " VALUES (?,?,?,?,?,?)";

    InsertCommand.Connection = new     OleDbConnection(connectString);

     //insert command paramaters
    InsertCommand.Parameters.Add("@EthnicityID", OleDbType.Integer);
     writePatientAdapter.InsertCommand.Parameters["@EthnicityID"].Value = ethnicityID; 


    InsertCommand.Parameters.Add("@GenderID", OleDbType.Integer);
     writePatientAdapter.InsertCommand.Parameters["@GenderID"].Value = genderID; 

    InsertCommand.Parameters.Add("@RaceID", OleDbType.Integer);
     writePatientAdapter.InsertCommand.Parameters["@RaceID"].Value = raceID;

    InsertCommand.Parameters.Add("@DateOfBirth", OleDbType.Date);
     writePatientAdapter.InsertCommand.Parameters["@DateOfBirth"].Value = dob; 

    InsertCommand.Parameters.Add("@DateOfConsent", OleDbType.Date);
     writePatientAdapter.InsertCommand.Parameters["@DateOfConsent"].Value = dateOfConsent; 

    InsertCommand.Parameters.Add("@HomeHealthPatientID", OleDbType.Integer);

    InsertCommand.Parameters["@HomeHealthPatientID"].Value = hhpid; 

    InsertCommand.Connection.Open();

    addedRow = InsertCommand.executeNonQuery();

     }
     catch (Exception)
     {
         throw new ApplicationException(dbOrDeErrorMsg);
     }

         InsertCommand.Connection.Close();

         return addedRow;
}

这是我认为应该让你去的,没有测试它,你现在可能遇到不同的问题。