Veremos un poco lo que pasa:
He revisado tu codigo y podria quedar asi
Código ASP:
Ver originalDataSets.Factura ds = (DataSets.Factura)Cache["dataset"];
var conex = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["FacturaConnectionString"].ConnectionString);
conex.Open();
SqlDataReader reader;
using (SqlCommand coman = new SqlCommand("SELECT *FROM ARTICULOS WHERE CODIGO = '" + TextBox1.Text + "'", conex))
{
coman.ExecuteNonQuery();
reader = coman.ExecuteReader();
}
reader.Read();
InsertaFactura((string)reader["CODIGO"], (string)reader["DETALL"], 2);
conex.Close();
Con la variable global siempre tienes que abrir la conexion pero te evitas estar declarandola en cada procedimiento.
Con el databind tambien debes hacerlo, pero si lo sacas a un procedimiento parametrizado te evitas estas reescribiendolo.
En cuanto a la factura a que te refieres con virtual y optimizada?