Vous êtes sur la page 1sur 33

SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: picyo en Martes 29 de Enero de 2013, 18:03

Ttulo: no consigo conectar con Excel mediante OleDb Publicado por: picyo en Martes 29 de Enero de 2013, 18:03 Pues no se porque me falla mi conexin, por mas que he probado todas las cadenas de conexin que he visto. Quiero simplemente conectar con una hoja de excel e implementarla (leerla) en mi dataGreedView1. En efecto. Algo bastante estpido que no funciona, a pesar de toda la informacin que hay en este foro y en todo Google, no encuentro pq falla...
Cdigo: [Seleccionar] using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

using System.Data.OleDb; using Excel = Microsoft.Office.Interop.Excel; namespace leer_excel

{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btLeerExcel_Click(object sender, EventArgs e) { try { OleDbConnection MyConnection; DataSet DtSet; OleDbDataAdapter MyCommand; MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;"); MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection); MyCommand.TableMappings.Add("Table", "TestTable"); DtSet = new DataSet(); MyCommand.Fill(DtSet); dataGridView1.DataSource = DtSet.Tables[0]; MyConnection.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } }

- cabe decir que si he hecho referencia en el explorador de solucuiones, en el apartado reference, a Microsoft.Office.Interop.Excel - Tambin he probado poner la ruta exacta de mi archivo excel, o sin poner la ruta (tal como esta ahora), para ver si lo coge de forma local...

Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: gabio2 en Mircoles 30 de Enero de 2013, 21:06 Ya te haba contestado por mensaje privado, sin embargo veo que ya puedo responder al tema.. te copio la respuesta de nuevo. Es un ejemplo de como lo hara..
Cdigo: C#

1. 2.

string ruta = "C:\\Movimientos.xls"; //Aqu supongo que est la ruta de mi archivo en excel. 3. System.Data.Odbc.OdbcConnection conexionExcel = 4. new System.Data.Odbc.OdbcConnection("Driver={Microsoft Excel Driver (*.xls)};Dbq=" + ruta + ";ReadOnly=0;"); 5. //En mi ejemplo yo tengo una "tabla" llamada movimientos.. pero en excel se especifica de esa manera 6. //con los corchetes y el signo de $ 7. System.Data.Odbc.OdbcDataAdapter adaptadorExcel = 8. new System.Data.Odbc.OdbcDataAdapter ("SELECT * FROM [Movimientos$] ", conexionExcel); 9. System.Data.DataTable dtExcel = 10. new System.Data.DataTable("Movimientos"); 11. adaptadorExcel.Fill(dtExcel); //Aqu lleno mi datatable, luego slo le asignas al DataSource del gridview ese datatable. 12. 13.

Saludos! Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Jueves 31 de Enero de 2013, 17:20 Hola! Gracias por la respuesta! Si, vi el mensaje privado. Bueno, ahora he realizado la prueba, y me pasa exactamente igual. Tengo la duda en el nombre del archivo, si has de poner la ruta entera, o el compilador se da cuenta que esta en la c:// (en mi caso e://). de todos modos, prob las dos. he de decir que me pasa lo mismo...y vi como "solucionarlo". Lo entrecomillo, pq no es una solucin... es algo que debera arreglar: El hecho es que si tengo mi hoja de excel abierta, si se carga el DataGridView con los datos dela hoja. vamos..como si estuvieramos en SQL y debieramos tener la conexin de SQL Server de Microsoft abierta, pues igual. Y digo yo... si he de abrir una cosa que ya est abierta... ( volviendo a mi caso con OleDB). Vamos, quiero abrir un archivo, o x archivos directamente desde la aplicacin de escritorio. Cmo puedo hacer que se conecte .NET sin tener la hoja abierta? Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: cachorro en Jueves 31 de Enero de 2013, 19:50 yo hice eso alguna vez..recuerdo que lo hice identico a la conexion como si estuviera habriendo una base acces, creo q era como te lo menciono gabio2... Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Sbado 2 de Febrero de 2013, 09:57

Pues consigo siempre lo mismo... me pasa con Odbc lo mismo que con OleDb. He de tener la hoja abierta. Es posible que me deje alguna cosa..? Abrs algn DataResource como si estuvisemos abriendo una base de datos de SQL? Lo nico que hice para OleDb fue aadir la referencia Microsof.Office.Interop.Excel, y despus en cabecera de programa el using Excel = Microsoft.Office.Interop.Excel; Lo tengo tal cual:
Cdigo: [Seleccionar] using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

using System.Data.OleDb; using System.Data.Odbc; using Excel = Microsoft.Office.Interop.Excel; namespace leer_excel { public partial class Form1 : Form { public Form1() { InitializeComponent();

} private void btLeerExcel_Click(object sender, EventArgs e) { try { /* OleDbConnection MyConnection; DataSet DtSet; OleDbDataAdapter MyCommand; MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; "+ "Data Source=LEER.xlsx;Extended Properties=Excel 8.0;"); //MessageBox.Show("entras"); MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection); //MyCommand.TableMappings.Add("Table", "TestTable"); DtSet = new DataSet(); MyCommand.Fill(DtSet); dataGridView1.DataSource = DtSet.Tables[0]; MyConnection.Close(); */ string ruta = "E:/Proyectos_carpeta_seguridad/Visual C#/Enciclopedia de MVC#/"+ "capitulo 15/excel/leer excel/leer excel/bin/Debug/LEER.xlsx"; System.Data.Odbc.OdbcConnection conexionExcel = new System.Data.Odbc.OdbcConnection("Driver={Microsoft Excel Driver (*.xls)};Dbq=" + ruta + ";ReadOnly=0;"); System.Data.Odbc.OdbcDataAdapter adaptadorExcel = new System.Data.Odbc.OdbcDataAdapter("SELECT * FROM [Hoja1$] ", conexionExcel); System.Data.DataTable dtExcel = new System.Data.DataTable("Hoja1"); //Aqu lleno mi datatable, luego slo le asignas al DataSource //del gridview ese datatable. adaptadorExcel.Fill(dtExcel); dataGridView1.DataSource = dtExcel;

} catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } }

Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Sbado 2 de Febrero de 2013, 10:22 Resuelto. El problema es la cadena de conexin. Estoy usando un archivo xslx, y debera haber usado un archivo tipo xsl (office 2007). Pues, si quiero abrir todo tipo de archivos, supongo que debera crear una macro estilo "#define x" #ifdefine x.... Antes de eso, tratar de encontrar la string connection para office 2010.
Cdigo: [Seleccionar] MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source=LEER.xls;Extended Properties=Excel 8.0;");

Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Sbado 2 de Febrero de 2013, 11:26 Bueno, ya soy capaz de hacer que se conecten ambos archivos. Por defecto coge el xslx, pero comentando la lnea que hace que abra esa conexin, abre el archivo xsl ( la otra conexin). Aqu dejo lo hecho, usando las directivas de preprocesador #define y #if

Cdigo: [Seleccionar] #define CadenaExcel2007 #define CadenaExcel2010 using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

using System.Data.OleDb; using System.Data.Odbc; using Excel = Microsoft.Office.Interop.Excel;

namespace leer_excel { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btLeerExcel_Click(object sender, EventArgs e) { try { OleDbConnection MyConnection;

DataSet DtSet; OleDbDataAdapter MyCommand; String sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;"+ "Data Source=E:/Proyectos_carpeta_seguridad/Visual C#/Enciclopedia de MVC#/capitulo 15/"+ "excel/leer excel/leer excel/bin/Debug/LEER.xlsx;"+ "Extended Properties=Excel 8.0;"; #if CadenaExcel2007 MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; "+ "Data Source=LEER.xls;Extended Properties=Excel 8.0;"); #endif #if CadenaExcel2010 MyConnection = new OleDbConnection(sConnectionString); #endif MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection); MyCommand.TableMappings.Add("Table", "TestTable"); DtSet = new DataSet(); MyCommand.Fill(DtSet); dataGridView1.DataSource = DtSet.Tables[0]; MyConnection.Close();

} catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } }

Estoy usando un libro para aprender VC#, que creo que est bastante bien (lo tengo original...), pero se empean demasiado en conexiones SQL Server, que es mas correcto crear una base de datos en SQL, pero... a veces solo tenemos simples hojas de Excel..y quera probar algo mas simple Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Domingo 10 de Febrero de 2013, 12:54 Bueno, como es normal, ahora que puedo leer los archivos, quiero que se guarden, pero no en modo de diseo, como veo por los foros, sino en modo ejecucin. hago algo as como:
Cdigo: [Seleccionar] private void btAbrirModificarExcel_Click(object sender, EventArgs e) {// openFileDialog1.FileName = ""; openFileDialog1.Filter="Archivos Excel(*.xls)|*.xls|Archivos Excel(*.xlsx)|*.xlsx";

if (openFileDialog1.ShowDialog() == DialogResult.OK) { string ruta = openFileDialog1.FileName; try { OleDbConnection MyConnection; DataSet DtSet; OleDbDataAdapter MyCommand; String sConnectionString2010 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ruta + ";Extended Properties=Excel 8.0;"; String sConnectionString2007 = "provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + ruta + ";Extended Properties=Excel 8.0;";

#if CadenaExcel2007 MyConnection = new OleDbConnection(sConnectionString2007); #endif #if CadenaExcel2010 MyConnection = new OleDbConnection(sConnectionString2010); #endif MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection); // MyCommand.TableMappings.Add("Table", "TestTable"); DtSet = new DataSet(); MyCommand.Fill(DtSet); dataGridView1.DataSource = DtSet.Tables[0]; /* OleDbCommand cmd = new OleDbCommand(); cmd.Connection = new OleDbConnection(sConnectionString2010); cmd.CommandText = "UPDATE [Hoja1$B2:B2] SET F1=" + data[0]; cmd.ExecuteNonQuery(); */ MyConnection.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }veris, la parte que est comentada por /* y */ es la que quiero adecuar a mi problema. Eso esta hecho de modo de diseo, donde data (cogido del foro), es un dato que mete el usuario quizs en un textBox... Pero bueno, yo lo que no se como hacer es ese margen de casillas en el UPDATE (Hoja1$B2:B2), que sea de modo tal como si el usuario aade 1 o 1000 filas, vamos, no entiendo que margen poner ahi y como sabe que lo quiero desde el datagridview1,

Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Mircoles 13 de Febrero de 2013, 18:00

como puedo hacer para que se guarden en la base de datos(la hoja de excel) los datos modificados??? Trato de hacerlo por activa y por pasiva, pero no lo consigo! Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: cachorro en Jueves 14 de Febrero de 2013, 04:07 buscalo en google hay muchos ejemplos...yo hice eso hace aos..en todo caso dejame te busco el codigo y te lo subo.... Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Jueves 14 de Febrero de 2013, 21:39 Que tal Cachorro? Si, he visto multitud de ellos, pero todos con una base comn: el programador es el que varia el cdigo "in situ", o sea programando, dando rdenes tal como "UPDATE from Tabla y el valor/es a aadir" Lo que quiero es que el propio usuario modificando el gridview del dataset, modifique la BBDD. Y he de reconocer que he hecho un poco folln de cdigo, porque para que se use un tipico botn de guardar, debo abrir conexin de nuevo y cerrar de nuevo en el evento botn. Bueno, espero eso que me dices, y de paso veo como se organiza ese caos. He visto por aqui que alguien definia una funcion solo de conexion y otra de cierre, y me ha gustado, me ha parecido limpio, pero luego otro decia que era poco efectiva... bueno, a ver si leo el post otra vez Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: cachorro en Jueves 14 de Febrero de 2013, 22:16

umm???? Hasta donde entiendo...lo que deseas es que los datos del excel se cargue en un datagridview y el usuario modifica dichos datos, al presionar un boton "guardar" se guarde esos datos en el excel que abrio..???? es eso lo que necesitas...??? Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Viernes 15 de Febrero de 2013, 06:03 Si. Basicamente es eso. El datagridview se carga bien,independientemente e la version de excel usada. Pero cuanfo guardo, abro el xls,o el xslx que habia modificado,y no se aprecian cambios. Algo pasa con mi update.. Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: cachorro en Viernes 15 de Febrero de 2013, 14:37 Ummmmm lo que recuerdo que hice fue cargar los datos al datagrid pero el usuario no midificaba nada, tenia una parte de codigo donde la mandaba a modificar(el usuario no se enteraba que se esta modificando) no se si eso ya lo pudiste hacer...??? en todo caso ya encontre ese proyecto de hace algunos aos el problema esq esta hecho con visual studio 2007 y lo trate de abrir con el 2010 pero no me dejo abrirlo..en todo caso te paso el archivo quiza lo puedas abrir..cualquier cosa me comentas...a revisa bien el codigo ya que no recuerdo si efectivamente es el proyecto q te envio..saludos Mandame un MP con tu direccion de mail para enviarte el archvio ya q esta mas grande de lo que me dejan subir aqui en el foro...

Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Sbado 16 de Febrero de 2013, 09:09 ok, te mando y despus comentamos por aqu. Grcias! Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Domingo 17 de Febrero de 2013, 13:47 Bueno he hecho unas modificaciones al programa, que me parece que est mas limpio, pero sigo sin poder grabar lo que el usuario modifica... He modificado una sentencia SQL, simplificndola, a ver si me daba problemas por eso..pero nada. os pongo la modificacin
Cdigo: [Seleccionar] using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

using System.Data.OleDb; using Excel = Microsoft.Office.Interop.Excel; namespace AbreModificaExcel { public partial class Form1 : Form { string sRutaArchivo = "";

public Form1() { InitializeComponent(); }

private string RutaArchivo(object sender, EventArgs e) { // mediante OpenFileDialog se crea la ruta que el usuario da, guardandola en string ruta. // es una funcion con devolucin, para que pueda ser usada de froma global. string ruta=""; if (openFileDialog1.ShowDialog() == DialogResult.OK) // si pulsamos Ok despus de seleccionar ruta { ruta = openFileDialog1.FileName; sRutaArchivo = ruta; } return ruta;

} private void AbrirConexion(object sender, EventArgs e, string ruta) { try { OleDbConnection MyConnection; DataSet DtSet; OleDbDataAdapter MyCommand; String sConnectionString2010 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ruta + ";Extended Properties=Excel 8.0;"; MyConnection = new OleDbConnection(sConnectionString2010); MyCommand = new OleDbDataAdapter("select * from [Hoja1$]", MyConnection); //MyCommand.TableMappings.Add("Table", "TestTable"); DtSet = new DataSet(); MyCommand.Fill(DtSet); dataGridView1.DataSource = DtSet.Tables[0]; //MyConnection.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void CerrarConexion(object sender, EventArgs e) { }

/// abrirHojaDeDatosToolStripMenuItem_Click

/// //// /// Accin dada al evento de pulsar el boton del men "abrir...".Se le pasa la ruta de archivo desde la funcion RutaArchivo /// <param name="sender"></param> /// <param name="e"></param> private void abrirHojaDeDatosToolStripMenuItem_Click(object sender, EventArgs e) { string ruta = ""; openFileDialog1.Filter = "Archivos Excel(*.xls)|*.xls|Archivos Excel(*.xlsx)|*.xlsx"; ruta=RutaArchivo(sender,e); AbrirConexion(sender, e,ruta); } private void guardarHojaActualToolStripMenuItem_Click(object sender, EventArgs e) { OleDbConnection MyConnection; DataSet DtSet; DtSet = new DataSet(); //OleDbDataAdapter MyCommand; String sConnectionString2010 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + sRutaArchivo + ";Extended Properties=Excel 8.0;"; MyConnection = new OleDbConnection(sConnectionString2010); OleDbCommand cmd = new OleDbCommand(); cmd.CommandText = "UPDATE [Hoja1$] "; dataGridView1.DataSource = DtSet; //cmd.ExecuteNonQuery(); MyConnection.Close(); } } }

Ttulo: Re:no consigo conectar con Excel mediante OleDb

Publicado por: DiabloRojo en Mircoles 20 de Febrero de 2013, 03:34 Qu tal Picyo? Revisa este link a ver si te resulta de utilidad http://msdn.microsoft.com/enus/library/system.data.common.dataadapter.update.aspx (http://msdn.microsoft.com/enus/library/system.data.common.dataadapter.update.aspx) Saludos. Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Mircoles 6 de Marzo de 2013, 13:30 mal. no consigo que salga en absoluto. cada vez me parece menos fiable c# los ejemplos de microsoft tienden a ser demsiado grandes, para reflejar una duda te aparecen diez mas...poco productivos. no se quizas como hacer mejor la pregunta Ttulo: Re:no consigo conectar con Excel mediante OleDb Publicado por: picyo en Mircoles 6 de Marzo de 2013, 21:27

En fin, muerto el perro muerta la rabia. Me quede sin PC


SMF 2.0.4 | SMF 2011, Simple Machines

FoxPress Enero 2002 Acceso a datos .DBF desde ADO.NET mediante C# y OLEDB
http://www.fpress.com/

Por Abel Sorzano

nave.zip

ADO .NET es la ltima versin de la tecnologa de acceso a datos de Microsoft. ADO .NET es un conjunto de clases, insertadas en el .NET Framework, que permiten que se interactue con fuentes de datos.

ADO .NET puede usar:

el proveedor SQL Server el proveedor OLEDB el proveedor ODBC

Aqu nos fijaremos en los proveedores OLEDB y ODBC.

El Proveedor SQL Server es la forma ms aconsejable de conectarse a una Base de Datos SQL Server (version 7.0 o superior). Usa un protocolo propietario para conectarse a la Base de Datos y se basa en el namespace System.Data.Sqlclient.

El Proveedor OLEDB se usa con Bases de Datos que soportan interfaces. ADO.NET entre los que se encuentran SQLOLEDB (Microsoft OLE DB Provider for SQL Server) ,MSDAORA ( Microsoft OLE DB Provider for Oracle),Microsoft.Jet.OLEDB.4.0 (OLE DB Provider for Microsoft Jet) y VFPOLEDB (Provider para Visual FoxPro), entre otros. Se basan en el namespace System.Data.Oledb.

El Proveedor ODBC se usan con Bases de Datos que soportan accesos a datos mediante ODBC. Este proveedor no viene incluido en la Beta 2 inglesa del .NET Framework y te lo tienes que bajar de http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/001/668/msdncompositedoc.x La instalacin te incorpora el fichero System.Data.ODBC.DLL que te da acceso al namespace System.Data.ODBC

Siempre que se pueda es mejor usar el driver OLE DB que el ODBC debido a que es ms rpido y adems soporta un mayor nmero de instruccines. Por ejemplo segn se indica en el "Supported ODBC grammar", el driver ODBC soporta 10 de los SETs de VFP mientras que el driver OLE DB de VFP parece que es una versin light de la runtime pues soporta 333 (s, los he contado) comandos y funciones que son nativas de VFP, y entre esas incluye el DO <programa>, SET PROCEDURE TO, transacciones, nativo Fox SQL, crear tablas son libres o parte una Base de Datos (no he visto si se puede CREATE CURSOR o no). No soporta el DEFINE CLASS o el SET CLASSLIB TO. Viendo este poder, se comprende que slo los que tienen VFP tengan el driver.

La forma ms natura de conectarse al Proveedor OLEDB es mediante el uso de OleDbConnection. OleDbConnection realiza una simple conexin a la Base de Datos, y segn las caractersticas de la Base de Datos te da el poder de manipularla. Para cerrar la conexin se debe de usar el mtodo close() del objeto.

Una vez conectados en .NET, hay 3 formas de acceder a las datos de una Base de Datos: DataSet DataReader

ExecuteNonquery

El DataSet, es parecido a los recordset, y suele ser el resultado de una consulta SQL. Con el DataSet se toman un conjunto de datos y a continuacin se desconecta inmediatamente de la Base de Datos para liberar recursos. Esto signigica que si haces cambios en el DataSet tienes inmediantemente que grabar esos cambios en la Base de Datos. En esto casos se debe complementar el DataSet con el DataAdapter. El segundo mtodo es usar un DataReader, es un recordset con un cursor forward-only. Permanete conectado a la Base de Datos y se debe de usar en conjuncin con un OleDbCommand.

El tercer mtodo se llama ExecuteNonQuery. Se usa para ejecutar una instruccin SQL que no devuelve nada, algo similar al "db.execute(sql)" de los clsicos ASP. Se debera de usar un OleDbCommand cuando se use un DataReader.

Un ejemplo de cada uno se muestra a continuacin. En primer lugar tienes que indicar la cadena de conexin:

Acceso a Datos mediante DataSet

///////////////////////////////////////////////// // Ejemplo #1: Acceso a datos mediante DataSet // // Fichero nuevo2.cs //

///////////////////////////////////////////////// using System;

using System.Data;

class TestClass { static void Main(string[] args) { OleDbConnection con=new OleDbConnection("Provider=VFPOLEDB.1 ;Data Source=E:\\revista\\OLE2\\libreria.dbc");

DataSet ds = new DataSet(); string sql = "select * from Libros"; OleDbDataAdapter da = new OleDbDataAdapter(sql,con); da.Fill(ds,"miTabla");

// Imprime las columnas foreach(DataRow dr in ds.Tables[0].Rows) { Console.WriteLine();

//Muestra el contenido de la primera columna Console.WriteLine(dr["Autor"]);

//Muestra el contenido de la segunda columna Console.WriteLine(dr["BookTitle"]);

} con.Close(); con.Dispose();

Console.ReadLine(); } }

En este cdigo fijate en: 1.- la cadena de conexin a la Base de Datos Fox tiene un path fijo que debers cambiar. 2.- Los directorios del path de acceso a la base de datos se separan con dos // esto es debido a que un solo / es un codigo de escape que es interpretado por C# y por eso hay que poner dos. 3.- La Base de Datos se llama librera.dbc y tiene una sola tabla con 2 campos carcter llamados Autor y BookTitle y un campo numerico llamado Bookid 4.- Este cdigo tienes que compilarlo ejecutando desde una ventana DOS el siguiente cdigo: csc /out:nuevo2.exe /R:System.Data.DLL;System.Data.Odbc.Dll;System.DLL nuevo2.cs

Acceso a Datos mediante DataReader

//////////////////////////////////////////////////// // Ejemplo #1: Acceso a datos mediante DataReader // // Fichero nuevo1.cs // //////////////////////////////////////////////////// using System; using System.Data.OleDb; class TestClass { static void Main(string[] args) { OleDbConnection con=new OleDbConnection("Provider=VFPOLEDB.1 ;Data Source=E:\\revista\\OLE2\\libreria.dbc"); con.Open(); OleDbCommand cmd=con.CreateCommand(); cmd.CommandText="select * from Libros"; OleDbDataReader Reader=cmd.ExecuteReader(); // Imprime las columnas while (Reader.Read()) { Console.WriteLine("\t{0}\t{1}", Reader.GetInt32(0), Reader.GetString(1)); } Reader.Close(); con.Close(); con.Dispose(); Console.ReadLine(); } }

En este cdigo fjate: 1.- Los accesos a la Base de Datos tambin tienes que cambiarlos y ponerles los // como en el ejemplo anterior. 2.- Se usa un OledbCommand

3.- En este caso nos traemos la columna primera y la segunda de la Base de Datos. Como la primera es numerica tenemos que leerla con el GetInt32

Acceso a Datos mediante ExecuteNonQuery


ExeCuteNonQuery no se trae los registros sino que te informa del nmero de registros afectados por la ultima sentencia SQL. Sera algo parecido al _Tally.
///////////////////////////////////////////////////////// // Ejemplo #1: Acceso a datos mediante ExecutenonQuery // // Fichero nuevo4.cs // ///////////////////////////////////////////////////////// using System; using System.Data; using System.Data.OleDb; class TestClass { static void Main(string[] args) { OleDbConnection con=new OleDbConnection("Provider=VFPOLEDB.1 ;Data Source=E:\\revista\\OLE2\\libreria.dbc"); string sql = "select * from Libros"; OleDbCommand cmd = new OleDbCommand(sql,con); cmd.Connection.Open(); int numRowsAffected = cmd.ExecuteNonQuery(); // devuelve 0 si ninguno es afectado { Console.WriteLine(numRowsAffected); } con.Close(); con.Dispose(); cmd.Connection.Close(); Console.ReadLine(); } }

En este cdigo fjate: 1.- Que tambin se usa el OleDbcommand. 2.- En este caso, al haber hecho una Select nos devuelve el total de registros de esa tabla.

Acceso a datos mediante ODBC


En este caso no se usa Ole Db pero lo inclyo por el inters que se pueda presentar para acceder a ese tipo de acceso a datos.

using System.Data.Odbc; using System.Data ; using System; namespace consum { class Class1 { static void Main(string[] args) { try { string tConnectionString = "DSN=miFox;UID=;PWD=;SourceDB=E:\\revista\\ole2\\libreria.dbc;SourceType=DBC;"; OdbcConnection tConnection = new OdbcConnection(tConnectionString); string tSQLString = "SELECT * FROM Libros"; OdbcCommand tOdbcCommand = new OdbcCommand(tSQLString, tConnection); tConnection.Open(); OdbcDataReader tOdbcDataReader = tOdbcCommand.ExecuteReader(CommandBehavior.SequentialAccess); while (tOdbcDataReader.Read()) { Console.WriteLine(tOdbcDataReader.GetString(0) + " " + tOdbcDataReader.GetString(1)); } tConnection.Close(); }

catch (OdbcException pOdbcException) { Console.WriteLine(pOdbcException.StackTrace); for (int i=0; i < pOdbcException.Errors.Count; i++){ Console.WriteLine("Index #" + i); Console.WriteLine("Message: " + pOdbcException.Errors[i].Message); Console.WriteLine("Native: " + pOdbcException.Errors[i].NativeError.ToString()); Console.WriteLine("Source: " + pOdbcException.Errors[i].Source); Console.WriteLine("SQL: " + pOdbcException.Errors[i].SQLState); } } System.Threading.Thread.Sleep(15000); } } }

En este cdigo fjate: 1.- La cadena de conexin es distinta (tiene otro formato) 2.- Hemos tenido que cargar el namespace de ODBC 3.- Se ha aadido un cdigo, que no sera estricatamente necesario, para controlar los errores y un sleep (dormir) de 15000 segundos.

Un mantenimiento navegacional
Una vez mostrado la forma de acceder a los datos. Adjunto un pequeo mantenimiento en C# basado en ADO.NET mediante el DataSet y datos Fox. No voy a trascribir todo el cdigo, slo la pantalla resultante y el cdigo de Acceso a los Datos

La sustancia del cdigo es el siguiente:

public void GetConnected() { //OleDbConnection myConn; try{

//Hace un OleDbConnection string strCon="Provider=VFPOLEDB.1 ;Data Source=E:\\revista\\OLE\\libreria.dbc" ;

OleDbConnection myConn

=new OleDbConnection(strCon) ;

string strCom="SELECT * FROM libros" ; //construye un DataSet

myDataSet = new DataSet() ;

myConn.Open() ; //Usa el OleDbDataAdapter para ejecutar la consulta OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom,myConn) ; //Llena el Data Set con la tabla Libros myCommand.Fill(myDataSet,"bookstock") ; //Cierra el OleDbConnection myConn.Close() ; } catch(Exception e) { MessageBox.Show("Error al conectarse! "+e.ToString(), "Error"); }

El resto es interesante desde el punto de vista de C# y lo tienes en los fuentes.

Como lo hacemos por cdigo, hay que escribir todo, como cada uno de los controles:

primero.Location = new System.Drawing.Point(24, 312); primero.ForeColor = System.Drawing.Color.White; primero.Size = new System.Drawing.Size(40, 24); primero.TabIndex = 5; primero.Font = new System.Drawing.Font("Microsoft Sans Serif", 8f, System.Drawing.FontStyle.Bold); primero.Text = "|<<"; primero.Click += new System.EventHandler(GoFirst);

Y tambin los mtodos de los controles:

///

Para navegar al BindingManagerBase, incrementa la Posicin de la propiedad.

private void MoveNext() { if (myBind.Position == myBind.Count -1) MessageBox.Show("Fin de los registros");

else myBind.Position += 1; }

Este cdigo lo puedes compilar desde una ventana DOS con la instruccin:

csc /t:winexe /out:Visor.exe /R:System.Data.DLL;System.Windows.Forms.dll;System.DLL Visor.cs

FoxPress Enero de 2002 2002 FoxPress. All rights reserve

Vous aimerez peut-être aussi