Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Dal dataset tipizzato a sql server aiuto aiuto aiuto
venerdì 11 maggio 2007 - 09.11
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
pweb
Profilo
| Newbie
9
messaggi | Data Invio:
ven 11 mag 2007 - 09:11
Vi Prego aiutatemi....
non riesco ad inserire i dati dal dataset tipizzato a sql server...
non mi da nessun errore
ma di fatto il db non viene modificato....
come mai?
Qui sotto il codice che ho scritto...prende i dati da un foglio excel e li dovrebbe trasferire su una tabella sql server tramite l'uso di un dataset tipizzato...
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim excelApp As Microsoft.Office.Interop.Excel.Application
Dim FileExcel As Microsoft.Office.Interop.Excel.Workbook
Dim FoglioExcel As Microsoft.Office.Interop.Excel.Worksheet
Dim RangeExcel As Microsoft.Office.Interop.Excel.Range
excelApp = New Microsoft.Office.Interop.Excel.Application
'cartella di lavoro Excel
FileExcel = excelApp.Workbooks.Open("file.xls")
FoglioExcel = FileExcel.Worksheets("nomefoglio")
Dim dsc As New dsConfronto
Dim TabFornMese As New dsConfronto.TabFornMeseDataTable
Dim rfm As dsConfronto.TabFornMeseRow
Dim constring As String = "stringa di connsessione"
Dim cn As New SqlConnection(constring)
Dim comm As New SqlCommand
Dim da As SqlDataAdapter
Dim sql As String
dsc.BeginInit()
For irow As Integer = 2 To 2
rfm = dsc.TabFornMese.NewRow
For icol As Integer = 1 To 9
If icol = 1 Then
RangeExcel = FoglioExcel.Cells(irow, icol)
rfm.CodUtil = RangeExcel.Value
ElseIf icol = 2 Then
RangeExcel = FoglioExcel.Cells(irow, icol)
rfm.DataRich = RangeExcel.Value
ElseIf icol = 3 Then
RangeExcel = FoglioExcel.Cells(irow, icol)
rfm.Servizio = RangeExcel.Value
ElseIf icol = 4 Then
RangeExcel = FoglioExcel.Cells(irow, icol)
rfm.DettServ = RangeExcel.Value
ElseIf icol = 5 Then
RangeExcel = FoglioExcel.Cells(irow, icol)
rfm.Quantita = RangeExcel.Value
ElseIf icol = 6 Then
RangeExcel = FoglioExcel.Cells(irow, icol)
rfm.PzUnit = RangeExcel.Value
ElseIf icol = 7 Then
RangeExcel = FoglioExcel.Cells(irow, icol)
rfm.AddTot = RangeExcel.Value
ElseIf icol = 8 Then
RangeExcel = FoglioExcel.Cells(irow, icol)
rfm.Nominativo = RangeExcel.Value
ElseIf icol = 9 Then
RangeExcel = FoglioExcel.Cells(irow, icol)
rfm.Riferimento = RangeExcel.Value
End If
' fin qui è tutto a posto valorizza i capi del riga del datasetcorrettamente
Next
dsc.TabFornMese.Rows.Add(rfm)
' qui aggiunga la riga al daset giusto?
dsc.EndInit()
dsc.AcceptChanges()
'qui ho detto al daset di accetare i cambiamenti giusto?
' a questo punto, ma sicuramente sbaglio vorrei passare i dati sulla tabella ancora completamente vuota su sql server
sql = "Insert into TabFornMese "
sql = sql & " (DataRich, Servizio,DettServ, Quantita, PzUnit, AddTot, Nominativo, Riferimento) "
sql = sql & " VALUES "
sql = sql & rfm.CodUtil & "," & rfm.DataRich & ",'" & rfm.Servizio.Replace("'", "''") & "','" & rfm.DettServ.Replace("'", "''") & "'," & rfm.Quantita
sql = sql & "'" & rfm.PzUnit & "','" & rfm.AddTot & "','" & rfm.Nominativo.Replace("'", "''") & "','" & rfm.Riferimento.Replace("'", "''") & "'"
'ho costruito la query
comm.CommandText = sql
'la passo al comando
comm.Connection = cn
'passo la connessione al comando
da = New SqlDataAdapter
'costruisco il dataadapter
da.InsertCommand = comm
'passo il comando all'insertcommand del data adapter
da.Update(dsc, "TabFornMese")
' e qui dovrebbe passare i dati dal dataadapter alla tabella su sql server....
'invece rimane vuota....come mai?....sono un novellino lo so, ma vi prego aiutatemi....
Next
RangeExcel = Nothing
FoglioExcel = Nothing
FileExcel = Nothing
'excelApp.Quit()
excelApp = Nothing
End Sub
Cteniza
Profilo
| Guru
1.509
messaggi | Data Invio:
ven 11 mag 2007 - 11:45
>Vi Prego aiutatemi....
>
>' qui aggiunga la riga al daset giusto?
>
> dsc.EndInit()
giusto
> dsc.AcceptChanges()
>
>'qui ho detto al daset di accetare i cambiamenti giusto?
>
sbagliato, acceptchanges pone la riga ad unchanged (cioè dici di non voler aggiornare il database)
>' a questo punto, ma sicuramente sbaglio vorrei passare i dati
>sulla tabella ancora completamente vuota su sql server
>
>
> sql = "Insert into TabFornMese "
>sql = sql & " (DataRich, Servizio,DettServ, Quantita, PzUnit,
>AddTot, Nominativo, Riferimento) "
> sql = sql & " VALUES "
>sql = sql & rfm.CodUtil & "," & rfm.DataRich & ",'" & rfm.Servizio.Replace("'",
>"''") & "','" & rfm.DettServ.Replace("'", "''") & "'," & rfm.Quantita
>sql = sql & "'" & rfm.PzUnit & "','" & rfm.AddTot & "','" & rfm.Nominativo.Replace("'",
>"''") & "','" & rfm.Riferimento.Replace("'", "''") & "'"
>
> 'ho costruito la query
>
> comm.CommandText = sql
[snipped]
Come diceva bartali è tutto sbagliato è tutto da rifare!
Ci sono diversi errori gravi:
a stringa di definizione del dataadapter deve fare riferimento ad una SELECT e non ad una insert
Su sql server si scrive:
SELECT campo, campo, campo FROM mytable
poi si utilizza per generare il command e l'adapter:
Dim cm As New SqlCommand(mystringaselect,myconnection)
Dim da As New SqlDataAdapter(cm)
Poi si ricavano i command con il commanbuilder (o si inseriscono a mano che forse è meglio, ma per il nostro scopo va più che bene il commandbuilder):
Dim cmb As New SqlCommandBuilder(da)
e finalmente possiamo aggiornare il database:
da.Update(mytable/mydataset)
(sempre che tu non abbia dato acceptchanges PRIMA dell'update!).
Devi comunque sapere che .net per la definizione dei command del dataadapter NON usa istruzioni "in linea" di una stringa sql formattata ma usa i parametri.
La gestione "ridicola" delle stringhe di comandi sql senza l'utilizzo di parametri è fonte inenarrabile di problemi.
pweb
Profilo
| Newbie
9
messaggi | Data Invio:
sab 12 mag 2007 - 12:48
grazie delle considerazioni....dure ma felicemente comprensibili.
Credo di aver capito a grandi linea il punto della situazione che poi magari riposterò, ma toglimi una curiosita
che significa:
"Poi si ricavano i command con il commanbuilder (o si inseriscono a mano che forse è meglio, ma per il nostro scopo va più che bene"
???
come si fa a inserire i command a mano...?
Scusami ma forse il mio problema è aver sentito troppe fonti e neanche una che mi dice la stessa cosa.....
Cteniza
Profilo
| Guru
1.509
messaggi | Data Invio:
sab 12 mag 2007 - 13:08
>Credo di aver capito a grandi linea il punto della situazione
>che poi magari riposterò, ma toglimi una curiosita
>
>che significa:
>
>"Poi si ricavano i command con il commanbuilder (o si inseriscono
>a mano che forse è meglio, ma per il nostro scopo va più che
>bene"
>come si fa a inserire i command a mano...?
Per inserire generare il dataadapter se "lasci" fare al wizard ti genera una serie di command "medi/mediocri", in presenza ad esempio con sql update sulla tabella customer di nortwind produce:
AND ((@IsNull_ContactNam"& _
"e = 1 AND [ContactName] IS NULL) OR ([ContactName] = @Original_ContactName)) AND"& _
" ((@IsNull_ContactTitle = 1 AND [ContactTitle] IS NULL) OR ([ContactTitle] = @Or"& _
"iginal_ContactTitle)) AND ((@IsNull_Address = 1 AND [Address] IS NULL) OR ([Addr"& _
"ess] = @Original_Address)) AND ((@IsNull_City = 1 AND [City] IS NULL) OR ([City]"& _
" = @Original_City)) AND ((@IsNull_Region = 1 AND [Region] IS NULL) OR ([Region] "& _
"= @Original_Region)) AND ((@IsNull_PostalCode = 1 AND [PostalCode] IS NULL) OR ("& _
"[PostalCode] = @Original_PostalCode)) AND ((@IsNull_Country = 1 AND [Country] IS"& _
" NULL) OR ([Country] = @Original_Country)) AND ((@IsNull_Phone = 1 AND [Phone] I"& _
"S NULL) OR ([Phone] = @Original_Phone)) AND ((@IsNull_Fax = 1 AND [Fax] IS NULL)"& _
" OR ([Fax] = @Original_Fax)))
Scrivendo "a mano" sul programma nessun programmatore che abbia l'uso del cervello scriverebbe una cosa del genere ma .. (molti fanno così) inserirebbe un campo timestamp sulla tabella e metterebbe sulla "where" il campo timestamp insieme con il campo chiave (2 campi nel nostro caso), così la stringa diventerebbe:
Me._adapter.UpdateCommand.CommandText = "UPDATE [dbo].[Customers] SET [CustomerID] = @CustomerID, [CompanyName] = @Company"& _
"Name, [ContactName] = @ContactName, [ContactTitle] = @ContactTitle, [Address] = "& _
"@Address, [City] = @City, [Region] = @Region, [PostalCode] = @PostalCode, [Count"& _
"ry] = @Country, [Phone] = @Phone, [Fax] = @Fax WHERE (([CustomerID] = @Original_"& _
"CustomerID) AND ([Timestamp] = @Original_Timestamp)"
Riducendo di molto la complessità del tutto e limitando il numero dei parametri all'indispensabile.
E' opportuno scrivere il codice nel proprio programma inn presenza di tabelle molto popolate e/o con situazioni particolari in cui il wizard magari non è in grado di determinare una chiave univoca per gli aggiornamenti (ti dice che non può generare i command).
>Scusami ma forse il mio problema è aver sentito troppe fonti
>e neanche una che mi dice la stessa cosa.....
La miglior cosa è seguire un manuale, quello di Sheppa ad esempio (ADO.NET)
>
>
>
Torna su
Stanze Forum
Elenco Threads
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 !