Dbnull in VB.NET存储过程OUT参数

时间:2014-08-20 19:38:42

标签: mysql asp.net vb.net stored-procedures error-handling

我遇到的问题是存储过程没有把我的结果带到我的VB.NET端。当我在Mysql数据库中测试我的存储过程时,它完美无缺。所以我认为这是VB.NET方面。我尝试了很多在网上看到的方法,它们与我下面的代码非常相似。那么告诉我我做错了什么?我如何评估当我连接到DB时发生的事情,我在OUT参数中无法得到任何答案。

Try
    conexion.Open()
    command.Connection = conexion
    command.CommandText = "DUA_ENCABEZADO_TRAERPAISORIGEN"
    command.CommandType = CommandType.StoredProcedure

    command.Parameters.AddWithValue("@COD_DUA", CInt(TxtCodDUA.Text))
    command.Parameters("@COD_DUA").Direction = ParameterDirection.Input               
    command.Parameters.Add("@CODIGO_PAIS", MySqlDbType.VarChar, 2).Direction = ParameterDirection.Output
    command.ExecuteNonQuery()


    XML_PaisOrigen = command.Parameters(1).Value.ToString   

    conexion.Close()

Catch ex As Exception
    MsgBox(ex.Message & vbCrLf & "Error al ejecutar << " & ex.Message,MsgBoxStyle.Critical, "Error Popup")

End Try

'XML_PaisOrigen是一个字符串

这是我的Mysql SP:

CREATE DEFINER=`root`@`localhost` PROCEDURE `DUA_ENCABEZADO_TRAERPAISORIGEN`(
     IN COD_DUA INT,
     OUT CODIGO_PAIS VARCHAR(2))

这是我对SP的调用并在MYSQL方面工作:

SET @COD_DUA =1;
CALL DUA_ENCABEZADO_TRAERPAISORIGEN(@COD_DUA,@CODIGO_PAIS);
SELECT @CODIGO_PAIS;

3 个答案:

答案 0 :(得分:0)

我通常做的是将参数放入变量中,以便更容易使用。

    Try
        conexion.Open()
        command.Connection = conexion
        command.CommandText = "DUA_ENCABEZADO_TRAERPAISORIGEN"
        command.CommandType = CommandType.StoredProcedure

        dim p1 as sqlParameter = command.Parameters.AddWithValue("@COD_DUA", CInt(TxtCodDUA.Text))
        p1.Direction = ParameterDirection.Input               
        dim p2 as sqlParameter = command.Parameters.Add("@CODIGO_PAIS", MySqlDbType.VarChar, 2)
        p2.Direction = ParameterDirection.Output
        command.ExecuteNonQuery()


       XML_PaisOrigen = p.Value.ToString   

       conexion.Close()

    Catch ex As Exception
        MsgBox(ex.Message & vbCrLf & "Error al ejecutar << " & ex.Message,MsgBoxStyle.Critical, "Error Popup")

    End Try

答案 1 :(得分:0)

您可以使用if运算符和IsDBNull()来避免错误。我假设你想要一个空字符串,如果存储过程返回一个NULL值:

XML_PaisOrigen = If(IsDBNull(command.Parameters(1).Value), "", command.Parameters(1).Value.ToString)

答案 2 :(得分:-1)

我得到了解决方案。 SP有时会如何运作,这真的很奇怪。首先下载此程序。我的味道是http://www.devart.com/dbforge/mysql/studio/code-debugger.html

     FETCH cur_paisorigen INTO Var2;
             IF Var2 = Var1 then                    
                  If v_finished = 1 then
                     -- SET Var_Result = Var2;  It WAS HERE             
                      leave cur_loop;
                   SET Var_Result = Var2;   -- NEXT I TRIED HERE AND IT WORK
                 End If;
              else
                 SET Var_Result = 216;
                 leave cur_loop;
               End If;

此SET Var_Result;

确保您的设置OUT PUT变量清洁。我不得不调试我的SP。弄清楚。因为当我在MYSQL Workbench中执行SP时,它完美无缺。但是当我使用这个程序调试我的OUT变量时,它变为NULL。因此,请确保将OUT变量设置为干净。

我今天学到的另一件事。将你的变量设置在循环中而不是在循环中。