2013-08-10 3 views
-1

SQL 저장 프로 시저로 다음 코드를 실행할 때 올바른 결과 대신 -1이 표시됩니다. 코드에 어떤 문제가 있습니까? 도와주세요.함수가 작동하지 않습니다

ALTER PROCEDURE GetTopMaterial 
AS 
BEGIN 
SELECT TOP (1) MaterialId 
FROM Materials 
END 


public static int GetTopMaterial() 
{ 
    SqlHelper objSqlHelper = new SqlHelper(); 
    return (int)objSqlHelper.ExecuteScalar("GetTopMaterial"); 
} 

int id =Cart.GetTopMaterial() 

public object ExecuteScalar (string query) 
{ 
SqlConnection cnn = new SqlConnection (strConnectionString); 
SqlCommand cmd = new SqlCommand (query, cnn); 
if (query.StartsWith ("SELECT") | query.StartsWith ("select")) 
{ 
    cmd.CommandType = CommandType.Text; 
} 
else 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
} 
cnn.Open(); 
object retval = cmd.ExecuteNonQuery(); 
cnn.Close(); 
return retval; 
} 

public object ExecuteScalar(string query, params SqlParameter[] parameters) 
{ 
     SqlConnection cnn = new SqlConnection(strConnectionString); 
     SqlCommand cmd = new SqlCommand(query, cnn); 
     if (query.StartsWith("SELECT") | query.StartsWith("select")) 
     { 
      cmd.CommandType = CommandType.Text; 
     } 
     else 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
     } 
     for (int i = 0; i <= parameters.Length - 1; i++) 
     { 
      cmd.Parameters.Add(parameters[i]); 
     } 
     cnn.Open(); 
     object retval = cmd.ExecuteScalar(); 
     cnn.Close(); 
     return retval; 
} 
+1

코드를 try/catch 사이에 배치하고 예외 코드 – Oscar

+0

을 표시합니다. 오류는 발생하지 않지만 결과는 표의 실제 값 대신 -1입니다. – ayha

+1

그리고 거래 코드가 SQL Management Studio에서 올바르게 실행됩니까? – Oscar

답변

7

그래서 당신은 ExecuteScalar 실제로 ExecuteNonQuery 포장된다. MSDN for ExecuteNonQuery에서 :

UPDATE, INSERT를 들어

, DELETE 문, 반환 값은 명령에 의해 영향을받는 행의 수입니다. 테이블에 삽입 또는 업데이트되는 트리거가있는 경우 반환 값에는 삽입 또는 업데이트 작업의 영향을받는 행 수 과 트리거 또는 트리거에 의해 영향을받는 행 수 이 반환됩니다. 다른 모든 유형의 문에 대한 반환 값은 -1입니다. 롤백이 발생하면 값은 -1로 반환됩니다.

+0

클래스에 두 개의 ExecuteScalar 함수가 있습니다. 그게 속임수일까요? 코드 섹션에 코드를 게시했습니다. – ayha

+0

내가 누락 된 것이 있습니까? 내가 게시 한 ExecuteScalar 함수 하나만 볼 수 있습니다. 두 함수가 모두'ExecuteNonQuery'를 래핑하는 경우, 단순히'SELECT'를 수행하는 스토어드 프로 시저에 대해 -1을 리턴합니다. – ethorn10

+0

바로이 부분. 함수의 반환 값은 ** NOT ** SQL 함수의 반환 값이며, 쿼리에 의해 반환 된 행이 아닌 ** 영향을받는 행의 수입니다. ExecuteNonQuery : Transact-SQL을 실행합니다. 성명서는 연결에 대한 진술을하고 영향을받는 행의 수를 반환합니다. –

관련 문제