【问题标题】:Dbnull in VB.NET Stored procedure OUT ParameterVB.NET 存储过程 OUT 参数中的 Dbnull
【发布时间】:2014-10-14 07:20:08
【问题描述】:

我遇到的问题是存储过程没有在我的 VB.NET 端给我带来结果。当我在 Mysql 数据库中测试我的存储过程时,它运行良好。所以我假设那是 VB.NET 方面。我尝试了很多我在网上看到的方法,它们与我在下面放置的代码非常相似。所以告诉我我做错了什么?当我连接到我的 OUT PARAMETER 中无法收到任何答案的数据库时,我如何评估正在发生的事情。

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;

【问题讨论】:

  • 你试过这种方式吗 command.Parameters("@CODIGO_PAIS").Value.ToString();
  • 是的,我试过了。结果仍然给我带来了 DBnull。
  • 我假设您已经安装了 MySql 安装程序/连接器来访问 MySql DB ?
  • 是的,先生,我已连接到进行插入、更新、删除、选择。在我所有的应用程序和作品中都很完美。但回到我的问题是具体的存储过程。

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


【解决方案1】:

我通常做的是将参数放入一个变量中,这样更容易使用。

    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

【讨论】:

  • 这样试过,结果一样。 SP 没有返回结果。
【解决方案2】:

我得到了解决方案。 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 变量设置为 clean。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2011-07-29
      • 2011-09-02
      • 1970-01-01
      相关资源
      最近更新 更多