제목이 적당한지는 잘 모르겠네요. 앞서 C#으로 SQL을 사용을 할 때 겪었던 문제점이 있었습니다. .NET에서 DB Data Adapter를 사용하여 테이블을 SELECT한 후, DataTable를 잘 채워 넣었습니다. 샘플을 잘 참조하여 구현하였기 때문에 전혀 문제가 없었죠. 하지만 문제는 DataTable의 Row를 편집/삭제(UPDATE/DELETE)하려고 할 때 발생했습니다. 바로 아래와 같은 예외를 발생하면서 프로그램이 멈춘 것입니다.

편집(UPDATE)의 경우에는,

  • System.InvalidOperationException was unhandled : 키 열 정보를 반환하지 않는 SelectCommand에 대해서는 UpdateCommand에 대한 동적 SQL 생성이 지원되지 않습니다.
  • System.InvalidOperationException was unhandled : Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.

삭제(DELETE)의 경우에는,

  • System.InvalidOperationException was unhandled : 키 열 정보를 반환하지 않는 SelectCommand에 대해서는 DeleteCommand에 대한 동적 SQL 생성이 지원되지 않습니다.
  • System.InvalidOperationException was unhandled : Dynamic SQL generation for the DeleteCommand is not supported against a SelectCommand that does not return any key column information.

도대체 무슨 문제가 있을까 좀 고민을 했죠. (오랜만에 또 삽질을 하는구나 생각을 했습니다. 흑)  그리고 다행이 문제점을 찾았습니다.

바로 DataTable의 Row를 편집/삭제(UPDATE/DELETE) 하기 위해서는 테이블 칼럼에 Primary Key가 존재해야 했었던 것이죠. 그 동안 항상 SQL Query문을 사용할 때는 행의 수정이나 삭제를 위해 WHERE (조건)문을 사용해 왔었는데, .NET 내부적으로도 그 것이 필요할 것이라는 생각을 하지 않고 있었던 것입니다. 이번에 테스트를 하기 위해 만든 테이블이 마침 그냥 간단한 문자열 칼럼 하나 밖엔 만들지 않았던 것이죠. 바로 그래서 WHERE 조건으로 처리할 칼럼이 없어서 예외가 발생한 것이었습니다.

그리고 테이블에 인덱스 컬럼을 하나 만들고 Primary Key를 설정했습니다. 그리고 문제없이 이젠 문제없이 잘 작동을 하더군요.

물론 Primary Key를 사용하지 않고도, UpdateCommand와 DeleteCommand를 사용할 수도 있다고 합니다. 관련 URL은 다음을 참고하세요. (https://blogs.msdn.com/spike/archive/2008/10/29/how-to-update-an-excel-worksheet-using-dataset-and-the-oledbdataadapter.aspx)

Leave a Reply