Dal dataset tipizzato a sql server aiuto aiuto aiuto

venerdì 11 maggio 2007 - 09.11

pweb Profilo | Newbie

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

>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

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

>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)
>
>
>
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