SQLCONNECTION CLASE

16
SQLCONNECTION CLASE Sintaxis : "Declaración de SqlConnection público de clase NotInheritable Hereda DbConnection Implementa ICloneable 'Uso Ejemplo As SqlConnection SqlConnection public final class extiende DbConnection implementa ICloneable Un objeto SqlConnection representa una sesión única de datos de SQL Server de origen. Con un sistema de base de datos cliente / servidor, que es equivalente a una conexión de red con el servidor. SqlConnection se utiliza junto con SqlDataAdapter y SqlCommand para aumentar el rendimiento cuando se conecta a una base de datos de Microsoft SQL Server. Para todos los productos de servidor de terceros SQL, y otros OLE DB-los orígenes de datos, el uso OleDbConnection . Cuando se crea una instancia de SqlConnection, todas las propiedades se establecen en sus valores iniciales. Para obtener una lista de estos valores, vea el constructor SqlConnection. Si la conexión SqlConnection está fuera de alcance, que permanece abierta. Por lo tanto, es preciso cerrar explícitamente la conexión llamando a Close o Dispose. Close y Dispose son funcionalmente equivalentes. Si el valor de la agrupación de conexiones Agrupación se establece en true o yes, la conexión subyacente se devuelve al grupo de conexiones. Por otro lado, si la agrupación se establece en false o no, la conexión subyacente al servidor se cierra realmente. Para garantizar que las conexiones están siempre cerradas, abra la conexión dentro de un bloque usando, como se muestra en el siguiente fragmento de código. Si lo hace, asegura que

Transcript of SQLCONNECTION CLASE

Page 1: SQLCONNECTION CLASE

SQLCONNECTION CLASE

Sintaxis: "Declaración de

SqlConnection público de clase NotInheritable Hereda DbConnection Implementa ICloneable

'Uso

Ejemplo As SqlConnection

SqlConnection public final class extiende DbConnection implementa ICloneable

Un objeto SqlConnection representa una sesión única de datos de SQL Server de origen. Con un sistema de base de datos cliente / servidor, que es equivalente a una conexión de red con el servidor. SqlConnection se utiliza junto con SqlDataAdapter y SqlCommand para aumentar el rendimiento cuando se conecta a una base de datos de Microsoft SQL Server. Para todos los productos de servidor de terceros SQL, y otros OLE DB-los orígenes de datos, el uso OleDbConnection .

Cuando se crea una instancia de SqlConnection, todas las propiedades se establecen en sus valores iniciales. Para obtener una lista de estos valores, vea el constructor SqlConnection.

Si la conexión SqlConnection está fuera de alcance, que permanece abierta. Por lo tanto, es preciso cerrar explícitamente la conexión llamando a Close o Dispose. Close y Dispose son funcionalmente equivalentes. Si el valor de la agrupación de conexiones Agrupación se establece en true o yes, la conexión subyacente se devuelve al grupo de conexiones. Por otro lado, si la agrupación se establece en false o no, la conexión subyacente al servidor se cierra realmente.

Para garantizar que las conexiones están siempre cerradas, abra la conexión dentro de un bloque usando, como se muestra en el siguiente fragmento de código. Si lo hace, asegura que la conexión se cierra automáticamente cuando el código sale del bloque.

Uso de una conexión como New SqlConnection (connectionString) Connection.Open () "¿Trabaja usted aquí; conexión cerrada en la línea siguiente. Usando final usando (la conexión SqlConnection = new SqlConnection (connectionString)) { Connection.Open (); / / ¿Trabaja usted aquí; conexión cerrada en la línea siguiente.

Si una SqlException es generado por el método de la ejecución de un SqlCommand, el SqlConnection permanece abierta cuando el nivel de gravedad es 19 o menos. Cuando el nivel de gravedad es 20 o más normalmente, el servidor cierra la conexión SqlConnection. Sin embargo, el usuario puede volver a abrir la conexión y continuar.

Page 2: SQLCONNECTION CLASE

Una aplicación que crea una instancia del objeto SqlConnection puede requerir que todos los llamadores directos e indirectos tengan permisos suficientes en el código mediante el establecimiento de las demandas de seguridad declarativas o imperativas. SqlConnection realiza solicitudes de seguridad utilizando el SqlClientPermission objeto. Los usuarios pueden comprobar que el código tiene los permisos adecuados mediante la SqlClientPermissionAttribute objeto. Los usuarios y administradores también pueden utilizar el código de acceso de herramientas de seguridad (Caspol.exe) para modificar la política de seguridad en la máquina, el usuario, y de la empresa. Para más información, vea Seguridad en. NET Framework . Para ver un ejemplo que muestra cómo utilizar las demandas de seguridad, vea Seguridad de acceso del código y ADO.NET

SQLDATAADAPTER (CLASE)

Representa un conjunto de comandos de datos y una conexión de base de datos que se utilizan para rellenar un DataSet y actualizar una base de datos de SQL Server. Esta clase no se puede heredar.

'Declaración

Public NotInheritable Class SqlDataAdapterInherits DbDataAdapterImplements IDbDataAdapter, IDataAdapter, ICloneable

'Uso

Dim instance As SqlDataAdapter

public final class SqlDataAdapter extends DbDataAdapter implements IDbDataAdapter, IDataAdapter,

ICloneable

SqlDataAdapter, se utiliza como un puente entre DataSet y SQL Server para recuperar y guardar datos. SqlDataAdapter proporciona este puente mediante la asignación de Fill, que cambia los datos en DataSet para que coincidan con los datos del origen de datos; y Update, que cambia los datos en el origen de datos para que coincidan con los datos en DataSet utilizando las instrucciones de Transact-SQL en el origen de datos adecuado.

Cuando SqlDataAdapter rellene un objeto DataSet, creará las tablas y columnas necesarias para los datos devueltos si todavía no existen. Sin embargo, la información de clave principal no se incluirá en el esquema creado implícitamente a menos que la propiedad MissingSchemaAction se establezca en AddWithKey. También se puede hacer que SqlDataAdapter cree el esquema de DataSet, incluida la información de clave principal, antes de rellenarlo de datos mediante el método FillSchema. Para obtener más información, vea Agregar restricciones existentes a DataSet.

SqlDataAdapter se utiliza junto con SqlConnection y SqlCommand para aumentar el rendimiento en la conexión con una base de datos de SQL Server.

Page 3: SQLCONNECTION CLASE

SqlDataAdapter contiene también las propiedades SelectCommand, InsertCommand, DeleteCommand, UpdateCommand y TableMappings para facilitar la carga y la actualización de los datos.

Cuando se crea una instancia de SqlDataAdapter, las propiedades de lectura y escritura se establecen en sus valores iniciales. Para obtener una lista de esos valores, vea el constructor SqlDataAdapter.

En el ejemplo siguiente se utilizan SqlCommand, SqlDataAdapter y SqlConnection para seleccionar registros de una base de datos, y se rellena DataSet con las filas seleccionadas. A continuación, se devuelve el DataSet rellenado. Para ello, al método se le pasan un DataSet inicializado, una cadena de conexión y una cadena de consulta que es una instrucción SELECT de Transact-SQL.

Public Function SelectRows( _ ByVal dataSet As DataSet, ByVal connectionString As String, _ ByVal queryString As String) As DataSet

Using connection As New SqlConnection(connectionString) Dim adapter As New SqlDataAdapter() adapter.SelectCommand = New SqlCommand( _ queryString, connection) adapter.Fill(dataSet) Return dataSet End UsingEnd Function

DATASET (CLASE)

Representa una caché de memoria interna de datos.

'Declaración

<SerializableAttribute> _Public Class DataSet

Inherits MarshalByValueComponentImplements IListSource, IXmlSerializable,

ISupportInitializeNotification, ISupportInitialize, _ISerializable

'Uso

Dim instance As DataSet/** @attribute SerializableAttribute() */ public class DataSet extends MarshalByValueComponent implements IListSource, IXmlSerializable,

ISupportInitializeNotification, ISupportInitialize, ISerializable

DataSet, que es una caché de memoria interna de datos recuperados de un origen de datos, representa un componente fundamental de la arquitectura de ADO.NET. DataSet está

Page 4: SQLCONNECTION CLASE

compuesto por una colección de objetos DataTable que se pueden relacionar entre ellos mediante objetos DataRelation. También se puede imponer la integridad de los datos de DataSet mediante los objetos UniqueConstraint y ForeignKeyConstraint. Para obtener información más detallada sobre el trabajo con objetos DataSet, vea Utilizar DataSets en ADO.NET.

Los objetos DataTable contienen los datos, mientras que DataRelationCollection permite desplazarse por la jerarquía de la tabla. Las tablas están incluidas en un DataTableCollection al que se obtiene acceso a través de la propiedad Tables. Al obtener acceso a los objetos DataTable, hay que tener en cuenta que éstos distinguen entre mayúsculas y minúsculas condicionalmente. Por ejemplo, si un objeto DataTable se denomina "mydatatable" y otro "Mydatatable", la cadena que se utilice para buscar una de las tablas se considerará que distingue entre mayúsculas y minúsculas. Sin embargo, si existe "mydatatable" pero no existe "Mydatatable", se considerará que la cadena de búsqueda no distingue entre mayúsculas y minúsculas. Para obtener más información sobre el trabajo con los objetos DataTable, vea Crear DataTable.

Un DataSet puede leer y escribir datos y esquemas como documentos XML. Los datos y esquemas pueden transportarse, a continuación, a través de HTTP y cualquier aplicación puede utilizarlos en cualquier plataforma que sea compatible con XML. Los esquemas se pueden guardar como esquemas XML mediante el método WriteXmlSchema, y tanto los esquemas como los datos se pueden guardar mediante el método WriteXml. Hay que utilizar el método ReadXml para leer un documento XML que incluya esquema y datos.

En una implementación normal de varios niveles, los pasos de creación y actualización de un DataSet y, a su vez, de actualización de los datos originales, son los siguientes:

1. Construir y llenar cada DataTable de un DataSet con datos desde un origen de datos mediante DataAdapter.

2. Cambiar los datos de los objetos DataTable individuales mediante la adición, actualización o eliminación de objetos DataRow.

3. Llamar al método GetChanges para crear un segundo DataSet que sólo incorpore los cambios realizados en los datos.

4. Llame al método Update de DataAdapter, pasando el segundo DataSet como argumento.

5. Se invoca el método Merge para combinar los cambios del segundo DataSet con el primero.

6. Invocar al método AcceptChanges de DataSet. O bien, invocar al método RejectChanges para cancelar los cambios.

7. El ejemplo siguiente se compone de varios métodos que, combinados, crean y rellenan un objeto DataSet a partir de la base de datos Northwind.

8. Option Explicit On9. Option Strict On10.11. Imports System.Data12. Imports system.Data.SqlClient13.14. Public Class NorthwindDataSet

Page 5: SQLCONNECTION CLASE

15.16. Public Shared Sub Main()17. Dim connectionString As String = _18. GetConnectionString()19. ConnectToData(connectionString)20. End Sub21.22. Private Shared Sub ConnectToData( _23. ByVal connectionString As String)24.25. ' Create a SqlConnection to the Northwind database.26. Using connection As SqlConnection = New SqlConnection( _27. connectionString)28.29. ' Create a SqlDataAdapter for the Suppliers table.30. Dim suppliersAdapter As SqlDataAdapter = _31. New SqlDataAdapter()32.33. ' A table mapping names the DataTable.34. suppliersAdapter.TableMappings.Add("Table",

"Suppliers")35.36. ' Open the connection.37. connection.Open()38. Console.WriteLine("The SqlConnection is open.")39.40. ' Create a SqlCommand to retrieve Suppliers data.41. Dim suppliersCommand As SqlCommand = New SqlCommand( _42. "SELECT SupplierID, CompanyName FROM

dbo.Suppliers;", _43. connection)44. suppliersCommand.CommandType = CommandType.Text45.46. ' Set the SqlDataAdapter's SelectCommand.47. suppliersAdapter.SelectCommand = suppliersCommand48.49. ' Fill the DataSet.50. Dim dataSet As DataSet = New DataSet("Suppliers")51. suppliersAdapter.Fill(dataSet)52.53. ' Create a second SqlDataAdapter and SqlCommand to get54. ' the Products table, a child table of Suppliers. 55. Dim productsAdapter As SqlDataAdapter = _56. New SqlDataAdapter()57. productsAdapter.TableMappings.Add("Table", "Products")58.59. Dim productsCommand As SqlCommand = New SqlCommand( _60. "SELECT ProductID, SupplierID FROM dbo.Products;",

_61. connection)62. productsAdapter.SelectCommand = productsCommand63.64. ' Fill the DataSet.65. productsAdapter.Fill(dataSet)66.67. ' Close the connection.68. connection.Close()

Page 6: SQLCONNECTION CLASE

69. Console.WriteLine("The SqlConnection is closed.")70.71. ' Create a DataRelation to link the two tables72. ' based on the SupplierID.73. Dim parentColumn As DataColumn = _74. dataSet.Tables("Suppliers").Columns("SupplierID")75. Dim childColumn As DataColumn = _76. dataSet.Tables("Products").Columns("SupplierID")77. Dim relation As DataRelation = New _78. System.Data.DataRelation("SuppliersProducts", _79. parentColumn, childColumn)80. dataSet.Relations.Add(relation)81.82. Console.WriteLine( _83. "The {0} DataRelation has been created.", _84. relation.RelationName)85. End Using86.87. End Sub88.89. Private Shared Function GetConnectionString() As String90. ' To avoid storing the connection string in your code, 91. ' you can retrieve it from a configuration file.92. Return "Data Source=(local);Initial Catalog=Northwind;" _93. & "Integrated Security=SSPI;"94. End Function95. End Class96.

SQLCONNECTION.CONNECTIONSTRING (PROPIEDAD)

'Declaración

Public Overrides Property ConnectionString As String'Uso

Dim instance As SqlConnectionDim value As String

value = instance.ConnectionString

instance.ConnectionString = value/** @property */public String get_ConnectionString ()

/** @property */public void set_ConnectionString (String value)

Valor de propiedadCadena de conexión que incluye el nombre de la base de datos de origen y otros parámetros necesarios para establecer la conexión inicial. El valor predeterminado es una cadena vacía.

Excepciones

Page 7: SQLCONNECTION CLASE

Tipo de excepción Condición

ArgumentException Se ha suministrado un argumento de cadena de conexión no válido o no se ha suministrado un argumento de cadena de conexión requerido.

Comentarios

ConnectionString es similar a una cadena de conexión de OLE DB, aunque no idéntico. A diferencia de OLE DB y ADO, la cadena de conexión que se devuelve es la misma que la que establece el usuario en ConnectionString menos la información de seguridad si el valor de Persist Security Info está establecido en false (valor predeterminado). El proveedor de datos de .NET Framework para SQL Server no se conserva en una cadena de conexión ni devuelve la contraseña, a no ser que el valor de Persist Security Info (Información de seguridad persistente) esté establecido en true.

Se puede utilizar la propiedad ConnectionString para conectarse a una base de datos. En el ejemplo siguiente se muestra una cadena de conexión típica.

"Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=Northwind;server=(local)"

Utilice el nuevo SqlConnectionStringBuilder para construir cadenas de conexión válidas en tiempo de ejecución. Para obtener más información, vea Building Connection Strings.

La propiedad ConnectionString sólo se puede configurar cuando la conexión está cerrada. Muchos de los valores de cadena de conexión tienen propiedades asociadas de sólo lectura. Cuando se establece la cadena de conexión, se actualizan estas propiedades, excepto cuando se detecta un error. En este caso, no se actualiza ninguna de las propiedades. Las propiedades de SqlConnection devuelven únicamente los valores contenidos en la propiedad ConnectionString.

Para conectarse a un equipo local, especifique "(local)" para el servidor. (Se debe especificar siempre un servidor).

El restablecimiento de ConnectionString de una conexión cerrada, restablece todos los valores de la cadena de conexión (y propiedades relacionadas) incluida la contraseña. Por ejemplo, si se establece una cadena de conexión que incluya "Database= AdventureWorks" y, a continuación, se restablece la cadena de conexión en "Data Source=myserver;Integrated Security=SSPI", el valor de la propiedad Database deja de ser "AdventureWorks".

La cadena de conexión se analiza inmediatamente, una vez establecida. Si durante el análisis se encuentran errores en la sintaxis, se genera una excepción en tiempo de ejecución, como ArgumentException. Se pueden encontrar otros errores sólo cuando se realiza un intento para abrir la conexión.

Page 8: SQLCONNECTION CLASE

El formato básico de una cadena de conexión incluye una serie de pares de palabra clave y valor separados por puntos y comas. El signo igual (= ) asocia cada palabra clave a su valor. Para incluir valores que contengan punto y coma, un carácter de comillas simples o un carácter de comillas dobles, el valor debe escribirse entre comillas dobles. Si el valor contiene un punto y coma y un carácter de comillas dobles, se puede escribir entre comillas simples. Las comillas simples se utilizan también si el valor comienza por un carácter de comillas dobles. Y a la inversa, si el valor comienza por comillas simples, se pueden utilizar las comillas dobles. Si el valor contiene caracteres de comillas simples y de comillas dobles, el carácter de comillas entre el que se encierra el valor deberá duplicarse cada vez que aparezca dentro del valor.

Para incluir espacios iniciales o finales en el valor de la cadena, el valor debe escribirse entre comillas simples o comillas dobles. No se tienen en cuenta los espacios iniciales o finales que rodean a los valores enteros, booleanos o enumerados, aunque estén entre comillas. Sin embargo, se conservan los espacios incluidos dentro de una palabra clave o un valor literal de una cadena. Con la versión 1.1 o posterior de .NET Framework, se pueden utilizar comillas simples o dobles dentro de una cadena de conexión sin utilizar delimitadores (por ejemplo, Data Source= my'Server o Data Source= my"Server), a menos que las comillas sean el primer o último carácter del valor.

Para incluir un signo igual (=) en una palabra clave o valor, debe ir precedido de otro signo igual. Por ejemplo, en la hipotética cadena de conexión

"key==word=value"

DATATABLE (CLASE)

Representa una tabla de datos en memoria.

'Declaración

<SerializableAttribute> _Public Class DataTable

Inherits MarshalByValueComponentImplements IListSource, ISupportInitializeNotification,

ISupportInitialize, ISerializable, _IXmlSerializable

'Uso

Dim instance As DataTable/** @attribute SerializableAttribute() */ public class DataTable extends MarshalByValueComponent implements IListSource, ISupportInitializeNotification,

ISupportInitialize, ISerializable, IXmlSerializable

Page 9: SQLCONNECTION CLASE

Comentarios

DataTable es un objeto central de la biblioteca ADO.NET. Entre los objetos que utilizan DataTable se incluyen DataSet y DataView.

Al obtener acceso a los objetos DataTable, hay que tener en cuenta que éstos distinguen entre mayúsculas y minúsculas condicionalmente. Por ejemplo, si un objeto DataTable se denomina "mydatatable" y otro "Mydatatable", la cadena que se utilice para buscar una de las tablas se considerará que distingue entre mayúsculas y minúsculas. Sin embargo, si existe "mydatatable" pero no existe "Mydatatable", se considerará que la cadena de búsqueda no distingue entre mayúsculas y minúsculas. Un objeto DataSet puede contener dos objetos DataTable que tengan el mismo valor para la propiedad TableName y distintos valores para la propiedad Namespace. Para obtener más información sobre el trabajo con los objetos DataTable, vea Crear DataTable.

Si se va a crear un DataTable mediante programación, en primer lugar se debe definir su esquema agregando objetos DataColumn al DataColumnCollection (al que se obtiene acceso mediante la propiedad Columns). Para obtener más información sobre la adición de objetos DataColumn, vea Agregar columnas a una tabla.

Para agregar filas a DataTable, en primer lugar se debe utilizar el método NewRow para devolver un nuevo objeto DataRow. El método NewRow devuelve una fila con el esquema de DataTable, tal como lo define el DataColumnCollection de la tabla. El número máximo de filas que puede almacenar un objeto DataTable es 16.777.216. Para obtener más información, vea Agregar datos a una tabla.

DataTable también contiene una colección de objetos Constraint que se pueden utilizar para asegurar la integridad de los datos. Para obtener más información, vea Agregar restricciones a una tabla.

Hay muchos eventos DataTable que se pueden utilizar para determinar cuando se realizan cambios en una tabla, algunos de ellos son los siguientes: RowChanged, RowChanging, RowDeleting y RowDeleted. Para obtener más información sobre los eventos que se pueden utilizar con un objeto DataTable, vea Trabajar con eventos DataTable.

Cuando se crea una instancia de DataTable, se establecen algunas propiedades de lectura y escritura en valores iniciales. Para obtener una lista de esos valores, vea el tema sobre el constructor System.Data.DataTable.

Page 10: SQLCONNECTION CLASE

DATABINDING

Los controles que con regularidad se utilizan en aplicaciones  Windows así como en aplicaciones Web tienen la propiedad DataBinding, es necesario configurar la propiedad de cada control que contendrá en enlace a los datos, luego para administrar esta se debe utilizar la propiedad BindingContext de la clase contenedora. Al usar el BindingContext obtiene el BindingManagerBase que mantiene sincronizados todos los controles enlazados al mismo origen de datos, se puede utilizar la propiedad Position del BindingManagerBase para especificar el elemento actualmente seleccionado de una lista.

Por ejemplo, para enlazar una caja de texto con el campo FirsName de la Tabla Empleados (dtEmpleados) contenida en una DataSet previamente definido utilizo la siguiente instrucción:

txtNombre.DataBindings.Add("Text", dtEmpleados, "FirstName")

Luego para administrar por ejemplo la posición actual o lo que es lo mismo el registro activo se utiliza la siguiente instrucción:

Me.BindingContext(dtEmpleados).Position = 0

Note en la instrucción anterior que se utiliza ña propiedad BindingContext del formulario, como lo dicho en líneas arriba, la propiedad Position va a mantener sincronizados todos los controles enlazados al DataTable dtEmpleados.

 NUESTRO EJEMPLO

El ejemplo muestra un formulario donde aparecen los Empleados (Tabla Employees), el Total de sus ventas, las Órdenes Registradas (Tabla Oders) por el Empleado y el Detalle de las mismas (Tabla Order Details). La Base de datos es Northwind.

Se ha utilizado un  SQLDataAdapter, definido mediante código, para generar los comandos SQL se ha utilizado un SQLCommandBuilder, luego al SQLDataAdapter cambiamos el SQLCommand Select para poder llenar los DataTables.

Las órdenes Select para nuestro ejemplo son las siguientes:

1. Para poder llenar el DataTable de Órdenes:

/*ID de la Orden, Total, Id Empleado, la Fecha y el Nombre de la Compañía*/

SELECT od.OrderID, SUM(CONVERT(money, (od.UnitPrice * od.Quantity) * (1 - od.Discount) / 100) * 100) 

AS Total, o.EmployeeID, o.OrderDate, c.CompanyNameFROM [Order Details] od INNER JOIN Orders o ON od.OrderID = o.OrderID

Page 11: SQLCONNECTION CLASE

INNER JOIN Customers c  ON o.CustomerID = c.CustomerID GROUP BY od.OrderID, o.EmployeeID, o.OrderDate, c.CompanyName

2. Para llenar Total de las ventas creamos un DataTable con el Id del Empleado y el valor total de las Órdenes.

/*ID del Empleado y el Total de sus ventas*/SELECT e.employeeid, sum(UnitPrice * Quantity) 

As SalesToDate FROM [order details] od INNER JOIN orders o 

ON o.orderid = od.orderid INNER JOIN employees e ON e.employeeid = o.employeeid

GROUP BY e.employeeid

3. Para llenar el DataTable de Detalle de las órdenes:

/*Orden select para el Detalle de las órdenes Extrae: ID de la Orden, Precio, Cantidad, Descuento, Nombre Productonombre de Categoía y Subtotal*/SELECT od.OrderID, od.UnitPrice, od.Quantity, od.Discount, p.ProductName, c.CategoryName, (od.UnitPrice * od.Quantity)       As SubTotal 

FROM [order details] od INNER JOIN Products p ON od.ProductID = p.ProductID INNER JOIN Categories c ON c.CategoryID = p.CategoryID  ORDER BY od.OrderID

Las instrucciones Select anteriores puedes copiarlas al Query Analyzer de SQL Server usando la base de datos Northwind para ver los resultados, es obvio que todos los lectores conocen de la sintaxis y del uso de Transac SQL.

En el ejemplo se han incluído cuatro DataTable y tres Vistas, con las siguientes órdenes asigno los DataTables creados a variables y especifico el origen de las Vistas creadas.

    'Asignar los DataTables a las Variables definidas dtEmpleados = dsDatos.Tables("Empleados") dtOrdenes = dsDatos.Tables("Ordenes") dtVentas = dsDatos.Tables("Ventas") dtDetalle = dsDatos.Tables("Detalle")

  'Especificar las Vistas dvOrdenes = dtOrdenes.DefaultView dvVentas = dtDetalle.DefaultView

dvDetalle = dtDetalle.DefaultView

Luego se agregan los DataBindings para los controles y conseguimos mantener enlazados y sincronizados los controles.