[ASP 2.0/VB] Manipolare Datatable

giovedì 05 giugno 2008 - 09.29

Devil Profilo | Junior Member

Ciao a tutti,
il mio obbiettivo è aggiungere dati nei campi di una tabella. Da vari esempi credevo di aver capito come fare ma il seguente codice genera un errore "La colonna 'testo' non appartiene alla tabella T1." al punto indicato con "<----"

Eppure io in SQL server ho una tabella chiamata T1 che ha 4 colonne come vedete nell'immagine allegata

221x96 4Kb


'connessione DB
'---------------------------------------
Dim connDb As SqlConnection
Dim cmdDb As SqlCommand
Dim dataA As SqlDataAdapter

connDb = New SqlConnection
cmdDb = New SqlCommand

connDb.ConnectionString = "Stringa di connessione"
connDb.Open()

' DataSet
Dim dataS As DataSet

'DataRow
Dim workRow As DataRow

'datTable
Dim dataT As DataTable

'Creo datatable
dataT = New DataTable("T1")

'Creo dataset
dataS = New DataSet()

'Aggiungo dataTable nel dataset
dataS.Tables.Add(dataT)

'Creazione rows
workRow = dataT.NewRow()

workRow("testo") = "Smith" <----------
workRow("data") = #1/1/2008#
workRow("numero") = 10

'inserimento nuovo record
dataT.Rows.Add(workRow)
....
...

Dove Sbaglio?
grazie ciao

amelix Profilo | Expert

Scusa la domanda... Ma dove riempi il datatable da SQL? Oppure dove cotruisci la struttura del DataTable?

Fare
'Creo datatable dataT = New DataTable("T1")
Non è sufficente.

Andrea - http://www.MelisWeb.eu/
CMS - http://www.WebOrama.it/

Devil Profilo | Junior Member

Ciao..che velocità!

ma non so..sono alle prime armi forse proprio non lo riempio!!

la tabella è su SQl server express sul mio pc forse manca del codice ma mi sembrava che dopo la connessione e creando una datatatble e indicandigli il nome della tabella fossi a posto.

Che codice manca?

amelix Profilo | Expert

Direi che manca tutto...
Ti do 2/3 indizi... DataAdapter, SqlCommand e per ora basta...
Googola un po' e troverai tonnellate di esempi (anche in italiano) per popolare un dataTable.

Poi dovrai fare altre operazioni per salvare le modifiche fatte al DataTable (Update, Insert e Delete) ma questo è il prox passo.


Andrea - http://www.MelisWeb.eu/
CMS - http://www.WebOrama.it/

Devil Profilo | Junior Member

cioè tu dici che manca questa parte?

cmdDb.CommandText = "Select * from T1"
cmdDb.CommandType = CommandType.Text
cmdDb.Connection = connDb

dataA = New SqlDataAdapter
dataA.SelectCommand = cmdDb
dataA.Fill(dataT)

Ma la tabella è vuota e non volevo riempirla con istruzioni sql ma manipolare ogni singolo record

Devo proprio passare per il command?

amelix Profilo | Expert

Altrimenti ti devi costruire un xsd (DataSet Tipizzato) o costruirti la struttura a runtime.

Andrea - http://www.MelisWeb.eu/
CMS - http://www.WebOrama.it/

Devil Profilo | Junior Member

ok provo a documentarmi sul dataset tipizzato che l'ho gia letto in giro,

comunque la struttura della tabella è già esistente come vedi dall'immagine devo solo aggiungere record di volta in volta..

ok grazie per il momento..

Mikyct86 Profilo | Junior Member

Public Shared Function GetTransactionByTran(ByVal tranAbs As Integer) As DataTable
Dim mySQLcommand As New SqlCommand()
Dim connect As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
connect.Open()
mySQLcommand.Connection = connect
Dim sql As String = "select * from absTransaction where nTranAbs = " & tranAbs
mySQLcommand.CommandText = sql
Dim da As New SqlDataAdapter(mySQLcommand)
connect.Close()
Dim dta As New DataTable
da.Fill(dta)
da.Dispose()
Return dta
End Function

Puoi usare questa sintassi...
Questa funzione ad esempio crea una datatable da una sql semplice con un parametro passato alla funzione.
Ovviamente nn ho inserito la connection string che dovrai inserire.

Devil Profilo | Junior Member

ciao,

ma devo per forza passare per il command..
l'esempio che ho trovato su msdn è questo:

' Instantiate the DataSet variable.
dataSet = New DataSet()

' Add the new DataTable to the DataSet.
dataSet.Tables.Add(table)

' Create three new DataRow objects and add
' them to the DataTable
Dim i As Integer
For i = 0 to 2
row = table.NewRow()
row("id") = i
row("ParentItem") = "ParentItem " + i.ToString()
table.Rows.Add(row)
Next i
...

io mi ero basato su questo...no??
è proprio quello che volevo fare ..senza il for

Mikyct86 Profilo | Junior Member

Allora tu hai una tabella in sql express giusto?
quindi l'insert del row la devi inserire sulla tabella in sql o vuoi solo modificare la tua table che hai sul codice?
Spiegami meglio cosa vuoi fare.
Cmq sul tuo codice ce un errore di base.non hai creato la colonna "testo"
dim dc as new datacolumn
dc.ColumnName = "testo" 'creo la nuova colonna
table.Columns.Add(dc)

Ma cosi facendo hai tutto ancora nella table temporanea ma non sul db!

invece con questa funzione inserisci il valore nella tabella in sql

Public Shared Function Insert(ByVal idAs Integer,ByVal testo as string) As DataTable
Dim mySQLcommand As New SqlCommand()
Dim connect As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
connect.Open()
mySQLcommand.Connection = connect
Dim sql As String = "insert into table(id,testo) values(" & id & "," & testo & ")" "
mySQLcommand.CommandText = sql
Dim da As New SqlDataAdapter(mySQLcommand)
connect.Close()
Dim dta As New DataTable
da.Fill(dta)
da.Dispose()
Return dta
End Function

amelix Profilo | Expert

La "table" su MSDN ha una struttura... che ti DEVI fare a mano se NON vuoi passare dal DB.
La sintassi new DataTable(...) non implica costruzione di colonne!
Secondo te con che criterio le dovrebbe costruire? Se non gli fornisci la fonte dati e gli fai dare una sbirciatina...

Andrea - http://www.MelisWeb.eu/
CMS - http://www.WebOrama.it/

Mikyct86 Profilo | Junior Member

Ovvio è come dice Amelix! Devi crearti le colonne se vuoi creare una table da zero!
Ma se ti appoggi a un db in sql express nn vedo che senso ha crearti un db cosi.meglio che lavori con sql express!
o meglio ancora con stored procedure!

Devil Profilo | Junior Member

Ah forse comincio a capire...
ero convinto che modifiche sul datatable fosse come lavorare direttamente sulla tabella ma non ho pensato al fatto che può lavoarare in modalità disconnessa!!

la tabella sta sul db
in sostanza io volevo fare una cosa che ho gia fatto con access cioè mi collego alla tabella con il recordset e nei campi che dico io metto un valore (che nel mio caso prendo da una cella di excel)

esempio sintetizzato: recordset.fields("nome campo").valore=foglioexcel.range("a1").valore

in ASP entrano in ballo più oggetti e qui sicuramente sbaglio qualcosa.

i passi che vorrei fare sono:

collegarmi al foglio excele estrapolare i dati dalle celle che mi ineressano---ok fatto
collegarmi al db sql exp -----ok fatto

copiare il valore di una cella in un campo di una tabella---?

farlo in maniera simile a quello che ho fatto in access devo usare data adapter dataset e data tadle + altri oggetti però sbaglio ad utilizzarli.

qualche indicazione sui passaggi da eseguire?




Devil Profilo | Junior Member

Intanto faccio un pò di prove...
però ipotizzando che riesca a costruire la struttura della mia tabella e poi ad inserire i record e i valori per ogni campo ...poi?..come spiegargli di riversare il tutto nella tabella di destinazione cioè quella sul server?

Devil Profilo | Junior Member

forse a questo punto mi sto convincendo che faccio prima a fare una "insert into...." passando parametri(anche se molto lunga)...credevo fosse sbrigativo come in vba o mi sbaglio?

Mikyct86 Profilo | Junior Member

perfetto ti estrapoli tutto dall'excel.dopo di che devi fare una insert SQL.


Public Shared Function Insert(ByVal id As Integer, ByVal testo As String, ByVal data As DateTime, ByVal numero As Integer) As DataTable
Dim mySQLcommand As New SqlCommand()
Dim connect As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
connect.Open()
mySQLcommand.Connection = connect
Dim sql As String = "insert into t1(id,testo,data,numero) values(" & id & "," & testo & "," & data & "," & numero & ")"
mySQLcommand.CommandText = Sql
Dim da As New SqlDataAdapter(mySQLcommand)
connect.Close()
Dim dta As New DataTable
da.Fill(dta)
da.Dispose()
Return dta
End Function

puoi benissimo copiare questa perche dovrebbe essere corretta per il tuo lavoro
e la usi cosi:
Insert(id,testo,data,numero)

Devil Profilo | Junior Member

ok mi sono convinto e sto provando...

naturalmente la tabella non è solo t1, quella era solo di prova e per semplificare le cose, infatti sono più tabelle e con decine di campi in cui memorizzare testo e valori numerici( a titolo informativo rilievi di livelli rumore in aree produttive di uno stabilimento metalmeccanico) comunque la strada da percorrere è questa..

grazie mille a tutti per l'assistenza
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5