2009-09-25 3 views
0

J'utilise VB.net et SQL Server 2005.Comment arrêter l'insertion d'enregistrements dans la table SQL lorsqu'une limite est atteinte

Mon problème est que je veux donner un message utilisateur si la limite délégué a atteint pour cette cours.

Voir j'ai un cours où j'ai MinDelegate et limite MaxDelegate. Je veux arrêter d'insérer et donner un message d'utilisateur que "limite maximum de délégué a atteint ne peut pas avoir plus de délégués pour ce cours"

Et ci-dessous est l'insertion commmand qui insère des enregistrements dans ma table de délégué.

ALTER PROCEDURE [dbo].[uspInsertDelegate] 
(
    @CourseID int, 
    @CPUserID int, 
    @StatusID int, 
    @CreateUser varchar(25), 
    @CourseDate smalldatetime 

) 
AS 
    SET NOCOUNT OFF; 
IF NOT EXISTS (SELECT * 
     FROM tblDelegate 
     WHERE CourseID = @CourseID and CPUserID = @CPUserID) 
BEGIN 
INSERT INTO tblDelegate      
(
    CourseID, 
    CPUserID, 
    StatusID, 
    CreateUser 

) 
VALUES  
(
    @CourseID, 
    @CPUserID, 
    @StatusID, 
    @CreateUser 
) 
END 

UPDATE tblTraining 
SET 
TrainingDT = @CourseDate, 
TrainingCompleted = @StatusID 
WHERE CPUserID = @CPUserID 

RETURN 

S'il vous plaît également suggérer ce que faire dans le code VB.NET!

Merci!

Cordialement,

Yuv

Répondre

2

Une solution est d'écrire un déclencheur « avant INSERT » qui appliquera les règles d'affaires en vérifiant le nombre d'étudiants sont facilement enregistrés pour la etc. classe) et empêcher la insérer pour avoir lieu. Cette condition d'erreur peut ensuite être détectée à des niveaux plus élevés et un message d'erreur approprié est fourni à l'utilisateur. En relisant votre question, la règle de gestion pourrait aussi bien être vérifiée dans la procédure stockée que vous avez mise en place, il suffirait alors de faire retourner la procédure du magasin par un code de condition (disons un entier: 0) = insérer ok et -1 = la classe est pleine), et tester cette valeur au niveau de l'application.

Edit: plus de détails (mais pas tout à fait le code complet ...)

Yuvraj, ce que je voudrais vous mettre a l'air sérieux comme devoirs, donc sur la bonne voie, mais aussi laissez-vous y travailler assez que vous apprenez le processus de comprendre les choses.

En ce qui concerne la procédure Store (SP), bniwredyc vous facilement à condition que le code: Il est une légère modification par rapport à ce que vous avez dans votre question:

@minDelegate int, 
@maxDelegate int 

set @delegatesCount = (select count(*) from tblDelegate 
         where CourseID = @CourseId) 

if (@delegatesCount >= maxDelegate) 
     return -1 

Essentiellement, vous ajoutez 2 arguments supplémentaires à la procédure: minDelegate et maxDelegate et retournent prématurément à partir de la procédure, avec une valeur de retour -1, dans le cas où il y a trop de délégués. (1 dans l 'exemple de bniwredyc, mais je préfère les valeurs négatives pour les conditions d' erreur). Je ne pense pas que minDelegate soit utilisé du tout; vous savez mieux quelles règles doivent être appliquées ...

Maintenant, vous devez écrire un programme VB qui appellera ce SP au moyen de ADO. Cela impliquera l'utilisation de l'objet ADODB.Command Ce Microsoft MSDN page fournit des informations de référence sur cet objet et en suivant quelques liens pas très loin de cette page, vous trouverez également des détails sur l'objet Connection et l'objet RecordSet.

Une procédure stockée peut renvoyer des données à la méthode appelante de trois manières différentes.

 
    1. By returning an integer value in the RETURN value. This value is 
     the return value of the Command object's Execute() method. 
     This is the simpler approach and can be used in your case 
    2. By returning values (integer, text or other) in one or several OUTPUT 
     Parameters 
    3. By returning a recordset 

    Method 2 can be combined with 1 or 3, however 1 and 3 are mutually 
    exclusive since they both use return value of the Execute() method 
    to provide an integer (1) or a Recordset (3). 

L'exemple à this page montre +/- tout ce que vous aurez besoin, mais il utilise un jeu d'enregistrements pour les données, ce qui est pas nécessaire dans votre cas; Au lieu de cela, utilisez une valeur entière pour stocker la valeur de retour de Execute() et testez-la. Si 0: enregistrement a été ajouté ok, If-1: échec du test "too many".

Maintenant, mettez-vous au travail :-) et s'il vous plaît, posez vos questions comme "Devoirs", le cas échéant.

0

Vous pouvez créer une procédure stockée de validation qui renvoie uniquement le nombre total d'enregistrements. Appelez ceci d'abord à partir de votre code VB puis vous vérifiez ce nombre et ensuite renvoyez le message d'erreur approprié ou appelez le sproc d'insertion votre fourni.

+0

Merci! Puis-je avoir un exemple de code pour Proc et Vb.net? –

+0

Il suffit de créer un proc stocké qui retourne une seule ligne et une seule cellule qui contient le nombre de délégués. Appelez ce sp à partir de votre code vb comme vous le feriez pour n'importe quelle autre table renvoyant le sproc. Ensuite, dans votre code vb, regardez la valeur et prenez une décision en fonction de sa valeur. –

0

Vous pouvez passer une variable à la procédure stockée avec les MaxDelegates et faire le contrôle dans la procédure stockée avant d'insérer

Declare @CurrentNumberOfDelegates int 
Select @CurrentNumberOfDelegates = Count(*) 
From tblDelegate 
Where CourseId = @CourseId 

If @CurrentNumberOfDelegates > @MaxDelegates 
Return -1 

Dans ce cas, vous allez vérifier sur VB.Net la valeur de retour de la procédure stockée et si c'est -1 montre le message à l'utilisateur.
Cette solution doit être suffisamment sûre car vous vérifiez le nombre juste avant de l'insérer, mais vous devrez peut-être ajouter une transaction pour vous assurer que la limite n'est jamais transmise par un autre thread en cours d'exécution.

0

Je pense que vous pouvez utiliser ce code pour la procédure stockée:

ALTER PROCEDURE [dbo].[uspInsertDelegate] 
    (
     @CourseID int, 
     @CPUserID int, 
     @StatusID int, 
     @CreateUser varchar(25), 
     @CourseDate smalldatetime, 
     @minDelegate int, 
     @maxDelegate int 
    ) 
    AS 
     SET NOCOUNT OFF; 
    IF NOT EXISTS (SELECT * 
      FROM tblDelegate 
      WHERE CourseID = @CourseID and CPUserID = @CPUserID) 
    BEGIN 
     set @delegatesCount = (select count(*) from tblDelegate where CourseID = @CourseId) 

     if (@delegatesCount >= maxDelegate) 
      return 1 
     else 
     begin 
      INSERT INTO tblDelegate      
      (
       CourseID, 
       CPUserID, 
       StatusID, 
       CreateUser 
      ) 
      VALUES  
      (
       @CourseID, 
       @CPUserID, 
       @StatusID, 
       @CreateUser 
      ) 
     end 
    END 

    UPDATE tblTraining 
    SET 
    TrainingDT = @CourseDate, 
    TrainingCompleted = @StatusID 
    WHERE CPUserID = @CPUserID 

    RETURN 0 

Dans le code VB juste valeur vérifier renvoyée par l'exécution de la procédure stockée: si elle est 1 à la limite de délégué max a atteint. Vous pouvez également ajouter du code à la procédure stockée pour renvoyer la valeur 2 en cas de limite min.

+0

Merci Cher Comment vérifier la valeur de retour dans le code VB.Net –

0

Tout d'abord merci à tous les membres qui ont répondu à ma question

Je résoudre ce problème en utilisant la logique ci-dessous

Dans Sql Procédure j'ai changé ma procédure.

ALTER PROCEDURE [dbo].[uspInsertDelegate] 
(
    @CourseID int, 
    @CPUserID int, 
    @StatusID int, 
    @CreateUser varchar(25), 
    @CourseDate smalldatetime, 
    @MaxDelegate int 

) 
AS 
    SET NOCOUNT OFF; 
IF NOT EXISTS (SELECT * FROM tblDelegate WHERE CourseID = @CourseID and CPUserID = @CPUserID) 
BEGIN 
    Declare @DelegateBooked int 
    set @DelegateBooked = (SELECT count(*) FROM tblDelegate WHERE CourseID = @CourseID) 
    IF @DelegateBooked >= @MaxDelegate 
     SELECT 1 
    ELSE 
    BEGIN 
     INSERT INTO tblDelegate      
     (
      CourseID, 
      CPUserID, 
      StatusID, 
      CreateUser 

     ) 
     VALUES  
     (
      @CourseID, 
      @CPUserID, 
      @StatusID, 
      @CreateUser 
     ) 

     UPDATE tblTraining 
     SET 
     TrainingDT = @CourseDate, 
     TrainingCompleted = @StatusID 
     WHERE CPUserID = @CPUserID 
    END 
END 

Et dans mon code VB.net j'écrire:

Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click 
     If Not Session("CourseDate") Is Nothing Then 
      Try 
       Dim conString As String = WebConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString 
       Dim con As New SqlConnection(conString) 
       con.Open() 
       Dim cmd As SqlCommand 
       For Each curRow As GridViewRow In GridView1.Rows 
        Dim chkSelect As CheckBox = CType(curRow.Cells(1).FindControl("chkSelect"), CheckBox) 
        If chkSelect.Checked Then 
         cmd = New SqlCommand("uspInsertDelegate", con) 
         cmd.CommandType = CommandType.StoredProcedure 
         cmd.Parameters.Add("@CourseID", SqlDbType.Int).Value = Session("CourseID") 
         cmd.Parameters.Add("@CPUserID", SqlDbType.Int).Value = CType(curRow.Cells(1).FindControl("lblCPUserID"), Label).Text 
         cmd.Parameters.Add("@StatusID", SqlDbType.Int).Value = 25 
         cmd.Parameters.Add("@CreateUser", SqlDbType.VarChar).Value = Session("LoggedInUser") 
         cmd.Parameters.Add("@CourseDate", SqlDbType.DateTime).Value = Session("CourseDate") 
         cmd.Parameters.Add("@MaxDelegate", SqlDbType.Int).Value = Session("MaxDelegate") 
         Dim retValue As Integer = CType(cmd.ExecuteScalar(), Integer) 
         If retValue = 1 Then 
          lblError.Visible = True 
          lblError.Text = "Max Delegate limit has reached can't have more delegates for this course" 
          Exit For 
         Else 
          lblError.Visible = False 
         End If 
        End If 
       Next 
       GridView1.DataBind() 
      Catch ex As Exception 
       ErrorHandler.WriteError(ex.Message) 
      End Try 
     End If 

S'il vous plaît jeter un oeil et de fournir vos rétroactions dans le cas où il est faux

+0

Vous devez utiliser les transactions et le verrouillage pour éviter les insertions concurrentes – Niikola

Questions connexes