0

当我想在我的 Access 数据库中保存一行时,我遇到了问题。当我想在没有检查 Herinneringsmail 的情况下保存它时,它可以工作,当我检查 Herinneringsmail 时,它不起作用。所以错误出现在下面的“If(ckbHerinneringsmail.Checked){...}”中。我在标准表达式中得到 OledbException 数据类型不匹配。当我想插入行并且想用 Herinneringsmail 更新行时,我得到了异常。请帮忙。

private void btnOpslaan_Click(object sender, EventArgs e)
    {
        String status = cmbStatus.SelectedItem.ToString();
        String naam = txtNaam.Text;
        int merk = Convert.ToInt32(cmdMerken.SelectedValue);
        DateTime startdatumCamp = Convert.ToDateTime(dtpStartCamp.Text);
        DateTime einddatumCamp = Convert.ToDateTime(dtpEinddatCamp.Text);
        Boolean titel = ckbTitel.Checked;
        Boolean link = ckbLink.Checked;
        Boolean teasertekst = ckbTeasertekst.Checked;
        Boolean inhoudsopgave = ckbInhoudsopgave.Checked;
        Boolean praktischeInfo = ckbPraktischeInfo.Checked;
        String verzenduur = txtVerzenduur.Text;
        DateTime verzenddatum = Convert.ToDateTime(dtpVerzenddatum.Text);
        int frequentie = Convert.ToInt16(txtFrequentie.Text);
        DateTime startdatum = Convert.ToDateTime(dtpStartdatum.Text);
        DateTime einddatum = Convert.ToDateTime(dtpEinddatum.Text);
        Boolean herinneringsmail = ckbHerinneringsmail.Checked;
        if (ckbHerinneringsmail.Checked)
        { 
            Boolean geklikt = ckbGeklikt.Checked;
            Boolean nietGeklikt = ckbNietGeklikt.Checked;
            int atlDagen = Convert.ToInt32(txtAtlDagen.Text);
        }

        if (indexCamp == 0 || statusCamp == "kopieren")
        {
            if (ckbHerinneringsmail.Checked)
                query = "Insert into [E-mailcampagne] ([Status], [Naam], [MerkID],[StartdatumCamp], [EinddatumCamp], [Titel], [Link], [Teasertekst], [Inhoudsopgave], [PraktischeInfo], [Verzenduur], [Verzenddatum], [Frequentie], [StartdatumOpl], [EinddatumOpl], [Herinneringsmail], [Geklikt], [NietGeklikt], [Aantal dagen], [Commerciële Coördinator]) values(@status, @naam, @merk, @startdatumCamp, @einddatumCamp, @titel, @link, @teasertekst, @inhoudsopgave, @praktischeInfo, @verzenduur, @verzenddatum, @frequentie, @startdatum, @einddatum, @herinneringsmail, @geklikt, @nietGeklikt, @atlDagen, @commID)";
            else
                query = "Insert into [E-mailcampagne] ([Status], [Naam], [MerkID], [StartdatumCamp], [EinddatumCamp], [Titel], [Link], [Teasertekst], [Inhoudsopgave], [PraktischeInfo], [Verzenduur], [Verzenddatum], [Frequentie], [StartdatumOpl], [EinddatumOpl], [Herinneringsmail], [Commerciële Coördinator]) values(@status, @naam, @merk, @startdatumCamp, @einddatumCamp, @titel, @link, @teasertekst, @inhoudsopgave, @praktischeInfo, @verzenduur, @verzenddatum, @frequentie, @startdatum, @einddatum, @herinneringsmail, @commID)";
        }
        else
        {
            if (ckbHerinneringsmail.Checked)
                query = "Update [E-mailcampagne] set [Status] = @status, [Naam] = @naam, [MerkID] = @merk, [StartdatumCamp] = @startdatumCamp, [EinddatumCamp] = @einddautmCamp, [Titel] = @titel, [Link] = @link, [Teasertekst] = @teasertekst, [Inhoudsopgave] = @inhoudsopgave, [PraktischeInfo] = @praktischeInfo, [Verzenduur] = @verzenduur, [Verzenddatum] = @verzenddatum, [Frequentie] = @frequentie, [StartdatumOpl] = @startdatum, [EinddatumOpl] = @einddatum, [Herinneringsmail] = @herinneringsmail, [Geklikt] = @geklikt, [NietGeklikt] = @nietGeklikt, [Aantal dagen] = @altDagen, [Commerciële Coördinator] = @commID where [CampagneID] = @indexCamp";
            else
                query = "Update [E-mailcampagne] set [Status] = @status, [Naam] = @naam, [MerkID] = @merk, [StartdatumCamp] = @startdatumCamp, [EinddatumCamp] = @einddatumCamp, [Titel] = @titel, [Link] = @link, [Teasertekst] = @teasertekst, [Inhoudsopgave] = @inhoudsopgave, [PraktischeInfo] = @praktischeInfo, [Verzenduur] = @verzenduur, [Verzenddatum] = @verzenddatum, [Frequentie] = @frequentie, [StartdatumOpl] = @startdatum, [EinddatumOpl] = @einddatum, [Herinneringsmail] = @herinneringsmail, [Commerciële Coördinator] = @commID where [CampagneID] = @indexCamp";
        }

        using (OleDbConnection conn = new OleDbConnection(connstring))
        {
            OleDbCommand com = new OleDbCommand(query, conn);
            com.Parameters.Add("@status", OleDbType.VarChar, 15, "[Status]").Value = cmbStatus.SelectedItem.ToString();
            com.Parameters.Add("@naam", OleDbType.VarChar, 50, "[Naam]").Value = txtNaam.Text;
            com.Parameters.Add("@merk", OleDbType.Integer, 3, "[MerkID]").Value = Convert.ToInt32(cmdMerken.SelectedValue);
            com.Parameters.Add("@startdatumCamp", OleDbType.Date, 10, "[StartdatumCamp]").Value = Convert.ToDateTime(dtpStartCamp.Text);
            com.Parameters.Add("@einddatumCamp", OleDbType.Date, 10, "[EinddatumCamp]").Value = Convert.ToDateTime(dtpEinddatCamp.Text);
            com.Parameters.Add("@titel", OleDbType.Boolean, 1, "[Titel]").Value = ckbTitel.Checked;
            com.Parameters.Add("@link", OleDbType.Boolean, 1, "[Link]").Value = ckbLink.Checked;
            com.Parameters.Add("@teasertekst", OleDbType.Boolean, 1, "[Teasertekst]").Value = ckbTeasertekst.Checked;
            com.Parameters.Add("@inhoudsopgave", OleDbType.Boolean, 1, "[Inhoudsopgave]").Value = ckbInhoudsopgave.Checked;
            com.Parameters.Add("@praktischeInfo", OleDbType.Boolean, 1, "[PraktischeInfo]").Value = ckbPraktischeInfo.Checked;
            com.Parameters.Add("@verzenduur", OleDbType.VarChar, 5, "[Verzenduur]").Value = txtVerzenduur.Text;
            com.Parameters.Add("@verzenddatum", OleDbType.Date, 10, "[Verzenddatum]").Value = Convert.ToDateTime(dtpVerzenddatum.Text);
            com.Parameters.Add("@frequentie", OleDbType.Integer, 2, "[Frequentie]").Value = Convert.ToInt32(txtFrequentie.Text);
            com.Parameters.Add("@startdatum", OleDbType.Date, 10, "[Startdatum]").Value = Convert.ToDateTime(dtpStartdatum.Text);
            com.Parameters.Add("@einddatum", OleDbType.Date, 10, "[Einddatum]").Value = Convert.ToDateTime(dtpEinddatum.Text);
            com.Parameters.Add("@herinneringsmail", OleDbType.Boolean, 1, "[Herinneringsmail]").Value = ckbHerinneringsmail.Checked;
            com.Parameters.Add("@commID", OleDbType.VarChar, 50, "[Commerciële coördinator]").Value = commID;
            if (ckbHerinneringsmail.Checked)
            {
                    com.Parameters.Add("@geklikt", OleDbType.Boolean, 1, "[Geklikt]").Value = ckbGeklikt.Checked;
                    com.Parameters.Add("@nietGeklikt", OleDbType.Boolean, 1, "[NietGeklikt]").Value = ckbNietGeklikt.Checked;
                    com.Parameters.Add("@atlDagen", OleDbType.Integer, 2, "[Aantal dagen]").Value = Convert.ToInt32(txtAtlDagen.Text);
            }

            if (indexCamp != 0 && statusCamp == "wijzigen")
                com.Parameters.Add("@indexCamp", OleDbType.Integer, 2).Value = indexCamp;

            conn.Open();
            com.ExecuteNonQuery();
            conn.Close();
            MessageBox.Show("Succesvol opgeslagen");
            this.Close();

        }
    }
4

1 回答 1

0

OleDb 对命名参数一无所知,它只是关于顺序(Parameter.Add 调用中的 Name 参数什么都不做)。因此,您需要按照在使用的语句中定义的顺序添加参数。

据我所知,您至少需要在“if (ckbHerinneringsmail.Checked)”代码之后添加@CommID 参数才能使订单正确。

于 2013-05-16T11:19:58.513 回答