2012-12-19 40 views
0

我有一個小的vb.net應用程序,試圖將輸入參數移交給mysql服務器上的存儲過程。mysql存儲過程嘗試使用vb.net交付輸入參數

問題是,該過程可以被執行,但它只插入iddnization離開projectno列空。

這是我的存儲過程:

DELIMITER $$ 

CREATE DEFINER=`user1`@`%` PROCEDURE `InsertProject`() 
BEGIN 

DECLARE prno varchar (45); 

INSERT Into project (idorganisation, projectno) values ((select idorganisation from user where usercol1 = (SELECT SUBSTRING_INDEX(USER(),'@',1))), 
@prno); 
END 

我vb.net代碼:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Dim con As New MySqlConnection(My.Settings.welddocconnectionstring) 
    Dim cmd As New MySqlCommand("InsertProject", con) 
    cmd.CommandType = CommandType.StoredProcedure 

    Dim prno As New MySqlParameter("@prno", MySqlDbType.VarChar, 45) 
    prno.Direction = ParameterDirection.Input 
    prno.Value = "Test" 
    cmd.Parameters.Add(prno) 


    Try 
     con.Open() 
     cmd.ExecuteNonQuery() 
     con.Close() 
    Catch ex As MySql.Data.MySqlClient.MySqlException 
     MessageBox.Show(ex.Message) 
    Finally 
     con.Dispose() 
    End Try 

End Sub 

謝謝你和問候 Josch

回答

0
  1. 您需要定義prno作爲參數到您的存儲過程,而不是在其中聲明爲local variable;我採取以用下劃線前綴我的參數名稱,以避免在後續的表達式的任何模糊的約定:

    CREATE PROCEDURE InsertProject(IN _prno VARCHAR(45)) ... 
    
  2. 你的程序只包含一個語句,所以你不需要附上它的身體在一BEGIN ... END複合語句塊。

  3. prno一個user-defined variable,所以不要用@前綴它。

  4. 您不需要使用子查詢來評估SUBSTRING_INDEX()

    WHERE usercol1 = SUBSTRING_INDEX(USER(),'@',1) 
    
  5. 可以使用INSERT ... SELECT這裏。

    INSERT INTO project 
        (idorganisation, projectno) 
    SELECT idorganisation, _prno 
    FROM user 
    WHERE usercol1 = SUBSTRING_INDEX(USER(),'@',1) 
    

因此:

CREATE DEFINER=`user1`@`%` PROCEDURE InsertProject(IN _prno VARCHAR(45)) 
    INSERT INTO project 
    (idorganisation, projectno) 
    SELECT idorganisation, _prno 
    FROM user 
    WHERE usercol1 = SUBSTRING_INDEX(USER(),'@',1) 
; 
+0

謝謝eggyal。 – user1915753