반응형

안녕하세요

 

코딩연습생입니다

 

비쥬얼스튜디오 2010에서 작성한 C#코드를 비쥬얼 스튜디오 2017이 설치되어 있는 PC로 복사 후 실행 하였더니..

 

난생 처음 보는 에러가 뜨네요

 

 

헉...핵 당황...

 

처음 보는 오류라서 구글 검색을 엄청 많이 해봤어요

 

 

모든 외국 싸이트의 헬퍼글까지 읽었지만...

 

해결 방법이 안나오더라구요

 

제가 해본 방법은

 

1. Nuget으로 "Microsoft.CodeDom.Providers.DotNetCompilerPlatform"의 최신버전을 설치 해봐라.

   - 결과 실패

   - 다시 복원하는게 짜증남

 

2. C:\Users\Administrator\AppData\Local\Temp 폴더안에 있는 어셈블리를 삭제후 리빌드해봐라

  - 해당 폴더에 가면 아래와 같은 파일이 있는데 이걸 삭제 해보라고 함

  - 결과 실패

 

3. 언어 버전을 변경해 봐라

  - C# 4.0이 비쥬얼 스튜디오 2010, 비쥬얼스튜디오 2017은 C# 6.0을 지원한다고 합니다

  - 결과 실패

 

4. 소스 코드 재 설정(?)

  - 구글 검색하다 해외 헬퍼 글에서 이상한 글을 보게 됨

  - 빨간줄을 친 부분 간략하게 해석을 하면 

    '문제가 생긴 오류 코드에서 보이지 않는 오류 부분을 포함한 3줄을 삭제 후에 Enter키를 한번 누루고 재작성하면

    해결 됩니다.."

    무슨 X소리야!!!!

 

하지만 쥐푸라기라도 잡고 싶은 심정으로 해봣습니다...

 

오류 화면 입니다 202 오류..

 

해외 글에서 있는것 처럼 3줄을 삭제 했습니다

 

오류 내용이 바뀌엇네요?? 왠지 뭐가 될거 같기도....

 

지웠던 3줄의 내용을 다시 타이핑해서 다시 재생성 헀습니다

 

 

어이 없게 오류가 싹 사라졌어요..

 

빌드를 해볼께요..

 

 

이런 어이 없는 결과가 나왓네요...해결 되었습니다

 

이유를 유추해보면 비쥬얼스튜디오 버전별 Bulider 버전이 상이한데 2010으로 작성된 소스코드를 강제로

 

복사하여 2017로 실행하엿을 경우 Bulider이가 소스 코드의 문자열 판독을 이상하게 한다(?)

 

그래서 복사된 2017에서 코드를 재생성해서 빌드를 해주면 올바른 버전에서 끝점을 인식하여 정상화 된다

 

이런 이유인거 같습니다

 

혹시 저와 같은 오류로 몇일째 시간을 허비 하시는 분들을 위해서 포스팅 올려 드리니 시간 허비 하지 마시고

 

해결 하세요~

 

반응형
반응형

안녕하세요

 

코딩연습생입니다

 

C# WINFORM 환경에서 DB 위치에서 데이터를 받아 DataGridView에 데이터를 바인딩 한뒤

 

Row추가 진행시 다음과 같은 오류가 발생합니다

 

이럴경우 DataTable를 이용해서 해결 할 수 있는데요

 

일단 프로시져의 내용을 DataGridView에 바인딩 시켜 줍니다.

private void Load()
        {
            string query = "EXEC SP_SHIP_DELIVERY_LIST";
            query += "           'SELECT',";                         //구분
            query += "           '" + textBox1.Text + "',";          //Cust_Code
            query += "           '" + textBox3.Text + "',";          //Delivery_Code
            query += "           '" + textBox2.Text + "',";          //Part_Code
            query += "           '" + textBox4.Text + "',";          //Cust_GridNo
            query += "           '',";                               //Part_Name
            query += "           '',";                               //Active
            query += "           ''";                                //Remark
            SAC_MesDB db = new SAC_MesDB();
            
            dataGridView1.DataSource = db.ExcuteQuery(query);

            dataGridView1.Columns[0].ReadOnly = true;
            dataGridView1.Columns[1].ReadOnly = true;
            dataGridView1.Columns[2].ReadOnly = true;
        }

간단합니다.

 

MSSQL에 있는 SP_SHIP_DELIVERY_LIST 프로시져를 호출해서 DataGridView에 바인딩 시키는 부분입니다

 

그런데 문제는 이게 아니죠

 

DataGridView에 데이터바인딩 이후에 Row 추가를 하게 되면 다음과 같은 오류가 발생합니다

 

"컨트롤이 데이터 바인딩된 경우에는 datagridview의 행 컬렉션에 프로그래밍 방식으로 행을 추가할 수 없습니다"

 

그래서 폭풍 검색을 했더니 DataTable에 담아 그리드가 아닌 dt에 Row를 추가하면 동작한다고 해서 변경해 봤습니다

 

private void Load()
        {
        	DataTable dt = new DataTable();
            
            string query = "EXEC SP_SHIP_DELIVERY_LIST";
            query += "           'SELECT',";                         //구분
            query += "           '" + textBox1.Text + "',";          //Cust_Code
            query += "           '" + textBox3.Text + "',";          //Delivery_Code
            query += "           '" + textBox2.Text + "',";          //Part_Code
            query += "           '" + textBox4.Text + "',";          //Cust_GridNo
            query += "           '',";                               //Part_Name
            query += "           '',";                               //Active
            query += "           ''";                                //Remark
            SAC_MesDB db = new SAC_MesDB();
            
            dt = new DataTable();
            
            dt = db.ExcuteQuery(query);
            
            dataGridView1.DataSource = dt;

            dataGridView1.Columns[0].ReadOnly = true;
            dataGridView1.Columns[1].ReadOnly = true;
            dataGridView1.Columns[2].ReadOnly = true;
        }

이렇게 구문을 바꾸어서 Row를 추가해 봤습니다

 

Row를 추가하는 버튼 이벤트 입니다

private void hoverGradientButton3_Click(object sender, EventArgs e)
        {
            int MaxRow = dataGridView1.Rows.Count;

            if (MaxRow >= 0)
            {
                if (dataGridView1.Rows[MaxRow - 1].Cells[0].Value.ToString() != "")
                {
                    string[] row0 = { "", "", "", "", "", "", "" };
                    dt.Rows.Add(row0);
                    
                    dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0].Style.BackColor = Color.Yellow;
                    dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[1].Style.BackColor = Color.Yellow;
                    dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[2].Style.BackColor = Color.Yellow;
                }
                else
                {
                    MessageBox.Show("추가 등록은 한번에 하나씩만 가능합니다.");
                }
            }
        }

 

오옷!! 동작을 합니다

처음 바인딩 후 동작

단, 이상한 현상이 발생했습니다

 

처음 데이터 바인딩 이후에는 잘 추가가 되는데 한번 바인딩이 된 이후에 데이터가 재 바인딩 되면 MaxRow를 

 

찾기 못하고 추가가 되지 않는 현상이 발생합니다

 

재바인딩 후 동작

음...뭐가 문제인지 모르겠지만 구문을 다시 한번 바꾸어 봤습니다

 

폼의 상단에 DataTable를 선언합니다

 

private DataTable dt;

조회되는 부분에서는 프로시져만 호출하고 바인딩 시킵니다

private void Load()
        {
            string query = "EXEC SP_SHIP_DELIVERY_LIST";
            query += "           'SELECT',";                         //구분
            query += "           '" + textBox1.Text + "',";          //Cust_Code
            query += "           '" + textBox3.Text + "',";          //Delivery_Code
            query += "           '" + textBox2.Text + "',";          //Part_Code
            query += "           '" + textBox4.Text + "',";          //Cust_GridNo
            query += "           '',";                               //Part_Name
            query += "           '',";                               //Active
            query += "           ''";                                //Remark
            SAC_MesDB db = new SAC_MesDB();

            dataGridView1.DataSource = db.ExcuteQuery(query);

            dataGridView1.Columns[0].ReadOnly = true;
            dataGridView1.Columns[1].ReadOnly = true;
            dataGridView1.Columns[2].ReadOnly = true;

        }

 

Row 추가 이벤트 구문에서 DataTable를 선언하고 Row 추가 이후에 DataTable에 신규 Row를 추가 합니다

 

        private void hoverGradientButton3_Click(object sender, EventArgs e)
        {
            int MaxRow = dataGridView1.Rows.Count;

            if (MaxRow >= 0)
            {
                if (dataGridView1.Rows[MaxRow - 1].Cells[0].Value.ToString() != "")
                {
                    dt = new DataTable();
                    dt = dataGridView1.DataSource as DataTable;
                    string[] row0 = { "", "", "", "", "", "", "" };
                    dt.Rows.Add(row0);
                    dataGridView1.DataSource = dt;
                    
                    dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0].Style.BackColor = Color.Yellow;
                    dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[1].Style.BackColor = Color.Yellow;
                    dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[2].Style.BackColor = Color.Yellow;
                }
                else
                {
                    MessageBox.Show("추가 등록은 한번에 하나씩만 가능합니다.");
                }
            }
        }

 

이렇게 변경하고 실행을 해 보았습니다

 

역시 처음 바인딩시에는 정상적으로 잘 되는것을 확인했습니다

 

다음은 재바인딩 후에 실행해 보겠습니다

 

 정상적으로 추가되는 모습을 확인할 수 있습니다

 

이렇게 동일한 방식으로도 어는 위치에서 동작하는지에 따라 문제가 될 수 있다는걸 알 수 있는 계기였습니다ㅎ

(이걸 찾아내는냐고 2시간을 버렸네요..ㅠ)

 

문제없이 디버깅 통과 모습

저와 같은 문제로 고민 하는 분이라면 이렇게 DataTable 위치를 변경해서 구동 해 보시기 바랍니다

 

 

반응형
반응형

안녕하세요

 

코딩하는남자 "코딩연습생" 입니다!!

 

간혹 비쥬얼스튜디오로 코딩하고 빌드할려는데 "lc.exe가 종료되었습니다"라는 오류가 뜰 경우가 있습니다

 

 

 

이건 소스를 복사해서 사용하실대 Properties에 있는 licenses.licx라는 파일 안에 정보가 변경되어 나타나는

 

에러라고 합니다!!

 

그래서 나는 빌드를 하고 싶은데 "lc.exe"이(가) 종료되었습니다(코드: -1) 오류가 뜰때 해결 할 수 있는 방법을

 

알려드리겠습니다

 

 

[해결 방법]

1. 솔루션 탐색기에서 Properties 밑에 있는 licenses.licx 파일 찾습니다

 

 

2. licenses.licx 파일에서 마우스 오른쪽 버튼을 눌러 "삭제"를 해주세요

 

 

3. 삭제가 된것을 확인한 후에 다시 빌드를 해주세요

 

 

4. 그럼 다음과 같이 빌드 성공이 됩니다

 

 

 

참 별것 아니지만 귀찮은 에러죠ㅎㅎ

 

프로젝트를 복사해서 이동해야 할 경우 이런 현상이 많이 발생하니 잘 알아두셨다가 

 

당황하지 마시고 조치 해서 해결하시길 바랍니다~

 

 

반응형

+ Recent posts