2017-10-14 12 views
1

J'utilise T-SQL et c'est l'une de mes procédures stockées comme vous pouvez le lire, en fonction de ce que mon paramètre (@para_type) est Employee ou Consultant, les instructions suivantes seront exécutées et les déclencheurs seront déclenchés. La procédure stockée fonctionne lorsqu'elle est exécutée dans SQL Server Management Studio (SSMS).Pourquoi ma chaîne C# n'affecte-t-elle pas les instructions IF de mes procédures stockées?

Où j'entre les éléments suivants:

execute update_person @para_salary = 800, @para_ssn = 17, 
         @para_companyName = 'Ikea',@para_expdate = '202', 
         @para_type = 'Consultant', @para_officeId = 2 

Mais dans mon code C# Winforms, j'utiliser une zone de texte pour remplir le paramètre T-SQL (@para_type). Il n'affecte pas les instructions IF de ma procédure stockée. Je l'ai débogué en C# et tout est exécuté en conséquence mais ma procédure stockée ne fera pas ce qui est programmé.

procédure stockée:

create procedure update_person 
    @para_salary varchar(25), 
    @para_ssn int, 
    @para_companyName varchar(25), 
    @para_expdate date, 
    @para_type varchar(10), 
    @para_officeId int 
as 
begin 
    if @para_ssn is null 
     print('Please enter a value for (ssn)') 
    else if @para_type = 'Employee' 
     delete from consultant 
     where ssn = @para_ssn   

    update person 
    set flag = @para_type 
    where ssn = @para_ssn 

    update employee 
    set salary = @para_salary 
    where ssn = @para_ssn  

    if @para_type = 'Consultant' 
     delete from employee 
     where ssn = @para_ssn   

    update person 
    set flag = @para_type 
    where ssn = @para_ssn 

    update consultant 
    set companyName = @para_companyName, expdate = @para_expdate 
    where ssn = @para_ssn 

    update works_at 
    set officeId = @para_officeId 
    where ssn = @para_ssn 
end 

C# Winform la vue:

public void initializeComboBoxes() 
{ 
    var arr1 = new string[] { "Employee", "Consultant" }; 

    foreach (var item in arr1) 
     add_person_combobox.Items.Add(item); 

    add_person_combobox.SelectedIndex = 0; 

    foreach (var item in arr1) 
     update_person_combobox.Items.Add(item); 

    update_person_combobox.SelectedIndex = 0; 
} 

private void lblTimer(int i) 
{ 
    var t = new Timer(); 

    t.Interval = i; 

    t.Tick += (s, e) => 
     { 
      ResponseLbl.Text = ""; 
      t.Stop(); 
     }; 

    t.Start(); 
} 

private void update_person_btn_Click(object sender, EventArgs e) 
{ 
    if (string.IsNullOrWhiteSpace(update_person_salary.Text)) 
    { 
     update_person_salary.Text = "0"; 
    } 

    if (string.IsNullOrWhiteSpace(update_person_CoName.Text)) 
    { 
     update_person_CoName.Text = "Lund Consulting AB"; 
    } 

    int ssn = Convert.ToInt32(update_person_ssn.Text);    
    string type = update_person_combobox.SelectedItem.ToString(); 
    int salary = Convert.ToInt32(update_person_salary.Text); 
    string comName = update_person_CoName.Text; 

    int officeId = update_person_officeId.SelectedIndex + 1; 
    DateTime expdate = update_person_expDate.Value.Date; 

    if (ctrl.update_person(salary, ssn, comName, expdate, type, officeId) == true)    
    {      
     ResponseLbl.ForeColor = System.Drawing.Color.Green; 
     ResponseLbl.Text = "Succesfull"; 
     lblTimer(3000);    
    } 
    else 
    { 
     ResponseLbl.ForeColor = System.Drawing.Color.Red; 
     ResponseLbl.Text = "Failed"; 
     lblTimer(3000); 
    } 
} 

couche d'accès C# données

public bool update_person(int ssn, int salary, string companyName, DateTime expdate, string type, int officeId) 
{ 
    try 
    { 
     con.Open(); 

     cmd = new SqlCommand("update_person", con); 
     cmd.CommandType = System.Data.CommandType.StoredProcedure;    

     cmd.Parameters.AddWithValue("@para_ssn", ssn); 
     cmd.Parameters.AddWithValue("@para_salary", salary); 
     cmd.Parameters.AddWithValue("@para_companyName", companyName); 
     cmd.Parameters.AddWithValue("@para_expdate", expdate); 
     cmd.Parameters.AddWithValue("@para_type", type); 
     cmd.Parameters.AddWithValue("@para_officeId", officeId); 

     cmd.ExecuteNonQuery(); 
     con.Close(); 

     return true; 
    } 
    catch (SqlException e) 
    { 
     Console.WriteLine("error: " + e.Message); 
     con.Close(); 
     return false; 
    }      
} 
+0

Je suppose que ** CR ** symbole ou ** espace \ tab ** à la fin du paramètre. Changer 'if @para_type = 'Consultant'' en' si @para_type LIKE' Consultant% ''. Idem pour 'else si @para_type = 'Employee'' =>' else si @para_type LIKE' Employee% ''. Ou ne permettez pas à l'utilisateur de taper le type de paramètre, mieux utiliser le bouton radio. – lad2025

+0

@para_salary devrait être un varchar mais vous passez un nombre entier. Résolvez ce problème avant. – Steve

+1

@ lad2025 Je l'ai essayé, mais ça ne marchera pas. Je vais essayer debugg dans SQL Server Management Studio –

Répondre

0

vous manque BEGIN et END dans les blocs de votre procédure ..

BEGIN 
if @para_ssn is null 
    print('Please enter a value for (ssn)') 
else if @para_type = 'Employee' 
    BEGIN 
     delete from consultant where ssn = @para_ssn   

     update person set flag = @para_type where ssn = @para_ssn 
     update employee set salary = @para_salary where ssn = @para_ssn  
    END 
else if @para_type = 'Consultant' 
    BEGIN 
     delete from employee where ssn = @para_ssn   
     update person set flag = @para_type where ssn = @para_ssn 
     update consultant set companyName = @para_companyName, expdate = @para_expdate where ssn = @para_ssn 
     update works_at set officeId = @para_officeId where ssn = @para_ssn 
    END 
END