0

update と insert を使用するクエリがありますが、insert でエラーが発生します

これは私のコードで、常にエラーが発生しています

{"スカラー変数 \"@PatientID\" を宣言する必要があります。"}

    private void btnOpslaan_Click(object sender, EventArgs e)
    {
        if (IsGeldigeData())
        {
            patient.PatientID = Convert.ToInt32(txtPatientID.Text);
            patient.Naam = txtNaam.Text;
            patient.Voornaam = txtVoornaam.Text;
            patient.Straat = txtStraat.Text;
            patient.Huisnummer = txtHuisnr.Text;
            if (txtPostcodeID.Text != "") patient.PostcodeID = Convert.ToInt32(txtPostcodeID.Text);
            patient.Geboortedatum = dtGeboortedatum.Value;
            if (txtHuidige_Afdeling.Text != "") patient.Huidige_Afdeling = Convert.ToInt32(txtHuidige_Afdeling.Text);
            patient.Huidige_Kamer = txtHuidige_Kamer.Text;
            if (txtHuidige_HuisartsID.Text != "") patient.Huidige_Huisarts = Convert.ToInt32(txtHuidige_HuisartsID.Text);
            if (txtHuidige_ZiekenhuisartsID.Text != "") patient.Huidige_Ziekenhuisarts = Convert.ToInt32(txtHuidige_ZiekenhuisartsID.Text);
            if (txtHuidige_Opnamenr.Text != "") patient.Huidige_Opnamenr = Convert.ToInt32(txtHuidige_Opnamenr.Text);

            string insertStatement = @"UPDATE Patient SET  Naam = @Naam, Voornaam = @Voornaam, Straat = @Straat, 
                                    Huisnummer = @Huisnummer, PostcodeID = @PostcodeID, Geboortedatum = @Geboortedatum, 
                                    Huidige_Afdeling = @Huidige_Afdeling, Huidige_Kamer = @Huidige_Kamer, Huidige_HuisartsID = 
                                    @Huidige_HuisartsID, Huidige_ZiekenhuisartsID = @Huidige_ZiekenhuisartsID,
                                    Huidige_Opnamenr = @Huidige_Opnamenr WHERE PatientID = @PatientID
                                    IF @@ROWCOUNT=0 
                                    INSERT INTO Patient (Naam, Voornaam, Straat, Huisnummer, PostcodeID, Geboortedatum, 
                                    Huidige_Afdeling, Huidige_Kamer, Huidige_HuisartsID, Huidige_ZiekenhuisartsID, Huidige_Opnamenr) 
                                    VALUES  (@Naam,@Voornaam,@Straat,@Huisnummer,@PostcodeID,@Geboortedatum,@Huidige_Afdeling,@Huidige_Kamer,
                                                @Huidige_HuisartsID,@Huidige_ZiekenhuisartsID,@Huidige_Opnamenr)";
            SqlCommand insertCommand = new SqlCommand(insertStatement, cs);
            SqlCommand updateCommand = new SqlCommand(insertStatement, cs);
4

1 に答える 1

3

パラメーター値のプレースホルダーを使用して sql ステートメントを準備するだけでは不十分です。
コマンドのパラメーター コレクションも作成する必要があります。

 insertCommand.Parameters.AddWithValue("@PatientID",  patient.PatientID);
 .... and so on for every parameter placeholders 

AddWithValue の使用は、重大な欠点を伴うショートカットであることを覚えておいてください。
フレームワークは、渡された値を参照して、パラメーターの適切なデータ型とサイズを決定します。これは、場合によっては、非常に悪いパフォーマンスにつながる可能性があります。
たとえば、文字列の場合、フレームワークは常に文字列の長さと同じサイズの NVarChar パラメータを渡します。(varchar/nvarchar/size を推測する必要があります) したがって、すべての呼び出しで、パラメーターの長さが異なる可能性があります。Sql Server の内部オプティマイザーがクエリを保存して再利用できなかったため、これはパフォーマンスに悪影響を及ぼします。

前のものよりも少し長くなりますが、より正確なアプローチは次のとおりです。(Naam が NVarchar(50) データベース フィールドであると仮定します)。

 insertCommand.Parameters.Add("@Naam", SqlDbType.NVarChar, 50).Value = patient.Naam;

この素晴らしい記事をご覧ください

データ アクセス コードがデータベースのパフォーマンスに与える影響

于 2013-06-15T22:21:13.907 に答える