2013-04-07 1 views
0

SQL 쿼리 알림이있는 응용 프로그램을 만들고 있지만 문제가 발생했습니다. 시스템이 무한 루프로 이동하는 루프에 보관됩니다. 'ved는 저장 프로 시저 (Stored Procedures)에 사용되었으며 저는 쿼리에서 7 개의 테이블을 사용했습니다. 내 쿼리 또는 응용 프로그램의 문제는 무엇입니까? 친절하게 내가이 내가 문제 해결 C# winforms의 Sql 쿼리 알림에 무한 루프가 발생했습니다.

ALTER PROCEDURE [dbo].[INVENTORYLOG_VIEW] 
AS 
    BEGIN 
    SELECT  
    ACCOUNT.Emp_Fname + ' ' + ACCOUNT.Emp_Lname AS [USERS], 
    INVENTORYLOG.ACTIVITYDATE AS [ACTIVITY DATE], 
    INVENTORYLOGDETAILS.ACTIVITYTIME AS [ACTIVITY TIME], 
    INVENTORYLOGDETAILS.LOG_ACTION AS [USER LOG], 
    CATEGORY.CATEGORY_NAME, 
    BRAND.Brand_Name AS BRAND, 
    PRODUCTDESCRIPTION.DESCRIPTION_TYPE, 
    COLOR.Color_Name AS [COLOR NAME], 
    SIZES.SIZE, 
    INVENTORY.QUANTITY_ON_HAND AS [CURRENT QTY], 
    INVENTORYLOGDETAILS.QUANTITY_LOG_ACTION AS [USER LOG QTY] 
FROM   
dbo.ACCOUNT INNER JOIN 
dbo.INVENTORYLOG ON dbo.ACCOUNT.ACCOUNT_ID = dbo.INVENTORYLOG.Account_Id INNER JOIN 
dbo.INVENTORYLOGDETAILS ON dbo.INVENTORYLOG.INVENTORYLOGID = dbo.INVENTORYLOGDETAILS.INVENTORYLOGID INNER JOIN 
dbo.INVENTORY ON dbo.INVENTORYLOGDETAILS.INVENTORY_ID = dbo.INVENTORY.INVENTORY_ID INNER JOIN 
dbo.PRODUCT_DTL ON dbo.INVENTORY.PRODUCT_DTL_ID = dbo.PRODUCT_DTL.PRODUCT_DTL_ID INNER JOIN 
dbo.COLOR ON dbo.PRODUCT_DTL.COLOR_ID = dbo.COLOR.Color_Id INNER JOIN 
dbo.BRAND ON dbo.PRODUCT_DTL.BRAND_ID = dbo.BRAND.Brand_Id INNER JOIN 
dbo.CATEGORY ON dbo.PRODUCT_DTL.CATEGORY_ID = dbo.CATEGORY.CATEGORY_ID INNER JOIN 
dbo.PRODUCTDESCRIPTION ON dbo.PRODUCT_DTL.DESCRIPTION_ID = dbo.PRODUCTDESCRIPTION.DESCRIPTION_ID INNER JOIN 
dbo.SIZES ON dbo.PRODUCT_DTL.SIZE_ID = dbo.SIZES.SIZE_ID 
END 

을 사용하고있는 저장 프로 시저 여기 을 내 코드를 게시합니다 : 해결이 감사하는 데 도움이 내 응용 프로그램

 string connect; 
     String connection; 
     private SqlConnection cons = null; 
     private SqlCommand command = null; 
     private DataSet myDataSet = null; 
     public Inventory_InventoryLog() 
     { 
      InitializeComponent(); 
      this.gridView1.OptionsView.ColumnAutoWidth = false; 
      this.gridView1.ScrollStyle = ScrollStyleFlags.LiveHorzScroll | ScrollStyleFlags.LiveVertScroll; 
      ConnectionString access = new ConnectionString(); 
      connection = access.AccessConnection(connect).ToString(); 

      // Sql Notifications Automatic 
      EnoughPermission(); 
     } 

     public bool EnoughPermission() 
     { 
      SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted); 
      try 
      { 
       perm.Demand(); 
       MessageBox.Show(""+perm); 
       return true; 
      } 
      catch(System.Exception) 
      { 
       return false; 
      } 
     } 
     private void GetActivateData() 
     { 
      try 
      { 
       //String query = "SELECT [USER], [ACTIVITY DATE], [ACTIVITY TIME], [USER LOG], CATEGORY_NAME, Brand_Name, DESCRIPTION_TYPE, Color_Name, SIZE, [ CURRENT QTY], [USER LOG QTY] FROM INVENTORY_INVENTORY_LOG_DETAILS"; 
       SqlDependency.Stop(connection); 
       SqlDependency.Start(connection); 
       if (cons == null) 
        cons = new SqlConnection(connection); 
       if (command == null) 
       { 
        command = new SqlCommand("dbo.INVENTORYLOG_VIEW", cons); 
        command.CommandType = CommandType.StoredProcedure; 
       } 
       if (myDataSet == null) 
        myDataSet = new DataSet(); 
       GetActualData(); 
      } 
      catch (Exception p) 
      { 
       MessageBox.Show(""+p); 
      } 
      MessageBox.Show("Being called"); 
     } 
     private void GetActualData() 
     { 
      myDataSet.Clear(); 
      command.Notification = null; 
      SqlDependency dependecy = new SqlDependency(command); 
      dependecy.OnChange +=new OnChangeEventHandler(dependecy_OnChange); 
      using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
      { 
       adapter.Fill(myDataSet, "dbo.ACCOUNT, dbo.INVENTORYLOG, dbo.INVENTORYLOGDETAILS, dbo.INVENTORY, dbo.PRODUCT_DTL,dbo.COLOR,dbo.BRAND,dbo.CATEGORY,dbo.PRODUCTDESCRIPTION, dbo.SIZES"); 
       gridControl1.DataSource = myDataSet.Tables["dbo.ACCOUNT, dbo.INVENTORYLOG, dbo.INVENTORYLOGDETAILS, dbo.INVENTORY, dbo.PRODUCT_DTL,dbo.COLOR,dbo.BRAND,dbo.CATEGORY,dbo.PRODUCTDESCRIPTION, dbo.SIZES"]; 
       gridView1.BestFitColumns(); 
       gridView1.BestFitMaxRowCount = 10; 
      } 

     } 

     delegate void UIDelegate(); 
     public void dependecy_OnChange(object sender, SqlNotificationEventArgs e) 
     { 
      try 
      { 
       UIDelegate uidel = new UIDelegate(RefreshDatas); 
       this.Invoke(uidel, null); 
       SqlDependency dependency = (SqlDependency)sender; 
       dependency.OnChange -= dependecy_OnChange; 
      } 
      catch (Exception es) 
      { 
      // XtraMessageBox.Show(es.Message); 
      } 
     } 
     public void RefreshDatas() 
     { 
      //////////////////////// 
      //--------------------------------------- NOTIFICATION INSERTS HERE ----------------------------------- ////// 
      label1.Text = "Changes Happened"; 
      GetActualData(); 
     } 

     /// <summary> 
     /// ////////////////////////////////////////////////////////////////////////////////////////////////// 
     /// //-------------------------------------------------------- SQL NOTIFICATION ------------------------------------ 
     /// </summary> 
     /// <param name="args"></param> 


     public SqlConnection ConnectionStringMethod() 
     { 
      SqlConnection con = new SqlConnection(connection); 
      con.Open(); 
      return con; 
     } 
     private void Inventory_InventoryLog_Load(object sender, EventArgs e) 
     { 
      GetActivateData();   
     } 

I의 코드입니다 이 문제에 대한 답변이 정말 도움이 되십시오. 감사합니다.

+0

는 전체 코드를 읽기 어려울 것이다 only..It 가장 관련성이 코드를 게시하시기 바랍니다 .. –

답변

1

RefreshDatas()에서 GetActualData()를 호출하면 onchange 대리인이 차례로 호출합니다. GetActiveData()에서 트리거됩니다.

GetActiveData()는 GetActualData()를 다시 호출하므로 루프가 발생합니다.

'수정'하려면 GetActualData에서 onchange 대리자를 제거하고 GetActivateData로 이동해야합니다. 그래서 같은

:

private void GetActivateData() 
     { 
      try 
      { 
       //String query = "SELECT [USER], [ACTIVITY DATE], [ACTIVITY TIME], [USER LOG], CATEGORY_NAME, Brand_Name, DESCRIPTION_TYPE, Color_Name, SIZE, [ CURRENT QTY], [USER LOG QTY] FROM INVENTORY_INVENTORY_LOG_DETAILS"; 
       SqlDependency.Stop(connection); 
       SqlDependency.Start(connection); 
       if (cons == null) 
        cons = new SqlConnection(connection); 
       if (command == null) 
       { 
        command = new SqlCommand("dbo.INVENTORYLOG_VIEW", cons); 
        command.CommandType = CommandType.StoredProcedure; 
       } 
       if (myDataSet == null) 
        myDataSet = new DataSet(); 

      SqlDependency dependecy = new SqlDependency(command); 
      dependecy.OnChange +=new OnChangeEventHandler(dependecy_OnChange); 


       GetActualData(); 
      } 
      catch (Exception p) 
      { 
       MessageBox.Show(""+p); 
      } 
      MessageBox.Show("Being called"); 
     } 
     private void GetActualData() 
     { 
      myDataSet.Clear(); 
      command.Notification = null; 
      using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
      { 
       adapter.Fill(myDataSet, "dbo.ACCOUNT, dbo.INVENTORYLOG, dbo.INVENTORYLOGDETAILS, dbo.INVENTORY, dbo.PRODUCT_DTL,dbo.COLOR,dbo.BRAND,dbo.CATEGORY,dbo.PRODUCTDESCRIPTION, dbo.SIZES"); 
       gridControl1.DataSource = myDataSet.Tables["dbo.ACCOUNT, dbo.INVENTORYLOG, dbo.INVENTORYLOGDETAILS, dbo.INVENTORY, dbo.PRODUCT_DTL,dbo.COLOR,dbo.BRAND,dbo.CATEGORY,dbo.PRODUCTDESCRIPTION, dbo.SIZES"]; 
       gridView1.BestFitColumns(); 
       gridView1.BestFitMaxRowCount = 10; 
      } 

     } 
+0

그래서 내가 Elger을 어떻게해야합니까? 어떤 해결책을 제공해 주시겠습니까? –

+0

Elger 데이터를 삽입 할 때마다 RefreshDatas()에서 GetActiveData()를 제거하려고했습니다. 그리드에 자동으로 업데이트됩니다. –

+0

잠시 후 답변을 업데이트 할 것입니다 –