2011-02-17 2 views
2

J'ai cette procudure stockée qui ne fonctionnera pas. Si j'essaie cette requête dans le studio de gestion avec mes paramètres renseignés cela fonctionne, je ne peux pas voir si j'ai fait quelque chose de mal dans mon code mais j'espère que quelqu'un remarquera quelque chose que je fais malC# SQL server 2008 r2 insert procédure stockée ne fonctionne pas

CREATE PROCEDURE new_project 
-- Add the parameters for the stored procedure here 
@proj_naam nvarchar = null, 
@plaats nvarchar = null, 
@opd_geef int = 0, 
@status int = 0, 
@proj_id int = 0 AS BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
INSERT INTO project (naam_project, plaats, opdrachtgeverZEEBREGTS_nr, status, project_NR) 
VALUES (@proj_naam, @plaats, @opd_geef, @status, @proj_id) END GO 
CREATE PROCEDURE new_project 
-- Add the parameters for the stored procedure here 
@proj_naam nvarchar = null, 
@plaats nvarchar = null, 
@opd_geef int = 0, 
@status int = 0, 
@proj_id int = 0 AS BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
INSERT INTO project (naam_project, plaats, opdrachtgeverZEEBREGTS_nr, status, project_NR) 
VALUES (@proj_naam, @plaats, @opd_geef, @status, @proj_id) END GO 

et C# Code:

System.Data.SqlClient.SqlConnection con; 
      con = new System.Data.SqlClient.SqlConnection(); 
      con.ConnectionString = Global.ConnectionString_fileserver; 
      con.Open(); 
      string stopro = ""; 
      switch (type) 
      { 
       case 1: 
        stopro = "new_project"; 
        break; 
       case 2: 
        stopro = "new_bedrijf"; 
        break; 
       case 3: 
        stopro = "new_persoon"; 
        break; 
      } 
      SqlCommand command = new SqlCommand(stopro, con); 
      command.CommandType = CommandType.StoredProcedure; 
      switch (type) 
      { 
       case 1: 
        SqlParameter proj_naam = command.Parameters.Add("@proj_naam", SqlDbType.NVarChar); 
        SqlParameter plaats = command.Parameters.Add("@plaats", SqlDbType.NVarChar); 
        SqlParameter opdrachtgever = command.Parameters.Add("@opd_geef", SqlDbType.Int); 
        SqlParameter status = command.Parameters.Add("@status", SqlDbType.Int); 
        SqlParameter proj_id = command.Parameters.Add("@proj_id", SqlDbType.Int); 
        proj_naam.Value = tb_proj_projectnaam.Text; proj_naam.Direction = ParameterDirection.Input; 
        plaats.Value = tb_proj_plaats.Text; plaats.Direction = ParameterDirection.Input; 
        opdrachtgever.Value = cb_proj_opdrachtgever.SelectedValue; opdrachtgever.Direction = ParameterDirection.Input; 
        status.Value = cb_proj_status.SelectedValue; status.Direction = ParameterDirection.Input; 
        proj_id.Value = id; proj_id.Direction = ParameterDirection.Input; 
        break; 
      } 
      int nwok = command.ExecuteNonQuery(); 
      con.Close(); 

Je l'espère quelqu'un peut aider thnx à l'avance!

+0

Est-ce qu'il lance une erreur spécifique? – Xavinou

+0

Pouvez-vous définir "ne fonctionnera pas"? Est-ce qu'il donne un message d'erreur, ou ne retourne rien? Est-ce qu'il arrive réellement à la ligne ExecuteNonQuery, parce que c'est après la pause, mais c'est peut-être parce que vous avez retiré du code. –

+0

aucune erreur, l'int nwok stocke le nombre de lignes affectées, donc si une ligne est ajoutée, elle retournera 1, sinon 0, et je reçois seulement 0. Et si je vérifie ma base de données, la nouvelle ligne n'est pas là. Donc, il n'a rien fait. – Daanvl

Répondre

1

Je peux voir que si Case n'est pas dans votre cas de commutateur alors l'instance de commande n'obtient jamais ces paramètres de sorte qu'elle ne fonctionnera pas.

+0

-1: Le 'break' est à l'intérieur de l'instruction' switch'. –

+0

@Ardman ce n'était pas avant la modification. donc ma réponse était pour ce cas. Vous pouvez vérifier les révisions de sa question. –

+0

N'est-ce pas le bon endroit pour la pause? au et de la déclaration et avant que je définis le cas 2:? Et j'ai vérifié si le cas 1 a été appelé avec un messagebox et cela fonctionne également bien. – Daanvl

3

Vous avez un break avant int nwok = command.ExecuteNonQuery();

EDIT

Non lié à la raison pour laquelle votre SPROC n'exécute pas, mais vous avez SET NOCOUNT ON qui fera -1 à retourner par ExecuteNonQuery. Courez-vous SET NOCOUNT OFF avant l'insertion?

+0

+1 vous étiez juste quelques secondes plus vite que moi. –

+0

c'est parce que, après cela, il y a quelques autres cas non pertinents que je coupe donc le poste ne prend pas un mile de long: P mais je vais chek si l'exécution est appelée néanmoins. edit: non, execute est bien appelé. – Daanvl

+0

-1: Le 'break' est à l'intérieur de l'instruction' switch'. –

0

Ici vous testez le type dans un communiqué switch:

switch (type)    
{     
    case 1:      
     stopro = "new_project";      
     break;     
    case 2: 
     stopro = "new_bedrijf";      
     break; 
    // etc. 
} 

Vous pouvez ensuite tester à nouveau la type dans une autre déclaration switch qui est juste surpuissant. Déplacez vos paramètres dans la première instruction switch et cela peut résoudre votre erreur.

switch (type)    
{     
    case 1:      
     stopro = "new_project";  
     SqlParameter proj_naam = command.Parameters.Add("@proj_naam", SqlDbType.NVarChar);      
     SqlParameter plaats = command.Parameters.Add("@plaats", SqlDbType.NVarChar); 
     SqlParameter opdrachtgever = command.Parameters.Add("@opd_geef", SqlDbType.Int); 
     SqlParameter status = command.Parameters.Add("@status", SqlDbType.Int); 
     SqlParameter proj_id = command.Parameters.Add("@proj_id", SqlDbType.Int); 
     proj_naam.Value = tb_proj_projectnaam.Text; 
     proj_naam.Direction = ParameterDirection.Input; 
     plaats.Value = tb_proj_plaats.Text; 
     plaats.Direction = ParameterDirection.Input; 
     opdrachtgever.Value = cb_proj_opdrachtgever.SelectedValue; 
     opdrachtgever.Direction = ParameterDirection.Input; 
     status.Value = cb_proj_status.SelectedValue; 
     status.Direction = ParameterDirection.Input; 
     proj_id.Value = id; 
     proj_id.Direction = ParameterDirection.Input;      
     break;     
    case 2: 
     stopro = "new_bedrijf";      
    // etc. 
} 
+0

Je pense que je suis obligé de le faire parce que J'ai besoin de définir la commande sqlcommand en premier avec la bonne chaîne pour la bonne procédure stockée et ensuite je peux appeler commandparameter.add. ou y a-t-il un autre moyen? Je voudrais éviter de définir command1, command2 command3 etc si c'est possible – Daanvl

+1

@Daanvl: vous pouvez créer votre 'SqlCommand' avant l'instruction switch sans aucun problème. –

Questions connexes