Question

i have some code in C# that need to translate to vb.net (.NET Framework 3.5)

_dbObj.GetRowData("select * from mytable where myfield = @myfield", param, (IDataReader reader) =>
    {
        while (reader.Read())
        {
            foo.p1 = reader.GetString(reader.GetOrdinal("field1"));
            foo.p2 = (int)reader.GetInt32(reader.GetOrdinal("field2"));
            foo.p3 = (int)reader.GetInt32(reader.GetOrdinal("field3"));
        }
    });

The GetRowData method:

using (SqlConnection conn = new SqlConnection(connstr))
using (SqlCommand cmd = new SqlCommand(commandText, conn))
{
    conn.Open();

    if (param != null)
        cmd.Parameters.AddRange(param);

    using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
    {
        processor(reader);
    }
}

The "problem" is to translate the code to VB.NET. I think this snippet its ok:

Using conn As New SqlConnection(connstr)
    Using cmd As New SqlCommand(commandText, conn)
        conn.Open()
        If param IsNot Nothing Then
            cmd.Parameters.AddRange(param)
        End If

        Using reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
            processor(reader)
        End Using
    End Using
End Using

but when i need to use it i get an compiler syntax error

    _dbObj.GetRowData("select * from mytable where myfield = @myfield", param, Function (reader As IDataReader ???????)
While ??
Was it helpful?

Solution

You need a Sub instead of a Function:

_dbObj.GetRowData("select * from mytable where myfield = @myfield", param, 
      Sub(reader As IDataReader) 
          While reader.Read()
              foo.p1 = reader.GetString(reader.GetOrdinal("field1"))
              foo.p2 = reader.GetInt32(reader.GetOrdinal("field2"))
              foo.p3 = reader.GetInt32(reader.GetOrdinal("field3"))
          End While
      End Sub)

OTHER TIPS

Your GetRowData snippet looks ok to me. I assume processor is the name of the Action(Of IDataReader) parameter.

The return value of Action<T> is void, so you need to declare your lambda function as a Sub, not a Function.

_dbObj.GetRowData("select * from mytable where myfield = @myfield", param, Sub(reader As IDataReader)
        While (reader.Read())
            foo.p1 = reader.GetString(reader.GetOrdinal("field1"))
            foo.p2 = reader.GetInt32(reader.GetOrdinal("field2"))
            foo.p3 = reader.GetInt32(reader.GetOrdinal("field3"))
        End While
    End Sub)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top