2012-08-03 10 views
0

이 내 로컬 컴퓨터에서 잘 작동하지만 생산에, 그것은 나에게 위의 오류를 제공 내 저장 프로 시저 :MYSQL 오류 1414 - 오류 만들 나던 의미

: 그것은 OUT 매개 변수, 마지막에 대해 불평

   MySqlCommand command = new MySqlCommand("insert_projects", dbcontroller.conn); 
       command.CommandType = System.Data.CommandType.StoredProcedure; 

       // Add parameters for the insert_projects STORED PROC 
       command.Parameters.Add(new MySqlParameter("userName", SessionBag.Current.UserName)); 
       command.Parameters["@userName"].Direction = System.Data.ParameterDirection.Input; 

       command.Parameters.Add(new MySqlParameter("projectCode", MySqlDbType.Int64)); 
       command.Parameters["@projectCode"].Direction = System.Data.ParameterDirection.Output; 

       command.Parameters.Add(new MySqlParameter("projectName", model.projectName)); 
       command.Parameters.Add(new MySqlParameter("projectDescription", model.projectDescription)); 
       command.Parameters.Add(new MySqlParameter("projectCurrency", model.projectCurrency)); 
       command.Parameters.Add(new MySqlParameter("projectBudget1", model.projectBudget1)); 
       command.Parameters.Add(new MySqlParameter("projectBudget2", model.projectBudget2)); 
       command.Parameters.Add(new MySqlParameter("projectEndDate", model.projectEndDate)); 
       command.Parameters.Add(new MySqlParameter("expectedDelivDate", model.expectedDelivDate)); 
       command.Parameters.Add(new MySqlParameter("projectMessageForBidder", model.projectMessageForBidder)); 

       try 
       { 
        command.ExecuteNonQuery(); 

        TempData["projectCode"] = (Int64)command.Parameters["?projectCode"].Value; 
        TempData["frompage"] = "AddProject"; 

        dbcontroller.conn.Close(); 
        return RedirectToAction("MyProjectsHeaderSR", "Projects"); 
       } 

왜 이것에 대해 불평한다 : 아래

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_projects`(
     IN userName varchar(20), 
     IN projectName text, 
     IN projectDescription text, 
     IN projectCurrency text, 
     IN projectBudget1 double, 
     IN projectBudget2 double, 
     IN projectEndDate DATETIME, 
     IN expectedDelivDate DATETIME, 
     IN projectMessageForBidder text, 
     OUT projectCode bigint) 
BEGIN 

DECLARE 
    l_project_code bigint; 

     insert into projects 
     (PROJECT_CODE, 
     SR_USER_NAME , 
     PROJECT_NAME, 
     PROJECT_DESCRIPTION, 
     PROJECT_CURRENCY, 
     PROJECT_BUDGET1 , 
     PROJECT_BUDGET2 , 
     PROJECT_STATUS, 
     PROJECT_END_DATE, 
     PROJECT_PAID, 
     EXPECTED_DELIV_DATE, 
     PROJECT_MESSAGE_FOR_BIDDER, 
     PROJECT_CREATION_DATE, 
     PROJECT_UPDATE_DATE) 
     values 
     (
     0, 
     userName, 
     projectName, 
     projectDescription, 
     projectCurrency, 
     projectBudget1, 
     projectBudget2, 
     'Active', 
     projectEndDate, 
     null, 
     expectedDelivDate, 
     projectMessageForBidder, 
     NOW(), 
     NOW()); 

     SELECT LAST_INSERT_ID() into l_project_code; 

     SET projectCode = l_project_code; 
END 
그 매개 변수를 설정, 내 C# 코드인가? 내 로컬 컴퓨터가 잘 작동합니다. "projects"테이블에는 BIGINT 자동 증가로 설정된 project_code라는 필드가 있습니다. 나머지 필드는 일반 데이터 유형입니다.

좋아, 나는 .. 변수를 만들었으며 그것은 ..에서 동일한 오류를 통과

  if (dbcontroller.DBConnection()) 
      { 
       Int64 projectCode = 0; 

       MySqlCommand command = new MySqlCommand("insert_projects", dbcontroller.conn); 
       command.CommandType = System.Data.CommandType.StoredProcedure; 

       // Add parameters for the insert_projects STORED PROC 
       command.Parameters.Add(new MySqlParameter("userName", SessionBag.Current.UserName)); 
       command.Parameters["@userName"].Direction = System.Data.ParameterDirection.Input; 

       command.Parameters.Add(new MySqlParameter("projectCode", projectCode)); 
       command.Parameters["@projectCode"].Direction = System.Data.ParameterDirection.Output; 

그것은 여전히 ​​나던 일

+0

로컬 컴퓨터가 프로덕션 컴퓨터보다 최신 버전의 MySQL을 실행하고 있습니까? 5.5.3에서 수정 된 관련 버그가있었습니다. –

+0

예. 5.5.17. 실행 중입니다. 프로덕션 박스에서 버전을 구하려고 노력하고 있습니다.하지만 다음 호스팅 제공 업체는 기다리고 있습니다 .- (.. 나는 그들이 5.5.17을 실행하고 있는지 의심 스럽습니다. 이 버그 수정에 대한 링크를 제공해 줄 수 있습니까? –

+0

http://dev.mysql.com/doc/refman/5.5/en/news-5-5-3.html - "이전에 준비된 CALL 문 ..."섹션을 확인하십시오. –

답변

0

당신이 설명하는 오류는 이전 버전의 버그의 결과입니다 MySQL, resolved in MySQL 5.5.3. 로컬 시스템에서 버그가 수정되고 프로덕션 서버가 이전 버전을 실행하는 MySQL 버전을 실행하고있을 가능성이 큽니다.

가장 좋은 방법은 다음 때까지 해결로 서버를 업그레이드 할 수 있지만 결과가, 당신은 단순히 LAST_INSERT_ID()을 선택하는 절차를 변경할 수 있습니다 (하지 변수로하지만, 결과 세트로), 및 프로세스 귀하의 변수에.

부수적으로, INOUT 매개 변수를 사용할 때 유사한 상황이 발생할 수 있습니다. OUT 매개 변수를 사용하고 있지만 다음 경우는 적용되지 않습니다. INOUT 매개 변수는 채울 변수를 제공하지 않을 때 상황이 발생하지만 다음과 같이 적용됩니다.

라인 :

command.Parameters.Add(new MySqlParameter("projectCode", MySqlDbType.Int64)); 

은 ... 명령 개체에 대한 명명 된 매개 변수 및 유형을 제공하지만, 그것을 채우는 아무것도 제공하지 않습니다. INOUT 매개 변수를 사용하는 경우 빈 변수를 제공하고 전달해야합니다. 그것은 SP에게 어떤 것을 출력 할 것입니다.

+0

projectCode는 저장 프로 시저의 반환 값입니다. 위 코드를 통해 DB에서 값을 반환 할 때이 메서드를 사용했습니다. 필드를 반환하려면 , project_type라는 DB에서 project_type, 내가 위와 동일하게 작동합니다. 위의 코드에서 유일한 차이점은 projectCode 자동 증가 및 l_project_code SELECT LAST_INSERT_ID() 않습니다. 위의 yur 설명, 어떻게하면 좋을까요? 저에게 모범을 줄 수 있습니까? –

+0

좋습니다, t 안녕하세요, MYSQL 버전 5.0.77을 사용하고 있습니다 .. 내 C# 코드 내에서 MYSQL 매개 변수를 선언 할 때처럼 보입니다. 순서는 스토어드 프로 시저에서 이러한 매개 변수가 수신되는 순서에 따라 결정됩니다. 그러나, 내 쪽, 버전 5.5.17, 나는 어떤 순서로든이 매개 변수를 선언하고, 그것은 여전히 ​​작동 .. 그것은 버전인가, 아니면 내 코딩이 잘못 되었습니까? 주문이 실제로 중요합니까? –

+0

[5.3.3 for docs] (http://dev.mysql.com/doc/refman/5.5/en/call.html)에서는 이렇게 말합니다. "MySQL 인터페이스를 제공하는 언어로 작성된 프로그램의 경우 CALL 문에서 OUT 또는 INOUT 매개 변수의 결과를 직접 검색하기위한 MySQL 5.5.3 이전의 원시 메소드가 없습니다. 매개 변수 값을 얻으려면 사용자 정의 변수를 CALL 문의 프로 시저에 전달한 다음 SELECT 문을 실행하여 변수 값을 포함하는 결과 세트 ". 자리 표시 자 위치가 적절하다고 생각합니다. –