Esempi di query SQL al database MySQL. Nozioni di base su T-SQL. Query DML SQL per inserire record dal file

L'istruzione INSERT inserisce nuovi record in una tabella. In questo caso, i valori delle colonne possono essere costanti letterali o essere il risultato dell'esecuzione di una sottoquery. Nel primo caso, viene utilizzata un'istruzione INSERT separata per inserire ciascuna riga; nel secondo caso verranno inserite tante righe quante sono quelle restituite dalla subquery.

La sintassi dell'operatore è la seguente:

    INSERIRE [ (,...) ]

    (VALORI(,…))

  1. | (VALORI STANDARD)

Come puoi vedere dalla sintassi presentata, l'elenco delle colonne è facoltativo (le parentesi quadre nella descrizione della sintassi lo indicano). Se manca, la lista dei valori inseriti deve essere completa, cioè fornire valori per tutte le colonne della tabella. In questo caso l'ordine dei valori deve corrispondere all'ordine specificato dall'istruzione CREATE TABLE per la tabella in cui sono inserite le righe. Inoltre, questi valori devono essere dello stesso tipo di dati delle colonne in cui vengono inseriti. Ad esempio, considera l'inserimento di una riga nella tabella Product creata dalla seguente istruzione CREATE TABLE:

    Prodotto CREA TABELLA

    carattere creatore (1) NON NULL,

    modello varchar(4) NOT NULL,

    digitare varchar(7) NOT NULL

Supponiamo di voler aggiungere il modello PC 1157 del produttore B a questa tabella. Ciò può essere fatto con la seguente istruzione:

    INSERIRE NEL Prodotto

    VALORI ("B" , 1157 , "PC" ) ;

Se specifichi un elenco di colonne, puoi modificare il loro ordine "naturale":

    INSERISCI IN Prodotto (tipo, modello, produttore)

    VALORI ("PC" , 1157 , "B" ) ;

Sembrerebbe che questa sia una caratteristica completamente inutile, che rende solo il design più ingombrante. Tuttavia, vince se le colonne hanno valori predefiniti. Consideriamo la seguente struttura della tabella:

    CREA TABELLA prodotto_D

    carattere creatore (1) NULL,

    modello varchar(4) NULL,

    digitare varchar (7 ) NOT NULL DEFAULT "PC"

Tieni presente che qui i valori di tutte le colonne hanno valori predefiniti (i primi due sono NULL e l'ultima colonna è di tipo - PC). Ora potremmo scrivere:

    INSERT INTO Product_D (modello, produttore)

    VALORI(1157, "B");

In questo caso, il valore mancante durante l'inserimento di una riga verrà sostituito dal valore predefinito - PC. Si noti che se a una colonna non viene assegnato un valore predefinito in un'istruzione CREATE TABLE e viene specificato un vincolo NOT NULL per vietare l'uso di NULL in quella colonna della tabella, viene assunto il valore predefinito NULL.

La domanda sorge spontanea: è possibile non specificare un elenco di colonne e utilizzare comunque i valori predefiniti? La risposta è si. Per fare ciò, invece di specificare esplicitamente il valore, utilizzare la parola riservata DEFAULT :

    INSERISCI IN Prodotto_D

    VALORI ("B" , 1158 , DEFAULT ) ;

Dato che tutte le colonne hanno valori predefiniti, per inserire una riga con valori predefiniti potresti scrivere:

    INSERISCI IN Prodotto_D

    VALORI(DEFAULT, DEFAULT, DEFAULT);

Tuttavia, per questo caso esiste una costruzione speciale VALORI DI DEFAULT (vedi sintassi dell'operatore), con la quale l'operatore di cui sopra può essere riscritto nella forma

    INSERISCI IN PRODOTTO_D VALORI PREDEFINITI;

Tieni presente che quando inserisci una riga in una tabella, vengono controllate tutte le restrizioni imposte su questa tabella. Potrebbero essere vincoli di chiave primaria o indice univoco, vincoli CHECK o vincoli di integrità referenziale. Se qualche vincolo viene violato l'inserimento della riga verrà rifiutato. Consideriamo ora il caso di utilizzo di una subquery. Supponiamo di dover inserire nella tabella Product_D tutte le righe della tabella Product relative ai modelli di personal computer (type = 'PC'). Poiché i valori di cui abbiamo bisogno sono già in qualche tabella, la generazione manuale delle righe inserite è, in primo luogo, inefficace e, in secondo luogo, può consentire errori di input. L'utilizzo di una sottoquery risolve questi problemi:

L'uso del simbolo “*” nella sottoquery è giustificato in questo caso, poiché l'ordine delle colonne è lo stesso per entrambe le tabelle. Se così non fosse, sarebbe necessario applicare un elenco di colonne nell'istruzione INSERT, nella sottoquery o in entrambe, che corrisponderebbe all'ordine delle colonne:

Qui, come prima, non puoi specificare tutte le colonne se desideri utilizzare i valori predefiniti esistenti, ad esempio:

In questo caso la colonna type della tabella Product_D verrà sostituita con il valore di default PC per tutte le righe inserite.

Tieni presente che quando si utilizza una sottoquery contenente un predicato, verranno inserite solo le righe per le quali il valore del predicato è TRUE (non UNKNOWN!). In altre parole, se la colonna type nella tabella Product fosse NULLable e il valore fosse presente in un numero di righe, tali righe non verrebbero inserite nella tabella Product_D.

La tecnica artificiale di utilizzare una sottoquery che forma una riga con la clausola UNION ALL consente di superare la limitazione sull'inserimento di una riga nell'istruzione INSERT quando si utilizza il costruttore di riga nella clausola VALUES. Quindi se dobbiamo inserire più righe utilizzando un'istruzione INSERT, possiamo scrivere:

    INSERISCI IN Prodotto_D

    SELEZIONARE produttore AS "B", modello 1158 AS, tipo AS "PC".

    UNIONE TUTTI

    SELEZIONA "C", 2190, "Laptop"

    UNIONE TUTTI

    SELEZIONARE "D", 3219, "Stampante";

L'utilizzo di UNION ALL è preferibile a UNION anche se è garantita l'assenza di righe doppie, poiché in questo caso non verrà effettuato alcun controllo per eliminare i duplicati.

Va notato che l'inserimento di più tuple utilizzando il costruttore di righe è già implementato in Sistema di gestione di database relazionali (DBMS), sviluppato da Microsoft Corporation.Structured Query Language) è un linguaggio informatico universale utilizzato per creare, modificare e manipolare dati in database relazionali. server SQL 2008. Data questa possibilità, l'ultima query può essere riscritta come:

    INSERISCI IN VALORI Prodotto_D

    ("B", 1158, "PC"),

    ("C", 2190, "Computer portatile"),

Eliminazione di voci

Per rimuovere record da una tabella, utilizzare l'operatore DELETE:

DELETE FROM Nome tabella WHERE condizione;

Questo operatore rimuove i record (non i singoli valori di colonna) dalla tabella specificata che soddisfano la condizione specificata. Una condizione è un'espressione logica, le cui varie costruzioni sono state discusse nei laboratori precedenti.

La seguente query elimina i record dalla tabella Customer in cui il valore della colonna LName è "Ivanov":

ELIMINA DA Cliente

DOVE LNome = "Ivanov"

Se la tabella contiene informazioni su più clienti con il cognome Ivanov, verranno tutti eliminati.

L'istruzione WHERE può contenere una sottoquery per la selezione dei dati (istruzione SELECT). Le sottoquery in un'istruzione DELETE funzionano esattamente come in un'istruzione SELECT. La query seguente rimuove tutti i client dalla città di Mosca, mentre l'identificatore univoco della città viene restituito utilizzando una sottoquery.

ELIMINA DA Cliente

WHERE IdCity IN (SELECT IdCity FROM Città WHERE CityName = "Mosca")

Transact-SQL estende l'SQL standard consentendo di utilizzare una clausola FROM aggiuntiva in un'istruzione DELETE. Questa estensione, che specifica un join, può essere utilizzata al posto di una sottoquery nella clausola WHERE per specificare le righe da eliminare. Ti consente di specificare i dati dal secondo FROM e rimuovere le righe corrispondenti dalla tabella nella prima clausola FROM. In particolare, la query precedente può essere riscritta come segue

ELIMINA DA Cliente

FROM Cliente k INNER JOIN

L'operazione di cancellazione di record da una tabella è pericolosa nel senso che comporta il rischio di perdita irreversibile dei dati in caso di errori semantici (ma non sintattici) nella formulazione dell'espressione SQL. Per evitare qualsiasi problema, prima di eliminare i record, si consiglia di eseguire innanzitutto la query di selezione appropriata per vedere quali record verranno eliminati. Quindi, ad esempio, prima di eseguire la query di eliminazione discussa in precedenza, non sarebbe male eseguire la query di selezione corrispondente.

SELEZIONARE *

FROM Cliente k INNER JOIN

Città c ON k.IdCity = c.IdCity AND c.CityName = "Mosca"

Per eliminare tutti i record da una tabella, utilizzare semplicemente l'istruzione DELETE senza la parola chiave WHERE. In questo caso la tabella stessa con tutte le colonne in essa definite viene salvata ed è pronta per l'inserimento di nuovi record. Ad esempio, la query seguente elimina i record per tutti i prodotti.

ELIMINA DA Prodotto

Incarico di lavoro autonomo: Formulare una query in SQL per eliminare tutti gli ordini che non contengono un singolo prodotto (ovvero tutti gli ordini vuoti).

Oltre all'istruzione SELECT discussa in precedenza, il Data Manipulation Language (DML) contiene altre tre istruzioni: INSERT, UPDATE e DELETE. Come l'istruzione SELECT, queste tre istruzioni operano su tabelle o viste. In questo articolo viene illustrata l'istruzione INSERT e le altre due istruzioni vengono discusse nell'articolo successivo.

INSERISCI dichiarazione inserisce righe (o parti di righe) in una tabella. Esistono due diverse forme di questa istruzione:

INSERISCI nome_scheda [(col_list)] VALORI PREDEFINITI | VALORI (( DEFAULT | NULL | espressione ) [ ,...n]) INSERT INTO nome_tab | view_name [(col_list)] (select_statement |execute_statement) Convenzioni di sintassi

La prima forma dell'istruzione permette di inserire una riga (o parte di essa) nella tabella. E la seconda forma dell'istruzione INSERT consente di inserire in una tabella il set di risultati di un'istruzione SELECT o di una procedura memorizzata eseguita da un'istruzione EXECUTE. La procedura memorizzata deve restituire i dati da inserire nella tabella. Se utilizzata con un'istruzione INSERT, un'istruzione SELECT può selezionare valori da una tabella diversa o dalla stessa tabella in cui vengono inseriti i dati, purché i tipi di dati delle colonne corrispondenti siano compatibili.

Per entrambi i moduli, il tipo di dati di ciascun valore inserito deve essere compatibile con il tipo di dati della colonna corrispondente della tabella. Tutte le stringhe e i dati temporanei devono essere racchiusi tra virgolette; Non è necessario che i valori numerici siano racchiusi tra virgolette.

Inserimento di una singola riga

Per entrambe le forme dell'istruzione INSERT, specificare esplicitamente l'elenco delle colonne è facoltativo. Non elencare le colonne equivale a specificare tutte le colonne nella tabella.

Parametro VALORI PREDEFINITI inserisce valori predefiniti per tutte le colonne. Le colonne con tipo di dati TIMESTAMP o proprietà IDENTITY vengono inserite per impostazione predefinita con valori generati automaticamente dal sistema. Per le colonne di altri tipi di dati, viene inserito il corrispondente valore predefinito non nullo, se disponibile, oppure NULL in caso contrario. Se una colonna non consente valori NULL e non ha un valore predefinito definito, l'istruzione INSERT fallisce e viene visualizzato un messaggio.

L'esempio seguente inserisce righe nella tabella Employee nel database SampleDb, dimostrando l'uso di un'istruzione INSERT per inserire una piccola quantità di dati nel database:

USA CampioneDb; INSERIRE NEI VALORI DEI Dipendenti (34990, "Andrey", "Batonov", "d1"); INSERIRE NEI VALORI DEI Dipendenti (38640, "Alexey", "Vasin", "d3");

Esistono due modi diversi per inserire valori in una nuova riga. L'istruzione INSERT nell'esempio seguente utilizza esplicitamente la parola chiave NULL e inserisce un valore NULL nella colonna corrispondente:

USA CampioneDb; INSERIRE NEI VALORI DEI Dipendenti (34991, "Andrey", "Batonov", NULL);

Per inserire valori in alcune (ma non tutte) colonne di una tabella, in genere è necessario specificare esplicitamente tali colonne. Le colonne non specificate devono consentire valori NULL o avere un valore predefinito definito.

USA CampioneDb; INSERISCI IN VALORI Dipendente (ID, Nome, Cognome) (34992, "Andrey", "Batonov");

I due esempi precedenti sono equivalenti. Nella tabella Employee, l'unica colonna che consente valori NULL è la colonna DepartmentNumber e tutte le altre colonne sono state disabilitate dalla clausola NOT NULL nell'istruzione CREATE TABLE.

Ordine dei valori in Offerta VALORI Le istruzioni INSERT possono differire dall'ordine specificato nell'istruzione CREATE TABLE. In questo caso, il loro ordine deve corrispondere all'ordine in cui le colonne corrispondenti sono elencate nell'elenco delle colonne. Di seguito un esempio di inserimento dei dati in un ordine diverso da quello originale:

USA CampioneDb; INSERT INTO Dipendente(NumeroDipartimento, Cognome, ID, Nome) VALORI ("d1", "Batonov", 34993, "Andrey");

Inserimento di più righe

La seconda forma dell'istruzione INSERT inserisce nella tabella una o più righe selezionate da una sottoquery. L'esempio seguente mostra come inserire righe in una tabella utilizzando la seconda forma dell'istruzione INSERT. In questo caso, viene eseguita una query per selezionare i numeri e i nomi dei dipartimenti situati a Mosca e il set di risultati risultante viene caricato in una nuova tabella creata in precedenza.

La nuova tabella MoscaDepartment creata nell'esempio precedente ha le stesse colonne della tabella Department esistente, ad eccezione della colonna Location mancante. La sottoquery nell'istruzione INSERT seleziona tutte le righe nella tabella Department per cui il valore della colonna Location è "Mosca", che vengono quindi inserite nella nuova tabella creata all'inizio della query.

L'esempio seguente mostra un altro modo per inserire righe in una tabella utilizzando la seconda forma dell'istruzione INSERT. In questo caso, viene eseguita una query per selezionare i numeri del personale, i numeri del progetto e le date di inizio del progetto per tutti i dipendenti con la posizione "Manager" che lavorano sul progetto p2 e quindi caricare il set di risultati risultante in una nuova tabella creata all'inizio di la domanda:

USA CampioneDb; CREATE TABLE ManagerTeam(EmpId INT NOT NULL, ProjectNumber CHAR (4) NOT NULL, EnterDate DATE); INSERISCI IN ManagerTeam (EmpId, ProjectNumber, EnterDate) SELEZIONA EmpId, ProjectNumber, EnterDate FROM Works_on DOVE Lavoro = "Manager";

Prima di inserire righe utilizzando l'istruzione INSERT, le tabelle MoscaDepartment e ManagerTeam (negli esempi precedenti) erano vuote. Se la tabella esistesse già e contenesse righe con dati, verrebbero aggiunte nuove righe.

Le query di modifica vengono utilizzate per aggiungere (INSERT INTO), eliminare (DELETE) e aggiornare (UPDATE) i record nelle tabelle.

comando INSERISCI IN

Il comando INSERT INTO può essere utilizzato per aggiungere uno o più record alla fine di una tabella.

La sintassi del comando INSERT INTO è la seguente:
INSERT INTO Nome_tabella [(Nome_campo)] VALORI (Valori_dati);

Ad esempio, posizioniamo nella tabella "Gruppi" un record contenente i dati (1, BF-16a, 1, 1) nelle colonne corrispondenti (Codice Gruppo, Nome, Insegnamento, Semestre).

Per fare ciò, richiedere nel formato:
INSERISCI IN Gruppi (Codice Gruppo, Titolo, Insegnamento, Semestre) VALORI (1, BF-16a, 1, 1);
inserire la query nel form eseguendo il comando "Query Builder" nella scheda "Creazione", in modalità "Modalità SQL" dal menu Visualizza.

Salva la richiesta con il nome "Add_1_records". Di conseguenza, un oggetto non correlato apparirà nell'“Area di navigazione” - “Add_1_records” (Fig. 1.).


Riso. 1.

Dopo aver salvato la richiesta, è necessario eseguirla facendo clic sull'icona "Esegui". A seguito dell'esecuzione del comando “Add_1_records”, nella tabella vuota apparirà il primo record (Fig. 2.)



Riso. 2.

comando AGGIORNA

Il comando UPDATE è progettato per modificare i record esistenti nelle colonne della tabella, consentendo di aggiornare i valori nelle colonne della tabella specificate.

La sintassi del comando UPDATE è la seguente:
UPDATE Nome_tabella SET Nome_colonna = Nuovo_valore WHERE Condizione_selezione;

La clausola SET specifica i nomi delle colonne i cui dati devono essere modificati. La clausola WHERE è facoltativa, ma può essere utilizzata per specificare solo le righe nelle colonne (tabelle) che devono essere aggiornate.

Creiamo una richiesta per modificare un record nella tabella "Gruppi" del database sql_training_st.mdb.

Ad esempio, modifichiamo una voce esistente per il primo ID del campo chiave nella colonna "Nome" della tabella "Gruppi".

Richiedi nel formato:
UPDATE Gruppi SET Nome ="BF-16b" WHERE ID=1;

Salvare la richiesta con il nome "Change_record_1". Di conseguenza, nell'“Area di transizione” apparirà l'oggetto “Change_record_1” (Fig. 3.).



Riso. 3.

Dopo aver salvato la richiesta, è necessario eseguirla facendo clic sull'icona "Esegui". In seguito all'esecuzione del comando “Change_record_1” apparirà una finestra di dialogo nella quale è necessario inserire il valore del parametro ID=1 e cliccare su OK. Dopo questi passaggi, nella tabella “Gruppi” la voce nel campo “Nome” cambierà da BF-16a a BF-16b (Fig. 4.).



Riso. 4.

Comando CANCELLA

Il comando DELETE è progettato per eliminare record da una tabella.

Formato di una richiesta di cancellazione di record:
DELETE FROM Nome_Tabella DOVE Selezione_Condizione;

Creiamo una richiesta per modificare un record nella tabella "Gruppi" del database sql_training_st.mdb.

Ad esempio, eliminiamo il record esistente per il primo ID campo chiave in tutte le colonne (campi) della tabella "Gruppi".

Per fare ciò, richiedere nel formato:
DELETE FROM Gruppi WHERE ID=1;
creare una query sul modulo eseguendo il comando "Query Builder" nella scheda "Creazione", in modalità "Modalità SQL" dal menu Visualizza.

Salviamo la richiesta con il nome “Delete_record_1”. Di conseguenza, nell'“Area di transizione” apparirà l'oggetto “Delete_record_1” (Fig. 5.).



Riso. 5.

Dopo aver salvato la richiesta, è necessario eseguirla facendo clic sull'icona "Esegui". A seguito dell'esecuzione del comando “Delete_record_1” apparirà una finestra di dialogo nella quale è necessario inserire il valore del parametro ID=1 e cliccare su OK. Dopo questi passaggi, si aprirà la finestra di dialogo "Conferma eliminazione dei record". Dopo la conferma, i dati in tutti i campi verranno cancellati nella tabella "Gruppi", ad es. la voce è stata cancellata (Fig. 6.).



Riso. 6.

Da notare che per cancellare dati in campi specifici di una tabella è consigliabile utilizzare il comando UPDATE e sostituire i valori nei campi obbligatori con Null. Se è necessario eliminare una tabella nel suo insieme, è necessario utilizzare l'operatore DROP TABLE (sintassi dell'operatore: DROP TABLE Nome_tabella;).

Ripristiniamo il primo record nella tabella "Gruppi" eseguendo il comando "Add_1_records", di conseguenza ripristineremo il primo record (Fig. 7.).



Riso. 7.

A volte, i programmatori hanno un ardente desiderio di leggere qualcosa dal database. I programmatori diventano nervosi e irritabili, perdono il sonno e puntano freneticamente le dita sulla tastiera. Per il bene di tutti e per la pace nel mondo, diamo un'occhiata ad alcune semplici operazioni di gestione dei database da C# utilizzando ADO.NET e OLE DB. Sebbene questo meccanismo supporti vari database come Oracle, qui e ora utilizzeremo MS SQL Server.

Due attività principali quando si lavora con un database

2. Esecuzione di un comando SQL che fa qualcosa sul server (inserisci, aggiorna, cancella, chiama una funzione o una procedura memorizzata

3. Lettura sequenziale dalla selezione selezionata riga per riga. Viene utilizzato principalmente nelle applicazioni web, nelle applicazioni desktop è più semplice scaricare l'intera selezione in una sola volta nella RAM, il risparmio derivante dalla lettura delle sole righe necessarie è trascurabile;

4. Caso raro. Aggiornamento automatico di una tabella nel database in base alle modifiche nel DataTable (solitamente modificato tramite un'interfaccia visiva). Nella vita reale, i dati vengono solitamente letti tramite una query o una vista di heap join complessa, pertanto la sincronizzazione automatica non è adatta.

Le classi principali utilizzate per questi scopi: OleDbConnection - una connessione al database, creata con una stringa contenente parametri di connessione, open, close, OleDbCommand - creata con un'istanza di connessione e un comando sql, se è necessario eseguire solo un aggiornamento o ottenere un singolo valore, allora questo è sufficiente classe, OleDbDataAdapter - creata con OleDbCommand, è specializzata nella lettura una tantum di set di righe in un DataTable, può creare automaticamente colonne DataTable in base a una selezione, trasferire modifiche dal DataTable a una tabella nel database, OleDbDataReader - lettura sequenziale delle righe in DataTable una alla volta (funziona internamente OleDbDataAdapter), DataTable / DataSet - il contenitore principale per i dati. L'enumerazione OleDbType archivia i tipi di dati del database.

Utilizzo di System.Data; utilizzando System.Data.OleDb; // stringa di connessione, viene utilizzato il sistema utente Windows (Integrated Security=SSPI;) string connString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=databaseName;Data Source=serverName"; // stringa di connessione alternativa utilizzando l'autenticazione MS SQL Server // connString = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=databaseName;Connect Timeout=20;Data Source=serverName;Uid=userName;Pwd=userPassword ; " OleDbConnection dbConn = nuovo OleDbConnection(connString); dbConn.Open(); alcuniDataTable = nuovo DataTable(); OleDbDataAdapter dbAdapter = new OleDbDataAdapter("seleziona COLUMN1, COLUMN2 da TEST_TABLE ORDER BY COLUMN2", dbConn); // la struttura interna di una tabella vuota verrà creata automaticamente in base ai dati letti se la struttura della tabella è già stata specificata (ad esempio tramite un DataSet tipizzato), allora i dati verranno scritti nelle colonne con nomi corrispondenti o nuovi; verranno aggiunte le colonne dbAdapter.Fill(someDataTable); // un'opzione alternativa per riempire una tabella in un DataSet // dbAdapter.Fill(someDataSet, "someDataTable"); dbConn.Close();

2. Esecuzione di un comando SQL che fa qualcosa sul server (inserisci, aggiorna, cancella, chiama una funzione o una procedura memorizzata.

Particolarmente degni di nota sono i problemi con le date. L'implementazione delle date in .Net è estremamente distorta: inizialmente le date non possono essere vuote, ma nella vita reale lo sono sempre. La soluzione più corretta è utilizzare una classe di data speciale, che corregge gli errori dei programmatori Microsoft. Gli sviluppatori più pigri mantengono tutte le date nel codice come stringhe e le convertono in DateTime solo quando necessario, ad esempio quando scrivono su un database o DataTable. Nullable DateTime non aiuta, poiché una data vuota nell'interfaccia dovrebbe apparire come una stringa vuota e, quando scritta nel database come DBNull.Value, anche un banale null nel codice non viene convertito in questi valori senza ulteriore danza con un tamburello.

La prima opzione prevede semplicemente l'unione di una stringa di query. Considerata una cattiva pratica e particolarmente pericolosa nelle applicazioni web in quanto vulnerabile agli attacchi degli hacker. Il problema con le date vuote non è così semplice da risolvere. Inoltre, quando si lavora con le date, appare un ulteriore problema: diversi formati di stringhe di data a seconda delle impostazioni regionali di .Net Framework, dell'ambiente di sviluppo e del server SQL. Può sembrare surreale: la stessa query funziona in SQL Management Studio, ma si blocca se eseguita dal codice. Parzialmente salvato dal formato speciale della stringa della data. Tuttavia, ciò avviene spesso in piccoli programmi per uso interno, della cui esistenza il mondo esterno non verrà mai a conoscenza.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERISCI IN TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALORI (" + intVariable", " + stringVariable" , " + dateTimeVariable.ToString("aaaaMMgg") +"); dbCommand.ExecuteNonQuery();

L'opzione corretta prevede la creazione di un comando con un set di parametri fortemente tipizzati. Considera che il paragrafo precedente non esisteva.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERISCI VALORI IN TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) (?, ?, ?)"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; dbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar).Value = stringVariable; if (stringDate == "") ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbType.DateTime).Value = DBNull.Value; ) else ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbType.DateTime).Value = Convert.ToDateTime(stringDate); dbCommand.ExecuteNonQuery();

La procedura memorizzata viene richiamata esattamente allo stesso modo, per ragioni di diversità esiste un'altra opzione per scrivere valori nei parametri (non è correlata specificamente alla procedura memorizzata):

OleDbCommand someDbComm = new OleDbCommand("someStoredProcedure", this.dbConn); someDbComm.CommandType = CommandType.StoredProcedure; someDbComm.Parameters.Add("@parametro1", OleDbType.VarChar); someDbComm.Parameters.Add("@parametro2", OleDbType.VarChar); someDbComm.Parameters.Value = "Ogni problema ha sempre una soluzione: semplice, conveniente e, ovviamente, sbagliata"; someDbComm.Parameters.Value = "Henry Louis Mencken"; someDbComm.ExecuteNonQuery(); !}

Una versione estesa della descrizione del parametro che indica la dimensione del campo e l'associazione a una colonna specifica della tabella.

DbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar, 100, "VARCHAR_COLUMN").Valore = stringVariable;

Se non è necessario associare un parametro di comando a un campo DataTable specifico, è meglio non specificare affatto la dimensione, ad esempio, se la stringa è inferiore alla lunghezza Varchar specificata, il buon framework .Net aggiungerà spazi alla stringa fino alla lunghezza specificata, corrompendo i dati trasmessi al server.

Il valore di un singolo campo viene letto dal metodo ExecuteScalar()

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "SELEZIONA TEST_COLUMN DA TEST_TABLE DOVE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; int risultato = Convert.ToInt32(dbCommand.ExecuteScalar());

Va notato in particolare che ExecuteScalar restituisce Object e se la richiesta non ha restituito nulla, il risultato sarà nullo e la conversione in un tipo di dati normale fallirà con un errore. Se è possibile una situazione in cui non otteniamo nulla in risposta, allora dobbiamo fare questo:

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "SELEZIONA TEST_COLUMN DA TEST_TABLE DOVE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; oggetto risultatoObj = dbCommand.ExecuteScalar() int risultato = -1; // valore predefinito che significa risultato vuoto if(resultObj != null) ( result = Convert.ToInt32(dbCommand.ExecuteScalar()); )

3. Lettura sequenziale dalla selezione selezionata riga per riga
Lettura di una riga (più righe vengono lette in un ciclo);

OleDbCommand dbCommand = nuovo OleDbCommand(seleziona PERSON_ID, NOME, COGNOME da TEST_TABLE, dbConn); OleDbDataReader dbReader = dbCommand.ExecuteReader(); dbReader.Read(); nome stringa = Convert.ToString(dbReader["NOME"]); string cognome = Convert.ToString(dbReader["COGNOME"]); dbReader.Close();

4. Caso raro. Aggiornamento automatico di una tabella nel database in base alle modifiche nel DataTable (solitamente modificato tramite un'interfaccia visiva).

È necessario scrivere quattro comandi per DbAdapter per ogni caso possibile: seleziona, inserisci, aggiorna, elimina.

DbAdapter.InsertCommand = new OleDbCommand("inserisci in TEST_TABLE (NAME, FAMIL, AGE) valori (?, ?, ?)", dbConnection); dbAdapter.InsertCommand.Parameters.Add("NOME", OleDbType.VarChar, 100, "NOME"); dbAdapter.InsertCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); // per tipi di dati con lunghezza costante, la lunghezza specificata nel comando viene ignorata dbAdapter.InsertCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); // aggiunge un comando di aggiornamento dbAdapter.UpdateCommand = new OleDbCommand("update TEST_TABLE set NAME = ?, FAMIL = ?, AGE = ? where ID = ?, dbConnection); dbAdapter.UpdateCommand.Parameters.Add("NOME", OleDbType.VarChar,100, "NOME"); dbAdapter.UpdateCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); dbAdapter.UpdateCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); dbAdapter.UpdateCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); // aggiunge un comando di eliminazione dbAdapter.DeleteCommand = new OleDbCommand("elimina da TEST_TABLE dove ID = ?", dbConnection); dbAdapter.DeleteCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); try ( // trasferisce tutte le modifiche dal DataTable alla tabella nel database dbAdapter.Update(table); ) catch (Errore eccezione) ( MessageBox.Show("Errore durante il salvataggio dei dati!" + error.Message); return; ) MessageBox Mostra("Modifiche salvate!");




Superiore