ADO .NET PrimerADO .NET PrimerADO .NET PrimerADO .NET Primer
Andrea SaltarelloAndrea SaltarelloSoftware Architect – Software Architect – Managed Designs S.r.l.http://blogs.ugidotnet.org/pape
SponsorSponsor
Struttura di ADO .NETStruttura di ADO .NETStruttura di ADO .NETStruttura di ADO .NET
ADO .NET è composto da:ADO .NET è composto da:– Namespace Namespace System.DataSystem.Data: racchiude le primitive : racchiude le primitive
indipendenti dalla tipologia di base dati. indipendenti dalla tipologia di base dati. • Sono tutte disconnesseSono tutte disconnesse
– .NET Managed Provider: implementano le primitive .NET Managed Provider: implementano le primitive necessarie all’accesso a necessarie all’accesso a specifiche specifiche basi datibasi dati
• System.Data.SqlClientSystem.Data.SqlClient per l’accesso a SQL Server 7+ per l’accesso a SQL Server 7+• System.Data.OleDbSystem.Data.OleDb per connettersi usando un OleDb per connettersi usando un OleDb
Provider Provider • System.Data.OracleClientSystem.Data.OracleClient• System.Data.OdbcSystem.Data.Odbc
.NET Data Providers.NET Data Providers .NET Data Providers.NET Data Providers
Implementano un insieme comune di Implementano un insieme comune di interfacce esponendo le classi:interfacce esponendo le classi:– Connection: permette la connessione ad una Connection: permette la connessione ad una
base datibase dati– Command: permette l’esecuzione di comandi Command: permette l’esecuzione di comandi
SQL e SQL e Stored ProcedureStored Procedure– DataReader: implementa un cursore DataReader: implementa un cursore forward-forward-
only, read-only, client sideonly, read-only, client side– DataAdapter: permette di “riempire” un DataAdapter: permette di “riempire” un
contenitore disconnessocontenitore disconnesso
Implementano un insieme comune di Implementano un insieme comune di interfacce esponendo le classi:interfacce esponendo le classi:– Connection: permette la connessione ad una Connection: permette la connessione ad una
base datibase dati– Command: permette l’esecuzione di comandi Command: permette l’esecuzione di comandi
SQL e SQL e Stored ProcedureStored Procedure– DataReader: implementa un cursore DataReader: implementa un cursore forward-forward-
only, read-only, client sideonly, read-only, client side– DataAdapter: permette di “riempire” un DataAdapter: permette di “riempire” un
contenitore disconnessocontenitore disconnesso
Classe ConnectionClasse ConnectionClasse ConnectionClasse Connection
Simile ad ADO Simile ad ADO old-styleold-styleLa Connection String:La Connection String:
– Può essere specificata mediante un Può essere specificata mediante un costruttore costruttore parametricoparametrico
– Utilizza le stesse keyword di ADODBUtilizza le stesse keyword di ADODB– Richiede attenzione nella specifica del Richiede attenzione nella specifica del Provider:Provider:
• SqlClient SqlClient nonnon lo accetta lo accetta • System.Data.OleDb non supporta ODBCSystem.Data.OleDb non supporta ODBC
Simile ad ADO Simile ad ADO old-styleold-styleLa Connection String:La Connection String:
– Può essere specificata mediante un Può essere specificata mediante un costruttore costruttore parametricoparametrico
– Utilizza le stesse keyword di ADODBUtilizza le stesse keyword di ADODB– Richiede attenzione nella specifica del Richiede attenzione nella specifica del Provider:Provider:
• SqlClient SqlClient nonnon lo accetta lo accetta • System.Data.OleDb non supporta ODBCSystem.Data.OleDb non supporta ODBC
Dim conSQL As New SqlConnection( )conSQL.ConnectionString = "Integrated Security=True;" & _
"Data Source=LocalHost;Initial Catalog=Pubs;"conSQL.Open( )
Dim conSQL As New SqlConnection( )conSQL.ConnectionString = "Integrated Security=True;" & _
"Data Source=LocalHost;Initial Catalog=Pubs;"conSQL.Open( )
Classe CommandClasse CommandClasse CommandClasse Command
Possiamo creare un comando:Possiamo creare un comando:– Mediante il costruttoreMediante il costruttore– Mediante metodo Mediante metodo CreateCommandCreateCommand
Possiamo eseguire un comando mediante i metodi:Possiamo eseguire un comando mediante i metodi:– ExecuteReaderExecuteReader: restituisce il DataReader in base ad una : restituisce il DataReader in base ad una
queryquery– ExecuteScalarExecuteScalar: è il metodo preferibile se il risultato è un : è il metodo preferibile se il risultato è un
singletonsingleton– ExecuteNonQueryExecuteNonQuery: esegue un comando di azione: esegue un comando di azione
Possiamo creare un comando:Possiamo creare un comando:– Mediante il costruttoreMediante il costruttore– Mediante metodo Mediante metodo CreateCommandCreateCommand
Possiamo eseguire un comando mediante i metodi:Possiamo eseguire un comando mediante i metodi:– ExecuteReaderExecuteReader: restituisce il DataReader in base ad una : restituisce il DataReader in base ad una
queryquery– ExecuteScalarExecuteScalar: è il metodo preferibile se il risultato è un : è il metodo preferibile se il risultato è un
singletonsingleton– ExecuteNonQueryExecuteNonQuery: esegue un comando di azione: esegue un comando di azione
Dim commSQL As New SqlCommand( )commSQL.Connection = conSQLcommSQL.CommandText = "Select Count(*) from Authors"MessageBox.Show(commSQL.ExecuteScalar( ).ToString)
Dim commSQL As New SqlCommand( )commSQL.Connection = conSQLcommSQL.CommandText = "Select Count(*) from Authors"MessageBox.Show(commSQL.ExecuteScalar( ).ToString)
Invocare Stored ProcedureInvocare Stored ProcedureInvocare Stored ProcedureInvocare Stored Procedure
1.1. Creare un oggetto Creare un oggetto CommandCommand2.2. Impostare Impostare CommandTypeCommandType al valore al valore
StoredProcedureStoredProcedure3.3. Impostare la proprietà Impostare la proprietà CommandTextCommandText4.4. Usare il metodo Usare il metodo AddAdd per creare e aggiungere per creare e aggiungere
parametriparametri5.5. Impostare la proprietà Impostare la proprietà ParameterDirectionParameterDirection6.6. Invocare Invocare ExecuteReaderExecuteReader7.7. Consumare i record, e chiudere il Consumare i record, e chiudere il DataReaderDataReader8.8. Leggere i parametri di output e il valore di Leggere i parametri di output e il valore di
ritornoritorno
1.1. Creare un oggetto Creare un oggetto CommandCommand2.2. Impostare Impostare CommandTypeCommandType al valore al valore
StoredProcedureStoredProcedure3.3. Impostare la proprietà Impostare la proprietà CommandTextCommandText4.4. Usare il metodo Usare il metodo AddAdd per creare e aggiungere per creare e aggiungere
parametriparametri5.5. Impostare la proprietà Impostare la proprietà ParameterDirectionParameterDirection6.6. Invocare Invocare ExecuteReaderExecuteReader7.7. Consumare i record, e chiudere il Consumare i record, e chiudere il DataReaderDataReader8.8. Leggere i parametri di output e il valore di Leggere i parametri di output e il valore di
ritornoritorno
Invocare Stored Procedure: un Invocare Stored Procedure: un esempioesempio
Invocare Stored Procedure: un Invocare Stored Procedure: un esempioesempio
Usare un DataReaderUsare un DataReaderUsare un DataReaderUsare un DataReader
Per usare un DataReader, possiamo:Per usare un DataReader, possiamo:– Avanzare alla posizione successiva mediante il Avanzare alla posizione successiva mediante il
metodo metodo Read()Read(), che ritorna True finchè non si sono , che ritorna True finchè non si sono consumati tutti i daticonsumati tutti i dati
– Leggere i valori dei campi mediante la proprietà Item, Leggere i valori dei campi mediante la proprietà Item, oppure mediante i metodi oppure mediante i metodi GetGetXYZXYZ()()
Un DataReader impegna la propria connessione, Un DataReader impegna la propria connessione, quindi:quindi:– Non è possibile utilizzarla per eseguire comandiNon è possibile utilizzarla per eseguire comandi– Dobbiamo ricordarci di chiuderlo mediante il metodo Dobbiamo ricordarci di chiuderlo mediante il metodo
Close()Close()
Per usare un DataReader, possiamo:Per usare un DataReader, possiamo:– Avanzare alla posizione successiva mediante il Avanzare alla posizione successiva mediante il
metodo metodo Read()Read(), che ritorna True finchè non si sono , che ritorna True finchè non si sono consumati tutti i daticonsumati tutti i dati
– Leggere i valori dei campi mediante la proprietà Item, Leggere i valori dei campi mediante la proprietà Item, oppure mediante i metodi oppure mediante i metodi GetGetXYZXYZ()()
Un DataReader impegna la propria connessione, Un DataReader impegna la propria connessione, quindi:quindi:– Non è possibile utilizzarla per eseguire comandiNon è possibile utilizzarla per eseguire comandi– Dobbiamo ricordarci di chiuderlo mediante il metodo Dobbiamo ricordarci di chiuderlo mediante il metodo
Close()Close()
Usare un DataReader: un Usare un DataReader: un esempioesempio
Usare un DataReader: un Usare un DataReader: un esempioesempio
Dim commSQL As New SqlClient.SqlCommand( )commSQL.Connection = conSQLcommSQL.CommandText ="Select au_lname,au_fname from authors"Dim datRead As SqlClient.SqlDataReaderdatRead = commSQL.ExecuteReader( )Do Until datRead.Read = False
MessageBox.Show(datRead.GetString(1) & " " _& datRead.GetString(0))
Loop datRead.Close( )
Dim commSQL As New SqlClient.SqlCommand( )commSQL.Connection = conSQLcommSQL.CommandText ="Select au_lname,au_fname from authors"Dim datRead As SqlClient.SqlDataReaderdatRead = commSQL.ExecuteReader( )Do Until datRead.Read = False
MessageBox.Show(datRead.GetString(1) & " " _& datRead.GetString(0))
Loop datRead.Close( )
DataReaderDataReaderDataReaderDataReader
La classe DataSetLa classe DataSetLa classe DataSetLa classe DataSet
• E’ un contenitore disconnessoE’ un contenitore disconnesso• E’ assimilabile ad un “vettore di matrici”E’ assimilabile ad un “vettore di matrici”• Permette di specificare vincoli e relazioni Permette di specificare vincoli e relazioni
tra i dati contenutitra i dati contenuti• E’ accessibile in scritturaE’ accessibile in scrittura• Permette di propagare le modifiche su un Permette di propagare le modifiche su un
DBDB• Supporta nativamente la Supporta nativamente la
(de)serializzazione in formato XML(de)serializzazione in formato XML
• E’ un contenitore disconnessoE’ un contenitore disconnesso• E’ assimilabile ad un “vettore di matrici”E’ assimilabile ad un “vettore di matrici”• Permette di specificare vincoli e relazioni Permette di specificare vincoli e relazioni
tra i dati contenutitra i dati contenuti• E’ accessibile in scritturaE’ accessibile in scrittura• Permette di propagare le modifiche su un Permette di propagare le modifiche su un
DBDB• Supporta nativamente la Supporta nativamente la
(de)serializzazione in formato XML(de)serializzazione in formato XML
La classe DataSetLa classe DataSetLa classe DataSetLa classe DataSet
ConstraintsConstraints ConstraintConstraint
ColumnsColumns ColumnColumn
DataSetDataSet
TablesTables TableTable
Oggetto
Collezione
RelationsRelations RelationRelation
RowsRows RowRow
Popolare un DataSetPopolare un DataSetPopolare un DataSetPopolare un DataSet
• Popolare un DataSet accedendo ad un RDBMSPopolare un DataSet accedendo ad un RDBMS
• Creare un DataSet in via programmaticaCreare un DataSet in via programmatica
• Popolare un DataSet accedendo ad un RDBMSPopolare un DataSet accedendo ad un RDBMS
• Creare un DataSet in via programmaticaCreare un DataSet in via programmatica
Dim adaptSQL As New SqlClient.SqlDataAdapter( _"Select * from authors", conSQL)
Dim datPubs As DataSet = New DataSet( )adaptSQL.Fill(datPubs, "NewTable")
Dim adaptSQL As New SqlClient.SqlDataAdapter( _"Select * from authors", conSQL)
Dim datPubs As DataSet = New DataSet( )adaptSQL.Fill(datPubs, "NewTable")
Dim datPubs As New DataSet( )Dim tblAuthors As DataTable = New DataTable("authors")tblAuthors.Columns.Add("AuthorID", System.Type.GetType _ ("System.Int32"))
Dim datPubs As New DataSet( )Dim tblAuthors As DataTable = New DataTable("authors")tblAuthors.Columns.Add("AuthorID", System.Type.GetType _ ("System.Int32"))
La classe DataAdapterLa classe DataAdapterLa classe DataAdapterLa classe DataAdapter• E’ il collegamento tra il “mondo” connesso e E’ il collegamento tra il “mondo” connesso e
quello disconnessoquello disconnesso• Può “riempire” un dataSet avvalendosi di una Può “riempire” un dataSet avvalendosi di una
connessione connessione chiusachiusa
• E’ il collegamento tra il “mondo” connesso e E’ il collegamento tra il “mondo” connesso e quello disconnessoquello disconnesso
• Può “riempire” un dataSet avvalendosi di una Può “riempire” un dataSet avvalendosi di una connessione connessione chiusachiusa
Dim adaptSQL As New SqlClient.SqlDataAdapter( _"Select * from authors", conSQL)
Dim datPubs As New DataSet( )adaptSQL.Fill(datPubs, "miaTabella")
' Accesso ai dati
adaptSQL.Update (datPubs, "miaTabella")
Dim adaptSQL As New SqlClient.SqlDataAdapter( _"Select * from authors", conSQL)
Dim datPubs As New DataSet( )adaptSQL.Fill(datPubs, "miaTabella")
' Accesso ai dati
adaptSQL.Update (datPubs, "miaTabella")
DataSet multi TabellaDataSet multi TabellaDataSet multi TabellaDataSet multi Tabella• Creare la prima tabellaCreare la prima tabella
• Creare le tabelle successiveCreare le tabelle successive
• Creare la prima tabellaCreare la prima tabella
• Creare le tabelle successiveCreare le tabelle successive
Dim mySqlDataAdapter As New SqlDataAdapter( "select * from customers", mySqlConnection) Dim myDataSet As New DataSet() mySqlDataAdapter.Fill(myDataSet, "Customers")
Dim mySqlDataAdapter As New SqlDataAdapter( "select * from customers", mySqlConnection) Dim myDataSet As New DataSet() mySqlDataAdapter.Fill(myDataSet, "Customers")
mySqlDataAdapter.SelectCommand.CommandText = "select * from orders"mySqlDataAdapter.Fill(myDataSet,"Orders")
mySqlDataAdapter.SelectCommand.CommandText = "select * from orders"mySqlDataAdapter.Fill(myDataSet,"Orders")
Orders
CustomersDataSet:
Data Tables
La classe DataTableLa classe DataTableLa classe DataTableLa classe DataTable
Ogni elemento della proprietà Ogni elemento della proprietà TablesTables è una è una istanza della classe istanza della classe DataTableDataTable
La classe La classe DataTableDataTable espone le proprietà: espone le proprietà:– Columns: è una collezione di istanze di Columns: è una collezione di istanze di
DataColumnDataColumn– Rows: è una collezione di istanze della classe Rows: è una collezione di istanze della classe
DataRowDataRow– Una istanza della classe DataRow:Una istanza della classe DataRow:
• Mette a disposizione il contenuto delle proprie Mette a disposizione il contenuto delle proprie colonne mediante la proprietà colonne mediante la proprietà ItemItem
Ogni elemento della proprietà Ogni elemento della proprietà TablesTables è una è una istanza della classe istanza della classe DataTableDataTable
La classe La classe DataTableDataTable espone le proprietà: espone le proprietà:– Columns: è una collezione di istanze di Columns: è una collezione di istanze di
DataColumnDataColumn– Rows: è una collezione di istanze della classe Rows: è una collezione di istanze della classe
DataRowDataRow– Una istanza della classe DataRow:Una istanza della classe DataRow:
• Mette a disposizione il contenuto delle proprie Mette a disposizione il contenuto delle proprie colonne mediante la proprietà colonne mediante la proprietà ItemItem
Usare una DataTable: un Usare una DataTable: un esempioesempio
Usare una DataTable: un Usare una DataTable: un esempioesempio
Dim numeroRighe As Int32 = unaTabella.Rows.CountDim indiceRiga As Int32Dim unaRiga As DataRow
For indiceRiga = 0 To numeroRighe - 1unaRiga = unaTabella.Rows(indiceRiga)Dim nomeAutore As String = _
unaRiga.Item("au_fname").ToString()Next
Dim numeroRighe As Int32 = unaTabella.Rows.CountDim indiceRiga As Int32Dim unaRiga As DataRow
For indiceRiga = 0 To numeroRighe - 1unaRiga = unaTabella.Rows(indiceRiga)Dim nomeAutore As String = _
unaRiga.Item("au_fname").ToString()Next
DataSetDataSetDataSetDataSet
DataSet: le RelazioniDataSet: le RelazioniDataSet: le RelazioniDataSet: le Relazioni
• La classe DataSet espone la proprietà La classe DataSet espone la proprietà Relations, che è una collezione di istanze Relations, che è una collezione di istanze della classe DataRelationdella classe DataRelation
• Un oggetto DataRelation:Un oggetto DataRelation:– Definisce una associazione tra le colonne di Definisce una associazione tra le colonne di
differenti DataTabledifferenti DataTable– definisce una associazione orientata alla definisce una associazione orientata alla
navigazione sui datinavigazione sui dati– NON costituisce una constraintNON costituisce una constraint
• La classe DataSet espone la proprietà La classe DataSet espone la proprietà Relations, che è una collezione di istanze Relations, che è una collezione di istanze della classe DataRelationdella classe DataRelation
• Un oggetto DataRelation:Un oggetto DataRelation:– Definisce una associazione tra le colonne di Definisce una associazione tra le colonne di
differenti DataTabledifferenti DataTable– definisce una associazione orientata alla definisce una associazione orientata alla
navigazione sui datinavigazione sui dati– NON costituisce una constraintNON costituisce una constraint
Usare le Relazioni con i Usare le Relazioni con i DataSetDataSet
Usare le Relazioni con i Usare le Relazioni con i DataSetDataSet
• Creare relazioniCreare relazioni
• Accedere ai dati associatiAccedere ai dati associati
• Creare relazioniCreare relazioni
• Accedere ai dati associatiAccedere ai dati associati
Dim relPubsTitle As New DataRelation("PubsTitles", _datPubs.Tables("Publishers").Columns("pub_id"), _datPubs.Tables("Titles").Columns("pub_id"))
datPubs.Relations.Add(relPubsTitle)
Dim relPubsTitle As New DataRelation("PubsTitles", _datPubs.Tables("Publishers").Columns("pub_id"), _datPubs.Tables("Titles").Columns("pub_id"))
datPubs.Relations.Add(relPubsTitle)
Dim PubRow, TitleRow As DataRow, TitleRows( ) As DataRow
PubRow = datPubs.Tables("Publishers").Rows(0)TitleRows = PubRow.GetChildRows("PubsTitles")
Dim PubRow, TitleRow As DataRow, TitleRows( ) As DataRow
PubRow = datPubs.Tables("Publishers").Rows(0)TitleRows = PubRow.GetChildRows("PubsTitles")
Usare ConstraintUsare ConstraintUsare ConstraintUsare ConstraintIl supporto alle constraint della classe DataSet Il supporto alle constraint della classe DataSet
permette di:permette di:– Creare constraintCreare constraint
• Classe ForeignKeyConstraintsClasse ForeignKeyConstraints• Classe UniqueConstraintsClasse UniqueConstraints
– Usare le constraint esistenti nel DBUsare le constraint esistenti nel DB
Il supporto alle constraint della classe DataSet Il supporto alle constraint della classe DataSet permette di:permette di:– Creare constraintCreare constraint
• Classe ForeignKeyConstraintsClasse ForeignKeyConstraints• Classe UniqueConstraintsClasse UniqueConstraints
– Usare le constraint esistenti nel DBUsare le constraint esistenti nel DB
adaptSQL = New SqlClient.SqlDataAdapter("Select title_id" _& ", title, type, price from titles", conSQL)
adaptSQL.FillSchema(datPubs, schematype.Source, "Titles")adaptSQL.Fill(datPubs, "Titles")'Operazioni sui datiadaptSQL.Fill(datPubs, "Titles")
adaptSQL = New SqlClient.SqlDataAdapter("Select title_id" _& ", title, type, price from titles", conSQL)
adaptSQL.FillSchema(datPubs, schematype.Source, "Titles")adaptSQL.Fill(datPubs, "Titles")'Operazioni sui datiadaptSQL.Fill(datPubs, "Titles")
Integrità ReferenzialeIntegrità ReferenzialeIntegrità ReferenzialeIntegrità Referenziale
Una constraint ForeignKeyConstraint:Una constraint ForeignKeyConstraint:– permette l’integrità referenzialepermette l’integrità referenziale
• Se la proprietà EnforceConstraints del DataSet è impostata Se la proprietà EnforceConstraints del DataSet è impostata a Truea True
– Determina le azioni effettuate nelle tabelle correlateDetermina le azioni effettuate nelle tabelle correlate• Proprietà DeleteRule e UpdateRuleProprietà DeleteRule e UpdateRule
Una constraint ForeignKeyConstraint:Una constraint ForeignKeyConstraint:– permette l’integrità referenzialepermette l’integrità referenziale
• Se la proprietà EnforceConstraints del DataSet è impostata Se la proprietà EnforceConstraints del DataSet è impostata a Truea True
– Determina le azioni effettuate nelle tabelle correlateDetermina le azioni effettuate nelle tabelle correlate• Proprietà DeleteRule e UpdateRuleProprietà DeleteRule e UpdateRule
AzioneAzioneAzioneAzione DescrizioneDescrizioneDescrizioneDescrizione
CascadeCascade Cancella o aggiorna le righe correlate. E’ il default.Cancella o aggiorna le righe correlate. E’ il default.
SetNullSetNull Imposta a DBNull il valore delle righe correlate.Imposta a DBNull il valore delle righe correlate.
SetDefaultSetDefault Imposta al DefaultValue il valore delle righe correlate.Imposta al DefaultValue il valore delle righe correlate.
NoneNone Nessuna azione/modifica, viene sollevata una eccezione.Nessuna azione/modifica, viene sollevata una eccezione.
DataRelationDataRelationDataRelationDataRelation
Modificare i DatiModificare i DatiModificare i DatiModificare i Dati
• Aggiungere righeAggiungere righe
• Modificare righeModificare righe
• Cancellare righeCancellare righe
• Aggiungere righeAggiungere righe
• Modificare righeModificare righe
• Cancellare righeCancellare righe
Dim drNewRow As DataRow = datPubs.Tables("Titles").NewRow 'Populate columnsdatPubs.Tables("Titles").Rows.Add(drNewRow)
Dim drNewRow As DataRow = datPubs.Tables("Titles").NewRow 'Populate columnsdatPubs.Tables("Titles").Rows.Add(drNewRow)
drChangeRow.BeginEdit( )drChangeRow("Title") = drChangeRow("Title").ToString & " 1"drChangeRow.EndEdit( )
drChangeRow.BeginEdit( )drChangeRow("Title") = drChangeRow("Title").ToString & " 1"drChangeRow.EndEdit( )
datPubs.Tables("Titles").Rows.Remove(drDelRow)datPubs.Tables("Titles").Rows.Remove(drDelRow)
Aggiornare il databaseAggiornare il databaseAggiornare il databaseAggiornare il database• Possiamo ripercuotere le modifiche effettuate al DataSet Possiamo ripercuotere le modifiche effettuate al DataSet
sul DB:sul DB:– Esplicitando il comando di aggiornamentoEsplicitando il comando di aggiornamento
• Generando automaticamente il comando di updateGenerando automaticamente il comando di update
• Possiamo ripercuotere le modifiche effettuate al DataSet Possiamo ripercuotere le modifiche effettuate al DataSet sul DB:sul DB:– Esplicitando il comando di aggiornamentoEsplicitando il comando di aggiornamento
• Generando automaticamente il comando di updateGenerando automaticamente il comando di update
Dim comm As New SqlClient.SqlCommand("Insert titles" & _"(title_id, title, type) values(@t_id,@title,@type)")comm.Parameters.Add("@t_id",SqlDbType.VarChar,6,"title_id")comm.Parameters.Add("@title",SqlDbType.VarChar,80,"title")comm.Parameters.Add("@type",SqlDbType.Char,12,"type")adaptSQL.InsertCommand = commadaptSQL.Update(datPubs, "titles")
Dim comm As New SqlClient.SqlCommand("Insert titles" & _"(title_id, title, type) values(@t_id,@title,@type)")comm.Parameters.Add("@t_id",SqlDbType.VarChar,6,"title_id")comm.Parameters.Add("@title",SqlDbType.VarChar,80,"title")comm.Parameters.Add("@type",SqlDbType.Char,12,"type")adaptSQL.InsertCommand = commadaptSQL.Update(datPubs, "titles")
Dim sqlCommBuild As New SqlCommandBuilder(adaptSQL)MsgBox(sqlCommBuild.GetInsertCommand.CommandText)adaptSQL.Update(datPubs, "titles")
Dim sqlCommBuild As New SqlCommandBuilder(adaptSQL)MsgBox(sqlCommBuild.GetInsertCommand.CommandText)adaptSQL.Update(datPubs, "titles")
LinksLinksLinksLinks
http://www.ugidotnet.org
http://forum.ugidotnet.org
http://mobile.ugidotnet.org
Top Related