2013-06-15 3 views
0

У меня есть запрос, который использует обновления, а также вставить, но я получаю сообщение об ошибке с вставкойC# запрос придраться вставки в базу данных

это мой код и alwas получаю ошибку

{ "Должен заявить, скалярная переменная \ «@ 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

Где вы настройку ваших параметров? –

ответ

3

это не достаточно, чтобы подготовить заявление SQL с заполнителей для значения параметров.
Вы должны также создать коллекцию параметров для команды ....

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

Пожалуйста rememeber, что использование AddWithValue ярлык с некоторыми серьезными недостатками.
Рамка определяет для вас соответствующий тип данных и размер для параметра, смотрящего на значение, которое вы передаете. Это, в некоторых случаях, может привести к очень плохим выступлениям.
Например, в случае строк Framework всегда будет иметь параметр NVarChar с размером, равным длине строки. (Он должен угадать varchar/nvarchar/size). Таким образом, при каждом вызове параметр может иметь разные длины. Это не подходит для выступлений, потому что внутренний оптимизатор Sql Server не смог сохранить и повторно использовать запрос.

Немного длиннее предыдущего, но более точный подход: (Предполагая, что Naam является полем базы данных NVarchar (50)).

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

Пожалуйста, смотрите эту прекрасная статью на

How Data Access Code Affects Database Performance

Смежные вопросы