Passaggio da access a sql server client 2005

domenica 08 aprile 2007 - 11.02

mortenera Profilo | Junior Member

fino ad oggi ho sempre usato access con visual.net con i classici componenti adattatore e dataset facendo delle query tipo select nome from anag where '"& textbox1.text &"' .
Adesso sono passato a vb2005, ho creato db con sql server 2005 creo il table adapter e il dataset , reieco a fare l'inserimento di nuove record ma non riesco a fare le query di confronto come facevo prima, mi sapete dire come fare.


ad esempio inserisco l'anagrfica di un cliente mario rossi , vorrei creare una query di ricerca per trovare se nel db e gia presente un mario rossi per non farmelo inserire 2 volte

alx_81 Profilo | Guru

>fino ad oggi ho sempre usato access con visual.net con i classici
>componenti adattatore e dataset facendo delle query tipo select
>nome from anag where '"& textbox1.text &"' .
>Adesso sono passato a vb2005, ho creato db con sql server 2005
>creo il table adapter e il dataset , reieco a fare l'inserimento
>di nuove record ma non riesco a fare le query di confronto come
>facevo prima, mi sapete dire come fare.

Ciao!
Il modo di operare che hai sempre seguito, è piuttosto pericoloso.. dai infatti via libera ai malintenzionati..
La concatenazione dei valori rende possibile quello che in gergo si chiama SQL injection.
Chi naviga potrebbe creare dei comandi SQL tali da modificare o anche distruggere (se la sicurezza sul database non è stata configurata correttamente) la tua base dati. Passando a SQL Server hai la possibilità di utilizzare strutture che ti permettono di evitare questo problema. Ad esempio ci sono le Stored Procedure, vere e proprie procedure che, oltre che consentirti logiche di programmazione, ti permettono un maggiore livello di sicurezza, evitando comunque il SQL injection.
leggiti questi link

Stored Procedure Basics
http://msdn2.microsoft.com/en-us/library/ms191436.aspx

CREATE PROCEDURE
http://msdn2.microsoft.com/en-us/library/ms187926.aspx
>
>
>ad esempio inserisco l'anagrfica di un cliente mario rossi ,
>vorrei creare una query di ricerca per trovare se nel db e gia
>presente un mario rossi per non farmelo inserire 2 volte
Passando alla tua stored procedure i dati (come ad esempio il nome/cognome) puoi pensare di fare al suo interno una cosa simile a questa:

immagina di avere una tabella come la seguente (molto semplificata):

CREATE TABLE Anagrafica ( Id int IDENTITY(1,1) NOT NULL, Nome varchar(30) NOT NULL, Cognome varchar(50) NOT NULL, DataNascita smalldatetime NOT NULL )

ed ora la stored procedure:

CREATE PROCEDURE proc_InsertUtente @Nome varchar(30), @Cognome varchar(50), @DataNascita smalldatetime AS BEGIN IF NOT EXISTS (SELECT * FROM Anagrafica WHERE Nome = @Nome AND Cognome = @Cognome) BEGIN INSERT INTO Anagrafica (Nome, Cognome, DataNascita) VALUES (@Nome, @Cognome, @DataNascita) END ELSE RAISERROR 50000 'Nome già presente in tabella Anagrafica' END

questo è un semplice esempio di come gestire il tuo problema..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

mortenera Profilo | Junior Member

ti ringrazio per le info

i programmi sono in vb non asp non hanno a che vedere con internet quindi problemi di sicurezza molto pochi.

alx_81 Profilo | Guru

>ti ringrazio per le info
>
>i programmi sono in vb non asp non hanno a che vedere con internet
>quindi problemi di sicurezza molto pochi.
Benissimo, cmq la soluzione stored procedure è buona ugualmente..
prova e fammi sapere.. se incontri difficoltà fatti sentire

Alx81 =)

http://blogs.dotnethell.it/suxstellino

mortenera Profilo | Junior Member

non mi funziona inserisco i dati cosi :

Me.AnagraficaTableAdapter.Fill(Me.DatiDataSet.anagrafica)
Dim row As DataRow = Me.DatiDataSet.anagrafica.NewRow
row("cognome") = cognome.Text
row("nome") = nome.Text
row("via") = via.Text
row("indirizzo") = indirizzo.Text
row("numero") = n.Text
row("cell") = cell.Text
row("cell2") = cell2.Text
row("tel") = tel.Text
row("email") = email.Text
row("tessera1") = tessera1.Text
row("cat1") = cat1.Text
row("anno1") = anno1.Text
row("tessera2") = tessera2.Text
row("cat2") = cat2.Text
row("anno2") = anno2.Text
Me.DatiDataSet.anagrafica.Rows.Add(row)
Me.AnagraficaTableAdapter.Update(Me.DatiDataSet)
Me.AnagraficaTableAdapter.Fill(Me.DatiDataSet.anagrafica)
ma non va, cosa sbaglio

ps. non e che ni pui dare qualche suggerimento anche per utilizzare il vecchi sistema passando le query da codice come facevo preima con i commandtext degli adattatori

alx_81 Profilo | Guru

>>ps. non e che ni pui dare qualche suggerimento anche per utilizzare
>il vecchi sistema passando le query da codice come facevo preima
>con i commandtext degli adattatori

puoi fare, da codice, uno script come questo:

intanto devi aggiungere, se già non ci sono, questi namespace:
Imports System.Data.SqlClient Imports System.Data

poi, ti faccio un esempio con query parametriche:

' creo la connessione (devi specificare la connectionstring) Dim ObjConn As New SQLConnection("TuaConnectionstring") ' creo il comando da quella connessione Dim ObjCmd As SQLCommand = ObjConn.CreateCommand() ' imposto la stringa dello statement SQL marcando con la @ i parametri Dim StrSql As String = "INSERT INTO tabella (campo1,campo2,campo3) VALUES (@p1,@p2,@p3)" ' creo i parametri del comando ObjCmd.Parameters.Add("@par1", SqlDbType.Int).Value = Convert.ToInt32(TextBox1.Text) ObjCmd.Parameters.Add("@par2", SqlDbType.VarChar).Value = TextBox2.Text ObjCmd.Parameters.Add("@par3", SqlDbType.VarChar).Value = TextBox3.Text ' imposto sql statement e tipo di comando ObjCmd.CommandText = StrSql ObjCmd.CommandType = CommandType.Text ' eseguo senza ritornare parametri ObjCmd.ExecuteNonQuery()

provalo..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

mortenera Profilo | Junior Member

ok fino a qui ci siamo o quasi

ma se creo un dataset e un tableadapter
posso passare una query select al tableadapter se si come

es me.tableadapter.selectcommad.commandtext("select * from anagrafica where nome = '"& nome.text &"')
cio e possibile uniore lutile al dilettevole, creare il database con sql expres e passargli le stringhe di comando da codice?

wacker976 Profilo | Newbie

puoi passare le stringhe SQL in maniera identica a come le passavi con Access, l'unica differenza e che ora con sql server hai molti comandi in più.

Cioè fai qualcosa del tipo:
(se CNN è la tua connessione, e vuoi cercare il nome pippo nella colonna1 di tabella1)

Dim CMD As SqlClient.SqlCommand = CNN.CreateCommand
CMD.CommandText = "SELECT * FROM Tabella1 WHERE Colonna1 = @nome"
CMD.Parameters.Add("@nome", SqlDbType.Char, 30).Value = "pippo"
Using RDR As SqlClient.SqlDataReader = CMD.ExecuteReader

'tutto quello che vuoi fare con i dati


End Using

mortenera Profilo | Junior Member

mi dispiace ma un ce la fò
le ho provate tutte ma non arrivo al risultato che tra l'altro e una mega cazzata, con vb.net non ho problemi ma nel 2005 un ci sto chiappando una sega, eppure e una cazzata inserisco dei dati e se provo a reinserire lo stesso nome e lo stesso cognome mi deve chiedere se voglio aggiornarli perche gia presenti in vb.net in un secondo lo facevo con database e oleadapter ma qui con sql stored procedure eec. non ci stocapendo piu nulla

alx_81 Profilo | Guru

>mi dispiace ma un ce la fò
Allora.. facciamo le cose passo passo.. ipotizziamo uno scenario
Passo uno, creazione della tabella di prova "Anagrafica" in sql server 2005 (tu hai già la tua tabella, immagino), la facciamo molto semplice e senza pretese:

CREATE TABLE Anagrafica ( ID int Identity(1,1) PRIMARY KEY CLUSTERED, Nome varchar(50) NOT NULL, Cognome varchar(50) NOT NULL )

Passo due, creazione della stored procedure, stesse condizioni di prima:

CREATE PROCEDURE proc_InsertAnagrafica ( @Nome varchar(50), @Cognome varchar(50) ) AS BEGIN SET NOCOUNT ON; -- mettilo, elimina i messaggi di righe affette dall'sql che scrivi di seguito. -- controllo l'esistenza del record in tabella IF NOT EXISTS (SELECT * FROM Anagrafica WHERE Nome = @Nome AND Cognome = @Cognome) BEGIN -- inserisco il record che non esiste INSERT INTO Anagrafica (Nome, Cognome) VALUES (@Nome, @Cognome) END ELSE BEGIN RAISERROR 50000 'Record già inserito' END END

Passo tre, la tua winform in un ipotetico metodo di un bottone premuto (a monte della classe metti Imports System.Data.SQLClient):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

fine.. basta sostituire le tue strutture e modificare la stored procedure..
non c'è da fare altro..
non è complesso dai.. leggi bene e vedrai che non è nulla di che..
Alx81 =)

http://blogs.dotnethell.it/suxstellino
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