2012-08-03 45 views
0

這是我的存儲過程,這在我的本地機器上工作正常,但在生產,它給了我上面的錯誤:它抱怨OUT參數,最後一個:MySQL錯誤1414 - 錯誤沒有道理

-- -------------------------------------------------------------------------------- 
-- 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#代碼,即設置的參數:

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

爲什麼抱怨呢?我的本地機器工作正常。表「projects」包含一個名爲project_code的字段,該字段設置爲BIGINT自動遞增...其餘字段是普通的數據類型。

好吧,我創建了一個變量..並在通過它..同樣的錯誤

  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中修復了一個相關的bug。 – 2012-08-03 11:35:07

+0

是的,它是..im運行5.5.17 ..我一直試圖獲得在生產箱的版本,但這些託管服務提供商正在讓我等待:-(我懷疑他們正在運行5.5.17 ..林肯定以及它的版本,你能否給我提供一個鏈接到這個錯誤修復? – 2012-08-03 11:44:26

+0

http://dev.mysql.com/doc/refman/5.5/en/news-5-5-3.html - 有一個看看「以前準備好的CALL語句......」開始的部分...... – 2012-08-03 11:52:24

回答

0

您所描述的錯誤是在舊版本中的一個錯誤的結果MySQL,resolved in MySQL 5.5.3。很可能您的本地計算機正在運行一個修復了bug的MySQL版本,並且生產服務器運行的是舊版本。

儘管最好的解決辦法是升級服務器,作爲解決辦法在那之前,你可以改變程序,只需選擇LAST_INSERT_ID()(而不是一個變量,而是進入一個結果集),並且過程導致進入你的變量。

順便提一句,使用INOUT參數時可能會出現類似的情況。儘管您使用的是OUT參數(因此以下內容不適用於您的情況),但如果參數INOUT沒有提供變量來填充,則會出現這種情況,下列情況同樣適用。

行:

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

...將提供一個名爲參數的命令對象,和類型,但不給它任何東西來填充。如果您使用的參數是INOUT,則需要提供一個空變量並將其傳入;它會給SP一些輸出。

+0

projectCode是存儲過程的返回值我在上面的代碼中使用了這個方法從DB返回值如果我想返回一個字段,稱爲projectType,它在數據庫中被稱爲project_type,我將按照上面的方式做同樣的工作。上面的代碼中唯一的區別是projectCode是一個自動增量,並且我將一個SELECT LAST_INSERT_ID()放入l_project_code中。上面的解釋,我如何做你的建議?你能舉個例子嗎? – 2012-08-03 11:18:14

+0

好的,t嘿正在使用MYSQL版本5.0.77 ..它看起來像當我在我的C#代碼中聲明MYSQL參數時,我聲明它們的順序基於這些參數在存儲過程中接收的順序。但是,在MY版本5.5.17中,我以任何順序聲明這些參數,並且它仍然有效。是版本還是MY編碼不正確?訂單確實重要嗎? – 2012-08-03 11:54:42

+0

[文檔5.3.3](http://dev.mysql.com/doc/refman/5.5/en/call.html)這樣說:「對於用提供MySQL接口的語言編寫的程序,在MySQL 5.5.3之前沒有本地方法直接從CALL語句中檢索OUT或INOUT參數的結果要獲取參數值,請將用戶定義的變量傳遞給CALL語句中的過程,然後執行SELECT語句以生成結果集包含變量值「。我猜佔位符的位置是相關的。 – 2012-08-03 12:08:11