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 に答える