ADO.NET 2.0 Captator Tlf: Henrik Lykke Nielsen Softwarearkitekt, Microsoft Regional Director for Denmark Mobil:
Agenda Providermodellen Basis klasser og interfaces Provider factories, Connectionstrenge Schema API DataSet, DataTable, DataView Indexeringsmekanisme, serialisering SqlBulkCopy Asynkrone kald DataBinding
XML Parser … Web/Win Form Controls VS.NET Designers.NET Data Provider DataAdapterDataReader Command Connection …SQL OLE DB VS.NET Class Generator DataSet Item Cust Order Kode ADO.NET arkitekturen
OleDb OleDbConnection IDbConnection OleDbCommand IDbCommand OleDbDataAdapter DbDataAdapter DataAdapter IDataAdapter IDbDataAdapter IDataAdapter OleDbDataReader IDataReader IDataRecord SqlClient SqlConnection IDbConnection SqlCommand IDbCommand SqlDataAdapter DbDataAdapter DataAdapter IDataAdapter IDbDataAdapter IDataAdapter SqlDataReader IDataReader IDataRecord Basis klasser og interfaces i 1.1 Bemærk: Læses som at SqlDataAdapter arver fra DbDataAdapter
OleDb OleDbConnection DbConnection IDbConnection OleDbCommand DbCommand IDbCommand OleDbDataAdapter DbDataAdapter DataAdapter IDataAdapter IDbDataAdapter IDataAdapter OleDbDataReader DbDataReader IDataReader IDataRecord SqlClient SqlConnection DbConnection IDbConnection ISqlConnection IDbConnection SqlCommand DbCommand IDbCommand ISqlCommand IDbCommand SqlDataAdapter DbDataAdapter DataAdapter IDataAdapter IDbDataAdapter IDataAdapter SqlDataReader DbDataReader IDataReader IDataRecord ISqlReader ISqlRecord IDataRecord Basis klasser og interfaces i 2.0 DbDataAdapter implementerer nu IDbDataAdapter
Interfaces og basis klasse i 1.1 SqlClient klasse OleDb klasse Basisklasse/interface SqlConnectionOleDbConnectionIDbConnection SqlCommandOleDbCommandIDbCommand SqlDataReaderOleDbDataReaderIDataReader IDataRecord SqlTransactionOleDbTransactionIDbTransaction SqlParameterOleDbParameterIDbDataParameter IDataParameter SqlParameterCollectionOleDbParameterCollectionIDataParameterCollection IList SqlDataAdapterOleDbDataAdapterDbDataAdapter DataAdapter IDbDataAdapter IDataAdapter SqlCommandBuilderOleDbCommandBuilder SqlException SystemException OleDbException ExternalException SystemException
Interfaces og basis klasser i 2.0 De abstrakte basis klasser befinder sig i System.Data.Common namespacet SqlClient klasse Abstrakt basis klasse Interface SqlConnectionDbConnectionIDbConnection SqlCommandDbCommandIDbCommand SqlDataReaderDbDataReaderIDataReader IDataRecord SqlTransactionDbTransactionIDbTransaction SqlParameterDbParameterIDbDataParameter IDataParameter SqlParameterCollectionDbParameterCollectionIDataParameterCollection IList SqlDataAdapterDbDataAdapterIDbDataAdapter IDataAdapter SqlCommandBuilderDbCommandBuilder SqlExceptionDbException SqlConnectionStringBuilderDbConnectionStringBuilder
Provider factories System.Data.Common.DbProviderFactory En abstrakt klasse der er basisklasse for de konkrete factories: SqlClientFactory, OleDbFactory,... Metoder: CreateConnection As DbConnection CreateCommand As DbCommand CreateCommandBuilder, CreateConnectionStringBuilder, CreateDataAdapter, CreateParameter, CreatePermission, CreateDataSourceEnumerator, CanCreateDataSourceEnumerator De konkrete factories har ingen konstruktører, men i stedet en Instance-metode Public ReadOnly Shared Instance As SqlClientFactory public readonly static SqlClientFactory Instance VB C#
Provider factories System.Data.Common.DbProviderFactories Util klasse Metoder: Public Shared Function GetFactory(ByVal providerInvariantName As String) _ As System.Data.Common.DbProviderFactory Public Shared Function GetFactory(ByVal providerRow As System.Data.DataRow) _ As System.Data.Common.DbProviderFactory Public Shared Function GetFactoryClasses() As System.Data.DataTable Public Shared Function GetFactory(ByVal providerInvariantName As String) _ As System.Data.Common.DbProviderFactory Public Shared Function GetFactory(ByVal providerRow As System.Data.DataRow) _ As System.Data.Common.DbProviderFactory Public Shared Function GetFactoryClasses() As System.Data.DataTable public static System.Data.Common.DbProviderFactory GetFactory( string providerInvariantName) public static System.Data.Common.DbProviderFactory GetFactory( System.Data.DataRow providerRow) public static System.Data.DataTable GetFactoryClasses() public static System.Data.Common.DbProviderFactory GetFactory( string providerInvariantName) public static System.Data.Common.DbProviderFactory GetFactory( System.Data.DataRow providerRow) public static System.Data.DataTable GetFactoryClasses() VB C#
Provider factories DbProviderFactories er registreret i machine.config GetFactoryClasses giver en DataTable med ovenstående info <add name="Odbc Data Provider" invariant="System.Data.Odbc" support="BF" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version= , Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <add name="Odbc Data Provider" invariant="System.Data.Odbc" support="BF" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version= , Culture=neutral, PublicKeyToken=b77a5c561934e089" /> Attibut-navnColumn-navn nameName invariantInvariantName supportSupportedClasses descriptionDescription typeAssemblyQualifiedName
ConnectionStrenge System.Data.Common.DbConnectionStringBuilder er et svagt-typet dictionary Dim factory As System.Data.Common.DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient") Dim connBuilder As System.Data.Common.DbConnectionStringBuilder connBuilder = factory.CreateConnectionStringBuilder() connBuilder.Add("Data Source", "localhost") connBuilder.Add("User Id", "DemoUser") connBuilder.Add("Password", "hemmeligt") Dim factory As System.Data.Common.DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient") Dim connBuilder As System.Data.Common.DbConnectionStringBuilder connBuilder = factory.CreateConnectionStringBuilder() connBuilder.Add("Data Source", "localhost") connBuilder.Add("User Id", "DemoUser") connBuilder.Add("Password", "hemmeligt") System.Data.Common.DbProviderFactory factory; factory = DbProviderFactories.GetFactory("System.Data.SqlClient"); System.Data.Common.DbConnectionStringBuilder connBuilder; connBuilder = factory.CreateConnectionStringBuilder(); connBuilder.Add("Data Source", "localhost"); connBuilder.Add("User Id", "DemoUser"); connBuilder.Add("Password", "hemmeligt"); System.Data.Common.DbProviderFactory factory; factory = DbProviderFactories.GetFactory("System.Data.SqlClient"); System.Data.Common.DbConnectionStringBuilder connBuilder; connBuilder = factory.CreateConnectionStringBuilder(); connBuilder.Add("Data Source", "localhost"); connBuilder.Add("User Id", "DemoUser"); connBuilder.Add("Password", "hemmeligt"); VB C#
ConnectionStrenge Nedarves af (mere eller mindre) typestærke klasser OdbcConnectionStringBuilder Driver, Dsn OleDbConnectionStringBuilder DataSource, FileName, Provider,... OracleClientConnectionStringBuilder DataSource, IntegratedSecurity, LoadBalanceTimeout, MaxPoolSize, MinPoolSize, Password, PersistSecurityInfo, Pooling, Unicode, UserID,... SqlConnectionStringBuilder ApplicationName, AsynchronousProcessing, ConnectTimeout, DataSource, Encrypt, FailOverPartner, InitialCatalog, IntegratedSecurity, LoadBalanceTimeout, MaxPoolSize, MinPoolSize, MultipleActiveResultSets, NetworkLibrary, Password, PersistSecurityInfo, Pooling, Replication, UserID,...
Enumerering af data sources GetDataSources på en DbDataSourceEnumerator finder datasources (MS SQL) på nettet System.Data.Sql.SqlDataSourceEnumerator er den eneste konkrete implementation Dim factory As System.Data.Common.DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient") Dim enumerator As System.Data.Common.DbDataSourceEnumerator enumerator = factory.CreateDataSourceEnumerator() Dim dataSourceTable As System.Data.DataTable = enumerator.GetDataSources() Dim factory As System.Data.Common.DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient") Dim enumerator As System.Data.Common.DbDataSourceEnumerator enumerator = factory.CreateDataSourceEnumerator() Dim dataSourceTable As System.Data.DataTable = enumerator.GetDataSources() System.Data.Common.DbProviderFactory factory; factory = DbProviderFactories.GetFactory("System.Data.SqlClient"); System.Data.Common.DbDataSourceEnumerator enumerator; enumerator = factory.CreateDataSourceEnumerator(); System.Data.DataTable dataSourceTable = enumerator.GetDataSources(); System.Data.Common.DbProviderFactory factory; factory = DbProviderFactories.GetFactory("System.Data.SqlClient"); System.Data.Common.DbDataSourceEnumerator enumerator; enumerator = factory.CreateDataSourceEnumerator(); System.Data.DataTable dataSourceTable = enumerator.GetDataSources(); VB C#
Fælles programmeringsmodel Lettere for Microsoft (og andre) at udvide providere Mere ensartet programmeringsmodel Provider factories løser instansieringsproblemet Gem providerens InvariantName i f.eks. konfiguationsfil GetFactory der returnerer den enkelte provider factory instans bruger reflektion – så genbrug den! Brug af basisklasser giver ikke performance overhead GetFactoryClasses() god til udvikler/admin tools ConnectionStringBuilders gør det lettere at lave connectionstrenge – men de enkelte er (desværre) ret forskellige
Schema APIet API til at få schema-oplysninger om en DataSource DbConnections GetSchema-metode i tre former Public Function conn.GetSchema() As DataTable Public Function conn.GetSchema(collectionName As String) As DataTable Public Function conn.GetSchema(collectionName As String, _ restrictionValues As String()) As DataTable Public Function conn.GetSchema() As DataTable Public Function conn.GetSchema(collectionName As String) As DataTable Public Function conn.GetSchema(collectionName As String, _ restrictionValues As String()) As DataTable VB public DataTable conn.GetSchema() public DataTable conn.GetSchema(string collectionName) public DataTable conn.GetSchema(string collectionName, string[] restrictionValues) public DataTable conn.GetSchema() public DataTable conn.GetSchema(string collectionName) public DataTable conn.GetSchema(string collectionName, string[] restrictionValues) C#
Schema - MetaDataCollections Få en liste over metadatacollections Metadata collections: MetaDataCollections, DataSourceInformation, DataTypes, Restrictions, Users, Databases, Tables, Columns, Views, ViewColumns, ProcedureParameters, Procedures, ForeignKeys, IndexColumns, Indexes, UserDefinesTypes Dim tbl As DataTable = conn.GetSchema() ' eller tbl = conn.GetSchema("MetaDataCollections") Dim tbl As DataTable = conn.GetSchema() ' eller tbl = conn.GetSchema("MetaDataCollections") DataTable tbl = conn.GetSchema(); // eller DataTable tbl = conn.GetSchema("MetaDataCollections"); DataTable tbl = conn.GetSchema(); // eller DataTable tbl = conn.GetSchema("MetaDataCollections"); VB C#
Schema - DataSourceInformation Få informationer om datasourcen Indeholder én row Muligvis forskellige felter – ens for MS’s providere DataSourceProductName, DataSourceProductVersion, IdentifierPattern, ParameterMarkerFormat, ParameterMarkerPattern, ParameterNameMaxLength, ParameterNamePattern, QuotedIdentifierPattern, StatementSeparatorPattern, StringLiteralPattern, SupportedJoinOperators,... Dim tbl As DataTable = conn.GetSchema("DataSourceInformation") DataTable tbl = conn.GetSchema("DataSourceInformation"); VB C#
Schema - restriktioner Restriktioner er simple filtre for, hvilke entiteter man ønsker metadata for Restriktioner angives via værdier i et streng array Restriktioner er defineret i ”Restrictions”-collectionen Eksempel på brug af restrictioner Konkrete informationer varierer mellem providere Dim res As String(3) res(1) = "Person" res(2) = "Contact" Dim tbl As System.Data.DataTable = conn.GetSchema("Columns", res) Dim res As String(3) res(1) = "Person" res(2) = "Contact" Dim tbl As System.Data.DataTable = conn.GetSchema("Columns", res) VB string[] res = new string[4]; res[1] = "Person"; res[2] = "Contact"; System.Data.DataTable tbl = conn.GetSchema("Columns", res); string[] res = new string[4]; res[1] = "Person"; res[2] = "Contact"; System.Data.DataTable tbl = conn.GetSchema("Columns", res); C#
DataSet, DataTable - performance Ny indexeringsmekanisme giver markant forbedret performance ved for eksempel Fill og Merge public System.Data.DataTable CreateDataTable(int numberOfRows) { System.Random rnd = new System.Random(); System.Data.DataTable tbl = new System.Data.DataTable(); tbl.Columns.Add("Id", typeof(System.Guid)); tbl.Columns["Id"].Unique = true; tbl.Columns.Add("RandomValue", typeof(int)); for (int n = 0; n < numberOfRows; n++) { System.Data.DataRow row = tbl.NewRow(); row["Id"] = System.Guid.NewGuid(); row["RandomValue"] = rnd.Next(); tbl.Rows.Add(row); } return tbl; } public System.Data.DataTable CreateDataTable(int numberOfRows) { System.Random rnd = new System.Random(); System.Data.DataTable tbl = new System.Data.DataTable(); tbl.Columns.Add("Id", typeof(System.Guid)); tbl.Columns["Id"].Unique = true; tbl.Columns.Add("RandomValue", typeof(int)); for (int n = 0; n < numberOfRows; n++) { System.Data.DataRow row = tbl.NewRow(); row["Id"] = System.Guid.NewGuid(); row["RandomValue"] = rnd.Next(); tbl.Rows.Add(row); } return tbl; } C#
DataSet, DataTable - performance Resultater Antal rows VS2003 ikke unique VS2005 ikke unique VS2003uniqueVS2005unique sek 6 sek 3 sek sek 2 sek 33 sek 6 sek sek 5 sek 322 sek 17 sek sek 11 sek1414 sek 38 sek
Dataset, DataTable - serialisering DataSets og DataTables serialiserer sig selv som XML uanset man bruger en BinaryFormatter Kan nu fortælle, at der skal serialiseres binært RemotingFormat-propertyen kan sættes til System.Data.SerializationFormat.Xml (default) System.Data.SerializationFormat.Binary
Dataset, DataTable - serialisering Eksempel med simple rows skrevet til fil XML-format: KB – KB Binært format: 835 KB – KB tbl.RemotingFormat = System.Data.SerializationFormat.Binary Dim formatter As New BinaryFormatter() Dim st As New FileStream(fileName, FileMode.Create) formatter.Serialize(st, tbl) st.Close() tbl.RemotingFormat = System.Data.SerializationFormat.Binary Dim formatter As New BinaryFormatter() Dim st As New FileStream(fileName, FileMode.Create) formatter.Serialize(st, tbl) st.Close() VB tbl.RemotingFormat = System.Data. SerializationFormat.Binary; BinaryFormatter formatter = new BinaryFormatter (); FileStream st = new FileStream (fileName, FileMode.Create); formatter.Serialize(st, tbl); st.Close(); tbl.RemotingFormat = System.Data. SerializationFormat.Binary; BinaryFormatter formatter = new BinaryFormatter (); FileStream st = new FileStream (fileName, FileMode.Create); formatter.Serialize(st, tbl); st.Close(); C#
DataTable - XML XML understøttelse som for DataSets: ReadXml, ReadXmlSchema WriteXml, WriteXmlSchema
DataSet, DataTable, DataReader Populér DataTable/DataSet ud fra DataReader Generer DataReader ud fra DataTable/DataSet Hvis CreateDataReader kaldes på et DataSet med flere tabeller vil DataReaderen indeholde multiple resultset ' Tag fat i en database … Dim dr As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader() Dim tbl As New System.Data.DataTable() tbl.Load(dr) ' Tag fat i en database … Dim dr As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader() Dim tbl As New System.Data.DataTable() tbl.Load(dr) VB // Tag fat i en database … System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader(); System.Data.DataTable tbl = new System.Data.DataTable(); tbl.Load(dr); // Tag fat i en database … System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader(); System.Data.DataTable tbl = new System.Data.DataTable(); tbl.Load(dr); C# Dim tbl As System.Data.DataTable = LavEnDataTable() Dim dr As System.Data.DataTableReader = tbl.CreateDataReader() Dim tbl As System.Data.DataTable = LavEnDataTable() Dim dr As System.Data.DataTableReader = tbl.CreateDataReader() VB System.Data.DataTable tbl = LavEnDataTable(); System.Data.DataTableReader dr = tbl.CreateDataReader(); System.Data.DataTable tbl = LavEnDataTable(); System.Data.DataTableReader dr = tbl.CreateDataReader(); C#
DataTable, DataView Generer en DataTable ud fra et DataView Dim tbl As System.Data.DataTable = LavEnDataTable() Dim view As New System.Data.DataView(tbl) view.Sort = "FirstName ASC, LastName DESC" view.RowFilter = "FirstName>'C'" Dim columnNames As String() = { "FirstName", "LastName" } Dim tblFiltered As System.Data.DataTable tblFiltered = view.ToTable("MinFiltreredeTabel", False, columnNames) Dim tbl As System.Data.DataTable = LavEnDataTable() Dim view As New System.Data.DataView(tbl) view.Sort = "FirstName ASC, LastName DESC" view.RowFilter = "FirstName>'C'" Dim columnNames As String() = { "FirstName", "LastName" } Dim tblFiltered As System.Data.DataTable tblFiltered = view.ToTable("MinFiltreredeTabel", False, columnNames) VB System.Data.DataTable tbl = LavEnDataTable(); System.Data.DataView view = new System.Data.DataView(tbl); view.Sort = "FirstName ASC, LastName DESC"; view.RowFilter = "FirstName>'C'"; string[] columnNames = { "FirstName", "LastName" }; System.Data.DataTable tblFiltered; tblFiltered = view.ToTable("MinFiltreredeTabel", false, columnNames); System.Data.DataTable tbl = LavEnDataTable(); System.Data.DataView view = new System.Data.DataView(tbl); view.Sort = "FirstName ASC, LastName DESC"; view.RowFilter = "FirstName>'C'"; string[] columnNames = { "FirstName", "LastName" }; System.Data.DataTable tblFiltered; tblFiltered = view.ToTable("MinFiltreredeTabel", false, columnNames); C#
Connection statistik - SqlClient StatisticsEnabled, RetrieveStatistics conn.StatisticsEnabled = true; System.Collections.Hashtable statistics = (System.Collections.Hashtable)_conn.RetrieveStatistics(); txtStatistics.Text = ""; foreach (string key in statistics.Keys) { txtStatistics.Text += key.PadRight(20, ' ') + "= " + statistics[key].ToString() + "\r\n"; } conn.StatisticsEnabled = true; System.Collections.Hashtable statistics = (System.Collections.Hashtable)_conn.RetrieveStatistics(); txtStatistics.Text = ""; foreach (string key in statistics.Keys) { txtStatistics.Text += key.PadRight(20, ' ') + "= " + statistics[key].ToString() + "\r\n"; } NetworkServerTime = 50 BytesReceived = UnpreparedExecs = 12 SumResultSets = 12 SelectCount = 12 PreparedExecs = 0 ConnectionTime = ExecutionTime = 3194 Prepares = 0 NetworkServerTime = 50 BytesReceived = UnpreparedExecs = 12 SumResultSets = 12 SelectCount = 12 PreparedExecs = 0 ConnectionTime = ExecutionTime = 3194 Prepares = 0 BuffersSent = 12 SelectRows = ServerRoundtrips = 12 CursorOpens = 0 Transactions = 0 BytesSent = 1968 BuffersReceived = 2628 IduRows = 0 IduCount = 0 BuffersSent = 12 SelectRows = ServerRoundtrips = 12 CursorOpens = 0 Transactions = 0 BytesSent = 1968 BuffersReceived = 2628 IduRows = 0 IduCount = 0 C#
Multiple Active ResultSets (MARS) SQL Server 2005 feature Man kan nu have flere resultsets åbne på samme tid– flere DataReadere om en connection (hver sin command) SqlClient.SqlConnection conn = new SqlClient.SqlConnection(connString); conn.Open(); SqlClient.SqlCommand cmd1 = new SqlClient.SqlCommand(sql1, conn); SqlClient.SqlDataReader rd1 = cmd1.ExecuteReader(); rd1.Read(); rd1.Read(); rd1.Read(); SqlClient.SqlCommand cmd2 = new SqlClient.SqlCommand(sql2, conn); SqlClient.SqlDataReader rd2 = cmd2.ExecuteReader(); rd2.Read(); rd1.Read(); rd2.Read(); rd2.Close(); rd1.Close(); conn.Close(); SqlClient.SqlConnection conn = new SqlClient.SqlConnection(connString); conn.Open(); SqlClient.SqlCommand cmd1 = new SqlClient.SqlCommand(sql1, conn); SqlClient.SqlDataReader rd1 = cmd1.ExecuteReader(); rd1.Read(); rd1.Read(); rd1.Read(); SqlClient.SqlCommand cmd2 = new SqlClient.SqlCommand(sql2, conn); SqlClient.SqlDataReader rd2 = cmd2.ExecuteReader(); rd2.Read(); rd1.Read(); rd2.Read(); rd2.Close(); rd1.Close(); conn.Close(); Op til 9 poolede commands per connection C#
UpdateBatchSize og SqlBulkCopy DbDataAdapter.UpdateBatchSize property påvirker DbDataAdapter.Update System.Data.SqlClient.SqlBulkCopy påvirker performance rows i en DataTable DbDataAdapter.Update tog 70 sekunder (BatchSize=100) SqlBulkCopy.WriteToServer tog 3 sekunder System.Data.DataTable tbl = CreateDataTable(100000); System.Data.SqlClient.SqlBulkCopy bulk = new System.Data.SqlClient.SqlBulkCopy(connString); bulk.DestinationTableName = "RandomTable"; bulk.WriteToServer(tbl); bulk.Close(); System.Data.DataTable tbl = CreateDataTable(100000); System.Data.SqlClient.SqlBulkCopy bulk = new System.Data.SqlClient.SqlBulkCopy(connString); bulk.DestinationTableName = "RandomTable"; bulk.WriteToServer(tbl); bulk.Close(); C#
Asynkrone kald Asynkrone kommandoer i ADO.NET 1.1 og ADO.NET 2.0 I 1.1 er det muligt at lave asynkrone kald ved at bruge ThreadPool eller asynkrone delegates – en baggrundstråd blokeres Asynkrone kommandoer i 2.0 blokerer ingen baggrundstråde Brugen af asynkrone kommandoer til ADO.NET (SqlClient) I scenarier hvor det er vigtigt ikke at blokere tråde (fx. Web apps) Designet som resten af de asynkrone arkitekturer i.NET Xxx => BeginXxx med input-parms og EndXxx med output-parms og retur-værdi Synkron Metode Asynkrone Metoder BeginXxxEndXxx ExecuteNonQueryBeginExecuteNonQueryEndExecuteNonQuery ExecuteReaderBeginExecuteReaderEndExecuteReader ExecuteXmlReaderBeginExecuteXmlReaderEndExecuteXmlReader
Asynkrone kald Opsætning ”Asynchronous Processing=true” eller ”async=true” i Connectionstring Brug forskellige connections til synkrone og asynkrone connections (af hensyn til performance) Der findes 4 måder at afslutte et asynkront kald på: Callback – angiv metode der skal kaldes når arbejde udført Synkroniseringsobjekt – koordinering af asynkrone kald via WaitHandle Polling – check på IAsyncResults property IsCompleted Kald EndXxx som vil blokere indtil det asynkrone kald er færdigt Vær opmærksom på: Kald EndXxx, når et asynkront kald er færdigt (for at undgå ressource-leaks) Der kan kastes exceptions ved både BeginXxx og EndXxx
DataBinding System.Windows.Forms.BindingSource fungerer som en datakilde for kontroller som en mekanisme for opdatering af data som et datalager (datasource) i sig selv Kan bindes til forskellige datasources Simple objekter (benytter properties) Lister såsom ArrayList Komplekse datakilder såsom DataTables
DataBinding Sæt BindingSources DataSource-property til datakilden DataSource kan også sættes til en System.Type Informationen videregives til kontroller der bindes Dim binding As System.Windows.Forms.BindingSource binding = New System.Windows.Forms.BindingSource() grdPerson.DataSource = binding Dim p As Person p = New Person("Mr", "Anders", "And", binding.Add(p) p = New Person("Ms", "Andersine", "And", binding.Add(p) p = New Person("Mr", "Mikkel", "Mus", binding.Add(p) Dim binding As System.Windows.Forms.BindingSource binding = New System.Windows.Forms.BindingSource() grdPerson.DataSource = binding Dim p As Person p = New Person("Mr", "Anders", "And", binding.Add(p) p = New Person("Ms", "Andersine", "And", binding.Add(p) p = New Person("Mr", "Mikkel", "Mus", binding.Add(p) VB
DataBinding Events såsom: AddingNew, CurrentItemChanged, PositionChanged ListChanged(ListChangedType: Added, Changed, Removed, Moved,...) Properties såsom: Current, Filter, Position, Sort, ListCount Metoder såsom: Move*, Add, Clear, Remove, RemoveFIlter, RemoveSort ResetBindings-metoden fortæller kontrollerne, at data har ændret sig
DataBinding- BindingNavigator En video kontrol der kan bruges til navigering og redigering Sæt BindingNavigator-komponentens BindingSource-property til et BindingSource objekt ToolStripButtons kan let tilføjes og fjernes
Spørgsmål nyheder, artikler, information,...