Dapper ORM Access에서 기능 삭제

c# dapper ms-access

문제

오늘 Access에서 작업 할 때 Access에서 테이블 이름 중 하나를 변경하고 코드를 업데이트하지 않고 테스트를 시도했습니다.

예를 들어 내 코드는

Product product = new Product();                                                                                                 //Delete Works well
product.ProductNumber = "P1";
product.Description = "TestProduct1";

var deleteStatement = @"Delete from Product Where Description = @Description";
int outp = con.Execute(deleteStatement, new { Description = product.Description });

그리고 데이터베이스에있는 내 Product 테이블은 다음과 같습니다.

그리고 데이터베이스에있는 내 Product 테이블은 다음과 같습니다.

'설명'을 '설명'으로 변경하기 전에 모든 것이 완벽하게 작동합니다. 그러나 코드를 변경했을 때 (코드에서 아무 것도 변경하지 않은) 코드를 변경하면 전체 테이블이 삭제됩니다. 나는 혼란 스럽다. 누군가 실수로 테이블 이름을 변경하고 코드를 업데이트하지 않는 것이 현실적이기 때문입니다. 왜이 문제가 발생 했습니까? 이것에 대한 유효성 검사를하는 방법은 무엇입니까?

개인적으로 필드가 Access 데이터베이스에 없으면 예외를 반환하거나 아무것도 수행하지 않아야한다고 생각합니다.

최신 정보

현재 확인 후 삭제를하고 있습니다.

con.Query<Products>("select ProductNumber, Description from products")

적절한 필드 이름이 필요한 테이블에 없으면 예외가 생성됩니다. 그러나 이것은이 질문에 대한 답이 될 수 없습니다. 나는 누군가로부터 적절한 대답을 기대하고있다.

수락 된 답변

귀하의 문제를 재현 할 수 있었고 원래 필드 이름이 Description 이라는 사실과 관련이있는 것 같고 매개 변수 선언 @Description 은 Dapper가 .ParameterNameDescriptionOleDbParameter 를 작성하게합니다.

첫 번째 경우 열 Description 실제로있을 때 Access 데이터베이스 엔진이이 인식합니다

var deleteStatement = @"Delete from Product Where Description = @Description";
//                                                ^^^^^^^^^^^

유효한 열 이름으로 DELETE가 예상대로 작동합니다.

열 이름이 DescrDescr Access 데이터베이스 엔진은 Description 이 필드 이름으로 인식되지 않으므로 ( Description 이 아닌 경우) 다른 매개 변수 자리 표시자가됩니다. 결과는 다음과 같이 평가되는 진술 인 것 같습니다.

Delete from Product Where Description = Description

매개 변수와 자체 Description = Description 의 비교가 항상 TRUE 가 될 것이므로 실제로는

Delete from Product Where TRUE

모든 행이 삭제됩니다.

이 조건은 Dapper에 제공하는 매개 변수 이름이 필드 이름과 일치하지 않도록함으로써 피할 수 있습니다. 예를 들어, 다음 코드에서는 Description 필드의 DescriptionDescr 로 바뀐 후에 예외가 발생합니다.

var deleteStatement = @"Delete from Product Where Description = @d";
int outp = con.Execute(deleteStatement, new { d = product.Description });


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow