Podrías hacer una rutina en la que te devuelva todos lo parámetros de un procedimiento almacenado, y luego asignar sus valores dinámicamente (tendrías que respetar el orden en el que ingresan los parámetros), algo con el que puedes pasar varios parámetros a un procedimiento en C# es la palabra clave "params" (no sé si en vb.net se pueda)
Te envío parte del código que tengo, para darte alguna idea:
Código:
protected System.Data.IDbCommand Comando(string ProcedimientoAlmacenado)
{
System.Data.SqlClient.SqlCommand Com;
if(ColComandos.Contains(ProcedimientoAlmacenado))
Com= (System.Data.SqlClient.SqlCommand) ColComandos[ProcedimientoAlmacenado];
else
{
System.Data.SqlClient.SqlConnection Con2=new System.Data.SqlClient.SqlConnection(this.CadenaConexion);
Con2.Open();
Com=new System.Data.SqlClient.SqlCommand(ProcedimientoAlmacenado,Con2);
Com.CommandType=System.Data.CommandType.StoredProcedure;
System.Data.SqlClient.SqlCommandBuilder.DeriveParameters(Com);
Con2.Close();
Con2.Dispose();
ColComandos.Add(ProcedimientoAlmacenado,Com);
}
Com.Connection=(System.Data.SqlClient.SqlConnection) this.Conexion;
Com.Transaction=(System.Data.SqlClient.SqlTransaction) this.mTransaccion;
return (System.Data.IDbCommand) Com;
}
protected void CargarParametros(System.Data.IDbCommand Com,System.Object[] Args)
{
int Limite=Com.Parameters.Count;
for(int i=1;i<Com.Parameters.Count;i++)
{
System.Data.SqlClient.SqlParameter P=(System.Data.SqlClient.SqlParameter) Com.Parameters[i];
if(i<=Args.Length)
P.Value=Args[i-1];
else
P.Value=null;
}
}
También puedes utilizar la clase SqlHelperParameterCache que forma parte de Data Access Application Block, tiene una funcionalidad parecida al código que te envié antes, evidentemente varias mejoras.
http://msdn.microsoft.com/library/de.../html/daab.asp
Saludos