반응형

SQL Server 에서 오픈쿼리 사용 시 8000자를 넘어가면 실행이 불가능하다.

 

오픈쿼리 특성 상 테이블변수를 사용하지 못하기에 WHERE 절에서 IN 으로 조회하게 되는데

대상이 많아지면 8000자를 넘는일이 자주 발생한다.

 

예제

DECLARE @V_TABLE TABLE
(
	ORD_NO INT ,
	ORD_NAME VARCHAR(30)
)

DECLARE @QUERY NVARCHAR(MAX)
DECLARE @MULTI_ORD_NO NVARCHAR(MAX)


-- 1. 대상 테이블로 받을 때 행 별 콤마 추가
-- ex) 1,2,3
SELECT @MULTI_ORD_NO = STRING_AGG(CAST(ORD_NO AS NVARCHAR(MAX)), ',') FROM (SELECT ORD_NO FROM @V_TABLE) A

SET @QUERY = N'
SELECT 1 FROM A WHERE KEY IN ('+ @MULTI_ORD_NO +')
'

EXECUTE (@QUERY) AT LINKED_SERVER

 

참고로 STRING_AGG 할 때 꼭 NVARCHAR(MAX)로 캐스팅해서 써야 한다.

반응형
반응형

 

winform xUnit 단위 테스트 중 쿼리를 실행하는 메서드가 실행되지 않아서 삽질 끝에 해결했습니다.

 

1. Could not load file or assembly 'System.Data.SqlClient' 에러

 

~.sqlClient~(0.0.0.0) ~ 에러

 

xUnit 프로젝트에서 sqlClient 어셈블리 참조 시 바로 중단됨

 

구글링 결과 system.data.sqlClient 어셈블리를 Microsoft.data.sqlClient 으로 변경 후 해결된다 하여 system.data.sqlClient 제거 후 Nuget으로 Microsoft.data.sqlClient로 변경

단위테스트 실행했는데 잘 돌아가나 싶었으나 소수의 테스트만 통과를 못함

디버그 해보니 sqlConnectionstring 에서 예외 발생됨

이미 퇴근시간이 훌쩍 지나 포기하려 했으나 날린 시간이 아까워서 해결하고 가기로 마음먹음

Microsoft.data.sqlClient 로 변경 후 xUnit에서 어셈블리 참조는 되지만

sqlConnectionstring 에서 계속 다른 예외 발생

 

 

 

2. Microsoft.data.sqlClient로 변경 후, DB 연결 에러(신뢰되지 않은 기관에서 인증 체인을 발급했습니다) 

 

혹시나 해서 winform앱을 실행하니 DB인증 에러 발생.

이제는 xUnit도 안되고 winform앱도 DB 연결이 불가능해짐.

그래도 관련 자료가 있어 금방 해결됨

sqlConnectionString에 {server=..~~..~..};TrustServerCertificate=True; 추가하니 DB 인증에러 해결됨

다시 테스트 돌렸으나 1번 해결 후 상황과 같음 xUnit에서는 여전히 안됨 

 

3. xUnit 프로젝트에 Microsoft.data.sqlClient 참조

 

2번 에러 해결 후  1번 에러에서 버전이 4.0.0.0으로 변경되고

똑같이 sqlConnectionString에서 예외 발생됨

(tryExecption ~ 이런걸로 내용이 조금 바뀌어 있었는데 기억하기 싫음)

단위 테스트 프로젝트에도 1번에서와 같이 Nuget으로 Microsoft.data.sqlClient 설치 후 해결

 

 

결론

1. system.data.sqlClient 제거 

2. 어플리케이션, 단위테스트 프로젝트에 각각 Microsoft.data.sqlClient 설치 

3. DB 인증 에러 발생시 TrustServerCertificate=True 추가

 

 

Microsoft.data.sqlClient 로 변경 후 다른 문제 있으면 추가로 업데이트 예정.

 

 

반응형
반응형

 

타이머를 이용해서 간단하게 구현할수 있습니다.

 

유저에게 필수 입력 항목을 강조할때 사용했습니다.

 

1) 코드 예제

 

이해가 안되시면 코드전체를 긁어서 사용하시면 됩니다.

 private Timer mBlinkTimer = new Timer();
       private bool mStart = false;
​
       public Form1()
       {
           InitializeComponent();
       }
​
       Button btnBlink;
       Button btnRun;
​
       private void Form1_Load(object sender, EventArgs e)
       {
           this.Size = new Size(1000, 500);
​
           btnBlink = new Button();
           btnBlink.Size = new Size(300, 300);
           btnBlink.Location = new Point((this.Width - btnBlink.Size.Width) / 2, (this.Height - btnBlink.Size.Height) / 2);
           this.Controls.Add(btnBlink);
​
           btnRun = new Button();
           btnRun.Text = "Start/Stop";
           btnRun.Size = new Size(100, 0);
           btnRun.Dock = DockStyle.Right;
           this.Controls.Add(btnRun);
​
           btnRun.Click += btnRun_Click;
​
           mBlinkTimer.Interval = 500;
           mBlinkTimer.Tick += BlinkTimer_Tick;
​
           btnBlink.BackColor = Color.Gainsboro;
       }
​
       private void BlinkTimer_Tick(object sender, EventArgs e)
       {
           if (mStart)
           {
               if (btnBlink.BackColor == Color.Gainsboro)
               {
                   btnBlink.BackColor = Color.Yellow;
               }
               else
               {
                   btnBlink.BackColor = Color.Gainsboro;
               }
           }
       }
​
       private void btnRun_Click(object sender, EventArgs e)
       {
           mBlinkTimer.Enabled = !mStart;
           mStart = !mStart;
       }

Timer Interval에 반짝일 속도를 설정하고 

Timer Tick 이벤트에서

멤버 변수인 불린 start가 true 일때만 반짝이게 하는 코드입니다.

 

 

 

2) 결과

 

반응형

+ Recent posts