2017-11-10 18 views
-1
SqlConnection cn; 
SqlCommand cmd; 
SqlDependency dependency; 
DataTable dt; 
static string obj= string.Empty; 
public Form1() 
    { 
     InitializeComponent(); 
     CheckForIllegalCrossThreadCalls = false; 
     try 
     { 
      SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted); 
      perm.Demand(); 
     } 
     catch 
     { 
      throw new ApplicationException("No permission"); 
     } 
    } 

private void Form1_Load(object sender, EventArgs e) 
    { 
     MyMethod(); 
    } 
void Dependency() 
    { 
     dependency = new SqlDependency(cmd); 
     SqlDependency.Start(cn.ConnectionString); 

     dependency.OnChange += Dependency_OnChange; 
    } 
void MyMethod() 
    { 
     try 
     { 
      cn= new SqlConnection("My Connection String"); 
      cmd = new SqlCommand("Select Column1,Column2,Column3,Column4,Column5 from [dbo].TableName where Column1=value", cn); 
      if (cn.State == ConnectionState.Closed) 
       cn.Open(); 
      Dependency(); 
      SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
      while (dr.Read()) 
      { 
       obj=dr["Column2"].ToString(); 
      } 
      MessageBox.Show(obj); 
      baglanti.Close(); 
      cmd.Dispose(); 
      dr.Close(); 
    } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
private void Dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     MessageBox.Show("Data Change. " + e.Info.ToString()); 
     dependency.OnChange -= Dependency_OnChange; 
     MyMethod(); 
    } 

이 코드는 로컬 데이터베이스에서 작동됩니다. 내 질문은 왜 데이터베이스가 서버에있을 때 작동하지 않는 것입니다. 이 코드는 서버에서 실행하면, 나는 (작업 할 때 로그인하지 못했습니다. sqldependency

"사용자가 로그인하지 못했습니다")이 오류 메시지가 표시됩니다. 그러나이 종속성 코드 블록을 제거 할 때 작동합니다. 따라서 ConnectionString과 SQL 쿼리는 문제가 아닙니다. 나는 ConnectionString을 논스톱

'persist security info=True'을 추가 "MessageBox.Show ("데이터 변경합니다. "+ e.Info.ToString())"

작업 및 e.Info 값이 유효하지 않습니다. 도와주세요, 제발.

+0

나는 이전에 SqlDependency를 사용한 적이 없지만 https://stackoverflow.com/questions/2730798/sqldependency-thread의 링크에 따라 별도의 스레드에서 Change 이벤트를 발생시키고 windows GUI 응용 프로그램이 매우 이상한 일들이 일어나서 비 UI 스레드가 메시지 상자를 만들게됩니다. 이건 좋지 않아. 데이터베이스의 변경 사항에 즉각적으로 반응하려고합니까? 캐시 또는 다른 것을 새로 고치는 것입니까? 원하는 것을 성취 할 수있는 훨씬 간단한 방법이있을 수 있습니다. – GPW

답변

0

이 내용은 SqlDependency과 아무 관련이 없습니다. 잘못된 연결 문자열을 사용하고 있습니다. 다른 열린 연결에서 속성으로 읽은 연결 문자열을 절대 전달하지 마십시오. 연결을 여는 데 사용 된 원래 연결 문자열을 전달하십시오. 좋은 예는 사용자 설정으로 저장하고 SqlConnectionStringBuilder에로드하고 다른 필수 속성을 명시 적으로 설정 한 다음 빌더를 읽는 것입니다. 양식 디자이너에서 연결 문자열을 디자인하지 마십시오.

이고 e. 정보 값이 유효하지 않습니다.

e.Sourcee.Type도 확인하십시오.