0

我有一个小型 vb.net 应用程序,试图将输入参数移交给 mysql 服务器上的存储过程。

问题是,该过程可以执行,但它只插入 idorganisation 将 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

谢谢你和最好的问候乔希

4

1 回答 1

0
  1. 您需要将其定义prno为存储过程的参数,而不是在其中声明为局部变量;我采用在参数名称前加上下划线的约定,以避免后续表达式中的任何歧义:

    CREATE PROCEDURE InsertProject(IN _prno VARCHAR(45)) ...
    
  2. 您的过程只包含一个语句,因此您不需要将其主体包含在BEGIN ... END复合语句块中。

  3. prno不是用户定义的变量,所以不要在它前面加上.@

  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)
;
于 2012-12-19T12:45:24.880 回答