2012-10-25 1 views
2

나는 다음의 JScript 코드가 있습니다ADODB 명령 매개 변수화 SQL 쿼리와 실행 실패

var conn = new ActiveXObject ("ADODB.Connection"); 
conn.Open("Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=blah_blah_blah;User=foo;Password=bar;"); 
var cmd = new ActiveXObject("ADODB.Command"); 
cmd.ActiveConnection = conn; 

var strSQL = "SELECT id FROM tbl_info WHERE title LIKE :search ORDER BY id"; 
var search = "test"; 

try{ 
    cmd.CommandText = strSQL; 
    var param = cmd.CreateParameter(':search', 200, 1, 100, search); 
    cmd.Parameters.Append(param); 
    var rs = cmd.Execute(); 
    } 
catch (ex) { 
    Application.Alert("Error retrieving id information from database."); 
} 

내가 연결 개체가 명령 집합의 ActiveConnection로 설정되어 있는지 (을 인쇄하여) 확인한를 매개 변수 객체가있다 올바른 값과 Command 개체의 CommandText로 올바른 SQL 쿼리가 있습니다. 또한 try 블록의 각 줄 뒤에 경고문을 삽입하여 오류가 발생한 위치를 확인했습니다. cmd.Parameters.Append 후에도 문제가 없지만 Execute 문을 실행하면 예외가 throw됩니다.

실제 예외를 표시하려고했지만 일반 '개체 오류'메시지 일뿐입니다.

쿼리는 제대로 실행되고 Connection 개체를 통해 SQL 쿼리 (매개 변수없이)를 실행하면 올바른 결과 집합을 반환하지만 Command 개체와 매개 변수화 된 쿼리를 사용하면 실패합니다.

명령과 연결 개체의 모든 설정과 속성이 올바른지는 모르지만 어떤 이유로 든 예외가 발생합니다.

감사의 말을 전하면됩니다.

답변

2

일반적으로 ODBC 및 ADO에서는 물음표 ?이 매개 변수의 자리 표시 자로 사용됩니다. 매개 변수는 명령의 자리 표시 자에 대한 Parameters 컬렉션에 추가 된 순서대로 바인딩됩니다.

var strSQL = "SELECT id FROM tbl_info WHERE title LIKE ? ORDER BY id"; 

당신은 아직도 당신이 만드는 매개 변수의 이름을 수 있지만,이 역할을 할 수있는 유일한 목적은 (cmd.Parameters.Item(":search")으로, 예를 들어,) 나중에 이름을 참조 할 수 있습니다 : 당신의 예에서와 strSQL를 교체합니다.

+0

정말 고마워요. 그러나 이제는 여러 매개 변수를 사용하는 다른 쿼리가 있지만 모두 _same_ 매개 변수를 사용한다는 점에서 문제가 있습니다. 그래서 같은 쿼리에서 여러 번 참조되는 하나의 매개 변수 (예 : 검색)가 있습니다. 위에서 말했듯이 바인딩 된 매개 변수가 충분하지 않기 때문에 쿼리에 실패하면 매개 변수에 추가 순서대로 바인딩됩니다. 쿼리가 동적으로 생성되므로 정확하게 필요한 수의 매개 변수를 정확히 알 수 없습니다. 이 주위에 어떤 방법이 있습니까? – AdamLazaruso

+0

@AdamLazaruso, 내가 아는 것은 아닙니다. 이전과 비슷한 상황에서 필자는 쿼리를 작성하면서 매개 변수를 만들고 추가했습니다. –

+0

그건 내 코드에서 까다로울 수 있지만 다른 방법이 없다면 제대로 작동 할 것이라고 확신합니다. 감사! – AdamLazaruso