2017-12-20 55 views
0

"조건 식에서 데이터 형식이 일치"를 제공합니다 나는 다음과 같은 코드가 있습니다 cmd_oper의 두 번째 변종 (코드의 시작 부분에 주석 안 하나)와업데이트 명령은

/* 
// it works 
cmd_oper = "UPDATE [Model Elements] SET [Record Status] = \"Disabled\" WHERE [Index] = @db_idx"; 
/*/ 
// it doesn't work 
cmd_oper = "UPDATE [Model Elements] SET [Record Status] = @stat WHERE [Index] = @db_idx"; 
//*/ 
using(OleDbCommand cmd = new OleDbCommand(cmd_oper, svr_conn)) 
{ 
    cmd.Parameters.Add("@db_idx", OleDbType.Integer).Value = 2; 
    //cmd.Parameters.Add("@stat", OleDbType.VarChar).Value = "Disabled"; 
    cmd.Parameters.AddWithValue("@stat", "Disabled"); 
    cmd.ExecuteNonQuery(); 
} 

을 나는 "취득 조건 식의 데이터 형식이 일치하지 않습니다 ". 다른 하나는 작동합니다. 레코드 상태 열의 유형은 데이터베이스에서 간단한 텍스트로 설정됩니다. StackOverflow에서이 오류와 관련된 많은 게시물을 알고 있지만 정확한 일치를 찾을 수 없습니다. 감사.

+1

oledb를 사용하면 SQL 문에 나타나는 순서대로 매개 변수를 제공해야합니다. –

+0

매개 변수에 varchar 길이를 추가해야합니다 : cmd.Parameters.Add ("@stat", OleDbType.VarChar, 100).값 = "사용 안 함"; –

+0

@mh__ 아니요, 더 좋을 필요는 없습니다. – Steve

답변

1

미세 설명서, https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters(v=vs.110).aspx는 매개 변수에 대해 뭐라고 다음이

는 OLE DB .NET 공급자하지 않습니다 SQL 문 또는 에서 OleDbCommand에 의해 호출 저장 프로 시저에 매개 변수를 전달하는 명명 된 매개 변수를 지원 CommandType이 Text로 설정된 경우. 이 경우 물음표 (?) 자리 표시 자 을 사용해야합니다. 예 :

SELECT * 고객 고객 ID = =?

따라서, 순서는 OleDbParameter 개체 직접 명령 텍스트의 파라미터 물음표 자리의 위치에 대응해야 OleDbParameterCollection에 추가된다. 그것은 가치가 무엇인지, 당신은 아마 현명하게 당신의 매개 변수 이름을 지정해야 들어

cmd_oper = "UPDATE [Model Elements] SET [Record Status] = ? WHERE [Index] = ?"; 
using(OleDbCommand cmd = new OleDbCommand(cmd_oper, svr_conn)) 
{ 
    cmd.Parameters.AddWithValue("anything-name-doesnt-matter", "Disabled"); 
    cmd.Parameters.Add("its-position-that-matters", OleDbType.Integer).Value = 2; 
    cmd.ExecuteNonQuery(); 
} 

(나는 이름이 무관 함을 입증하는 바보 위를 이름 :

인체 공학적, 난 당신처럼되고 코드를 필요가 있다고 생각 단지 차에 의해,

여기
cmd.Parameters["its-position-that-matters"].Value = 3; 
    cmd.ExecuteNonQuery(); 
    cmd.Parameters["its-position-that-matters"].Value = 4; 
    cmd.ExecuteNonQuery(); 
    cmd.Parameters["its-position-that-matters"].Value = 5; 
    cmd.ExecuteNonQuery(); 
    cmd.Parameters["its-position-that-matters"].Value = 6; 
    cmd.ExecuteNonQuery(); 

내가 너무 index 값 3, 4, 5, 6에 대한 업데이트를 실행했습니다 생각이 한 번 준비되어 있기 때문에), 당신은 몇 번이나 그냥 매개 변수를 변경 문을 실행할 수 있습니다 매개 변수 값을 설정하고 다시 실행하십시오. 따라서 "색인"매개 변수의 의미있는 이름을 선택하여 코드를보다 읽기 쉽게 만들었습니다.

스티브는 자신의 의견에서 을 쿼리를 사용하지만 이름은 무시됩니다 (본질적으로 ? 표시로 처리됩니다). 따라서 매개 변수 값을 자리 표시자가 나타나는 순서와 동일한 순서로 추가해야합니다. 쿼리에서 자리 표시자를 반복했다면 매개 변수 컬렉션에 반복하여 추가해야합니다. steve의 단언의 정확성에 대해서는 언급하지 않았습니다. 나는 항상이 정말 엔티티 프레임 워크와 같은 데이터 액세스 라이브러리를 사용하여 학습에 도착하고 버튼의 클릭 이벤트 핸들러에서 SQL 문자열을 작성 중지해야 모든 좋은 증거이며, 궁극적으로

?를 사용했습니다 - 그렇지 않아 코드 작성에 좋은 방법입니다. 처음부터 EF를 사용했다면 결코이 문제에 부딪치지 않았을 것입니다. 비록 매개 변수화 된 쿼리를 사용하는 것이 좋습니다. 이제 EF를 확인하고이 '90 년대 당나귀 방식으로 데이터 액세스를 수행하십시오.