2016-09-12 3 views
2

오늘 기능을 삭제, 난 Access에서 테이블 이름 중 하나를 변경하지만 코드에서 업데이트되지 예를 들어 동작단정 ORM 액세스와 내가 액세스와 함께 일하는

을 관찰하기 위해 시도하여 하나 개의 테스트를하려고 노력 제품 설명 '으로, 내 코드

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 }); 

되고 데이터베이스 내 제품 테이블'설명 '을 변경하기 전에

And my Product table in the database is

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

개인적으로 나는 그것이

현재 업데이트

, 나는이

을 통해 확인 후 삭제하고있는 중이 예외 또는 일을하지 아무것도 반환해야합니다 생각
con.Query<Products>("select ProductNumber, Description from products") 

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

답변

1

나는 당신의 문제를 재현 할 수 있었다 원래 필드 이름이 Description 사실과 관련이있을 것, 그리고 말끔 원인 @Description 매개 변수 선언이 OleDbParameter.ParameterName가 만들 Description. 첫 번째 경우에

, 열 Description이 실제로 존재하는 경우에 변경되었습니다로, 액세스 데이터베이스 엔진이 유효한 열 이름이

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

및 열 후 예상

와 DELETE 작업을 인식 Descr으로 변경하면 Access 데이터베이스 엔진은 Description을 필드 이름으로 더 이상 인식하지 않으므로 (아니기 때문에) 다른 매개 변수 자리 표시자가됩니다. 는 효과적으로

Delete from Product Where TRUE 

과 동일 항상 TRUE 될 것입니다, 결과는 문이

Delete from Product Where Description = Description 

으로 자체, Description = Description와 매개 변수의 비교 때문에 평가되고 있음을 보인다 모든 행이 삭제됩니다.

이 조건은 Dapper에 제공 한 매개 변수 이름이 필드 이름과 일치하지 않도록하여 피할 수 있습니다. 예를 들어, 다음 코드에서는 Description 필드의 이름을 Descr으로 바꾼 후에 예외를 throw합니다.

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