INTERROGAZIONE TABELLA SQL

giovedì 26 novembre 2009 - 13.13

Stecra63 Profilo | Newbie

Ciao a tutti,

è da poco tempo che mi sono avvicinato al visual studio ed ho un pò di problemi nella gestione di un db (sql server).
Uso visual studio 2008 (C#).
Ho creato una form per la gestione del db.
Ho creato una tabella di nome Anagrafica_società con vari campi.
Ho posto id società (campo) chiave primaria ed ho impostato come UNIQUE il campo PartitaIva (PI) (voglio che il dato PI sia unico).
Voglio però fare un controllo di unicità prima di fare l'INSERT dei dati (che produrrebbe errore in caso di duplicazione dato) per produrre io eventualmente mssagggio di PI già esistente.
Ho scritto il codice seguente:

//Crea connessione
SqlConnection connessione_tabella = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Programma Telefonia\\Telefonia\\Telefonia\\Telefonia\\Database1.mdf;Integrated Security=True;User Instance=True");
connessione_tabella.Open();

// in textBox2.Text viene inserita la partita iva
string partita_iva_inserita = textBox2.Text;
//stringa sql di controllo
string sql = "SELECT COUNT(*) FROM Anagrafica_società WHERE PartitaIva='partita_iva_inserita' ";


A questo punto dovrei verificare l'evetuale presenza della partita iva ma non riesco a scrivere il codice corretto.
Ho fatto:
SqlCommand Cmd = new SqlCommand(sql, connessione_tabella);
Int32 COUNT = (Int32) Cmd.ExecuteScalar();


if(COUNT != 0)
MessageBox.Show("ATTENZIONE: PARTITA IVA GIA' ESISTENTE ", "DATI INCOMPLETI ", MessageBoxButtons.OK, MessageBoxIcon.Error);

Qui count mi risulta sempre 0.
Ho fatto prove in debug inserendo stessa PI ma niente da fare.
l'if non viene eseguito
else
{
.........................
SqlCommand comando = new SqlCommand("insert into Anagrafica_società (NomeSocietà, PartitaIva,RappresentanteLegale,ViaSedeLegale,Città,CAP,Provincia) values " +
"('" + textBox1.Text + " ','" + textBox2.Text + " ','" + textBox3.Text + " ',' " + textBox4.Text + " ','" + textBox5.Text + " ','" + textBox6.Text + " ','" + listBox1.Text + " ')", connessione_tabella);

comando.ExecuteNonQuery();

Quì chiaramente errore duplicazione campo UNIQUE

connessione_tabella.Close();
Close();
}
Non funziona

Dov'è che non và?

Grazie a tutti

Stefano

AntCiar Profilo | Expert

Ciao.

Ecco il codice che puoi utilizzare per interrogare velocemente il database (è scritto in C#)

Ho utilizzato la classe 'System.Data.OleDb' e con questa classe puoi connetterti a database Access
se poi devi connetterti a SQLServer puoi sostituire gli oggetti 'System.Data.OleDb' con quelli della classe 'System.Data.SqlClient'


spero ti sia di aiuto
ciao
-----------------------------------------------------------------


DataTable table = new DataTable();
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
conn.Open();

conn.ConnectionString = "";//Qui ci metti la stringa di connessione al db
System.Data.OleDb.OleDbDataAdapter DA = new System.Data.OleDb.OleDbDataAdapter();
DA.SelectCommand = new System.Data.OleDb.OleDbCommand();
DA.SelectCommand.Connection = conn;
DA.SelectCommand.CommandText = "SELECT * FROM Anagrafica_società WHERE PartitaIva='partita_iva_inserita'";
DA.SelectCommand.CommandType = CommandType.Text;
DA.Fill(table);

if (table != null)
{
if (table.Rows.Count == 0)
{
//qui ci viene se non esistono già valori di partita iva
}
else
{

}
table.Dispose();
table = null;
}

----------------------------------------

Cristian Barca

Stecra63 Profilo | Newbie

Ciao,

ho modificato le istruzioni come di seguito:

DataTable table = new DataTable();
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection();

conn.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Programma Telefonia\\Telefonia\\Telefonia\\Telefonia\\Database1.mdf;Integrated Security=True;User Instance=True";//Qui ci metti la stringa di connessione al db

conn.Open();

System.Data.SqlClient.SqlDataAdapter DA = new System.Data.SqlClient.SqlDataAdapter();
DA.SelectCommand = new System.Data.SqlClient.SqlCommand();
DA.SelectCommand.Connection = conn;
DA.SelectCommand.CommandText = "SELECT * FROM Anagrafica_società WHERE PartitaIva='partita_iva_inserita'";
DA.SelectCommand.CommandType = CommandType.Text;
DA.Fill(table);

//verifico se trovate tuple
if(table != null)
//{
// if (table.Rows.Count != 0)
{
//qui ci viene se esistono già valori di partita iva
MessageBox.Show("ATTENZIONE: PARTITA IVA GIA' ESISTENTE ", "DATI INCOMPLETI ", MessageBoxButtons.OK, MessageBoxIcon.Error);
table.Dispose();
table = null;
//}

table != null mi risulta sempre sia con PI già presente che non

Con table.Rows.Count != 0 come controllo mi risulta count = 0 sempre.

Quindi la procedura non funziona.
Dovè che sbaglio?

Grazie dell'aiuto

AntCiar Profilo | Expert

ciao

allora dopo che cotrolli " if (table != null) " aggiungi all'interno dell' if l'istruzione "MessageBox.Show(table.Columns.count.ToString());"

se nella messageBox ti dice che ci sono colonne (numero <> da 0) allora vuol dire che l'istruzione SQL che utilizzi è corretta ma il parametro di filtro (WHERE) è sbagliato e quindi non ti restiuisce niente e per te è come se l'aliquota iva non esistesse.




Cristian Barca

Stecra63 Profilo | Newbie

Ciao

ho provato ed il messaggio di dice 8 ma la tabella è quasi vuota, ci sono solo 3 tuple ed una sola PI ugale a quella inserita.
Perchè mi dice 8?
Grazie

AntCiar Profilo | Expert

ciao.

Allora il numero 8 che ti da nel messaggio indica il numero di colonne della tabella. Siccome hai fatto una "SELECT * FROM ..." ti carica tutte le colonne della tabella.

Quello che mi risulta strano sono i dati restituiti. Tu dici che fra le righe c'è anche quello che stai cercando. In questo caso il problema sta nel modo di ricercare il dati (WHERE .... ). Di che tipo è il campo su cui fai: "WHERE campo = 'valore'"?
Cristian Barca

Stecra63 Profilo | Newbie

Ciao,

scusa forse ho capito con il messaggio verifico se la procedura rileva tutte le colonne (che effettivamente sono 8!)

Allora: La Tabella è Anagrafica_società e la PI viene inserita nella colonna PartitaIva.
Ho una textBox2 che utilizzo nella form dove scrivo la PI, ed ho fatto:

string partita_iva_inserita = textBox2.Text;
"SELECT * FROM Anagrafica_società WHERE PartitaIva='partita_iva_inserita'"

Dov'è l'errore nella where?
Grazie

AntCiar Profilo | Expert

ciao.

la corretta composizione della stringa è questa:

string partita_iva_inserita = textBox2.Text;

nel caso in cui i valori che inserisci nella textbox NON CONTERRANNO MAI l'apice singolo o il doppio apice (shift + 2) allora puoi scrivere quella che segue:

"SELECT * FROM Anagrafica_società WHERE PartitaIva= '" + partita_iva_inserita + "';";

altrimenti se vuoi stare sicuro puoi inserire quella che segue che ti permette di poter inserire nella textbox anche un apice singolo:

"SELECT * FROM Anagrafica_società WHERE PartitaIva= " + char.ConvertFromUtf32(34).ToString() + partita_iva_inserita + char.ConvertFromUtf32(34).ToString() + ";";

io ti consiglio di mettere la seconda così stai tranquillo.

ciao
Cristian Barca

SSUPERPIPPO Profilo | Guru

Ti consiglio di usare i parametri e vai sempre sul sicuro...

Esempio di utilizzo:

# SqlCmd.CommandText = "SELECT * FROM TuaTabella WHERE Campo=@Valore";
# SqlCmd.Parameters.AddWithValue("@Valore", ValoreParametro);

http://blogs.dotnethell.it/alebadalin
http://acquariochepassione.blogspot.com/

Stecra63 Profilo | Newbie



Ciao,

grazie dei consigli, anche a SSUPERPIPPO.
Tutto funziona correttamente.
Funziona anche la mia versione basta modificare la stringa SELECT come me l'hai data tu.


Alla prossima
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5