c# ms-access ado.net

c# - Llamar a una consulta de acceso predefinida utilizando ODBC en ADO.NET



ms-access (1)

Estoy usando c # y OdbcConnection para conectarme a una base de datos de Access. Dentro de la base de datos hay una consulta predefinida que quiero ejecutar (como un proceso almacenado en el servidor Sql). Esto solía ser muy fácil con el viejo ADO basado en COM pero parece que no funciona en ADO.net

OdbcConnection conn = AccessConnect.Connect(); var cmd = conn.CreateCommand(); cmd.CommandText = @"MyAccessQuery;"; cmd.CommandType = CommandType.StoredProcedure; var da = new OdbcDataAdapter(cmd); var ds = new DataSet(); da.Fill(ds);

¿Hay una forma de evitarlo o voy a tener que duplicar mi consulta de acceso en el código de C #?


Las interfaces de Acceso ODBC (y OLEDB) exponen consultas guardadas en Access como Vistas o Procedimientos almacenados. Cómo están expuestos determina la forma en que pueden ser utilizados por una aplicación externa.

Las consultas SELECT guardadas en Access que no usan PARAMETERS están expuestas como Vistas, por lo que se pueden usar como una tabla, por ejemplo

string sql = "SELECT * FROM mySavedSelectQuery WHERE id <= 3"; using (var cmd = new OdbcCommand(sql, con)) { cmd.CommandType = System.Data.CommandType.Text; using (var da = new OdbcDataAdapter(cmd)) { var dt = new System.Data.DataTable(); da.Fill(dt); Console.WriteLine("DataTable contains {0} row(s)", dt.Rows.Count); } }

Otros tipos de consultas guardadas en Access se exponen como Procedimientos almacenados, por lo que deben invocarse utilizando la sintaxis ODBC {CALL ...} , así:

string sql = "{CALL mySavedParameterQuery (?)}"; using (var cmd = new OdbcCommand(sql, con)) { cmd.CommandType = System.Data.CommandType.StoredProcedure; // set parameter values (if any) in the order that they appear // in the PARAMETERS list of the saved query cmd.Parameters.Add("?", OdbcType.Int).Value = 3; using (var da = new OdbcDataAdapter(cmd)) { var dt = new System.Data.DataTable(); da.Fill(dt); Console.WriteLine("DataTable contains {0} row(s)", dt.Rows.Count); } }

Tenga en cuenta que en ambos casos, como con cualquier consulta en una base de datos de Access desde una aplicación externa (C #, VB.NET, Java, etc.), existen algunas restricciones. Por ejemplo, algunas funciones integradas de Access pueden no estar disponibles, y las consultas de Access guardadas que llaman a funciones definidas por el usuario (escritas en VBA) no funcionarán desde una conexión directa ODBC o OLEDB.