2011-03-30 118 views
0

如果該值已經存在,我將如何停止循環?如何停止插入?

set ANSI_NULLS ON  
set QUOTED_IDENTIFIER ON  
GO 

ALTER PROCEDURE [dbo].[SD_Sproc_Result]  
-- Add the parameters for the stored procedure here 
    @employeeid bigint, 
    @providercode varchar(100) 
AS 
BEGIN 

    IF NOT EXISTS(SELECT * 
        FROM TR_employeesprovidercode  
       WHERE employeeid = @employeeid 
        AND providercode = @providercode) 
    BEGIN 
     Insert into TR_employeesprovidercode 
     (employeeid, providercode) 
     values 
     (@employeeid, @providercode) 
    END 

END 

C#代碼

是我在C#代碼...

foreach (ArrayList item in ArrData) 

{ 

    HCSProvider.NewProviderResult oResult; oResult = 
     oHCSProvider.CreateNewProvider(providercode, oProviderDetail); 

    DBInterface ProviderDetail = new DBInterface(); 

    ProviderDetail.InsertProvider(
     Convert.ToInt64(providercode), 
     Convert.ToString(oProviderDetail)); 

} 
+0

循環在哪裏? – 2011-03-30 05:23:19

+0

foreach(ArrData中的ArrayList項) {providercode = 201110001; oProviderDetail =「HCS」; DBInterface ProviderDetail = new DBInterface(); ProviderDetail.InsertProvider(Convert.ToInt64(providercode),Convert.ToString(oProviderDetail)); } – 2011-03-30 05:24:47

+0

是的。一個循環丟了;) – TomTom 2011-03-30 05:25:18

回答

4

NOT EXISTS首先不能很好地擴展,你仍然可以得到重複的錯誤。

爲什麼不嘗試這樣的事情?

... 
DECLARE @rtn int 
BEGIN TRY 
    Insert into TR_employeesprovidercode 
    (employeeid, providercode) 
    values 
    (@employeeid, @providercode) 
    SET @rtn = 0 
BEGIN TRY 
BEGIN CATCH 
    IF ERROR_NUMBER() <> 2627 
    RAISERROR ('real error', 16, 1) 
    SET @rtn = 1 
END CATCH 
RETURN @rtn 
1

ELSE部分添加到存儲的過程和返回某個常數。

IF NOT EXISTS 
BEGIN 
    ... 
END 
ELSE 
RETURN 0; 

在您的循環中檢查返回值並從循環中斷開。

foreach(var item in myArray) 
{ 
    SqlCommand cmd = new SqlCommand(); // command for stored proc 
    ... 
    var result = cmd.ExecuteScalar(); 

    if(result == 0) 
     break; 
} 
1

您可以在存儲過程中使用並輸出參數,並在條目重複時填充該值。然後測試參數,如果值已經存在,則中斷循環。

Here's關於此的MySql教程。

0

您需要從存儲過程中返回一個值,您可以檢查該值,然後在適當的返回值上返回break循環。