Problema aggiornamento database sql con applicazione multiutente

sabato 17 luglio 2010 - 10.00
Tag Elenco Tags  VB.NET  |  Windows XP  |  Visual Studio 2003  |  SQL Server 2000

alex78 Profilo | Newbie

Salve a tutti, premetto che non avendo mai fatto applicazioni multiutente sicuramente ho dimenticato qualcosa di fondamentale comunque io vorrei fare un applicazione multiutente utilizzando sql server ma mi si presenta un problema di aggiornamento dei dati. Mi spiego meglio ho messo l'applicazione sul "server" ovvero la macchina con sql poi su un client con la stringa di connessione corretta per prendere i dati dal server, ora se io vado a modificare dal lato server un valore non avviene l'aggiornamento dei dati sul client e viceversa fino a quando non chiudo l'applicazione e la riavvio. Ho cercato un pò su web forse è un problema di concorrenza ma non sono riuscito a capire bene cosa mi manchi per gestire questa situazione. Mi potete chiarire un pò le idee Grazie a tutti.

alx_81 Profilo | Guru

>Salve a tutti,
Ciao
>ora se io vado a modificare lato server un valore non avviene l'aggiornamento dei dati
>sul client e viceversa fino a quando non chiudo l'applicazione
>e la riavvio. Ho cercato un pò su web forse è un problema di
>concorrenza ma non sono riuscito a capire bene cosa mi manchi
>per gestire questa situazione. Mi potete chiarire un pò le idee

Puoi essere un po' più dettagliato? Che cosa usi? in che linguaggio? Che codice scrivi? Che tipo di applicazione è?
Potrebbe essere semplicemente un problema di sintassi del codice.

>Grazie a tutti.
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

alex78 Profilo | Newbie

Si certamente hai ragione, utilizzo vb.net 2003 con database sql2000 e win xp per quanto riguarda l'applicazione è una sorta di agenda di appuntamenti per l'officina questa ovviamente dovrebbe girare su più terminali e qui arriva il mio problema non avendo mai fatto applicazioni multiterminali. Io ho fatto questo utilizzo App.config da dove recupero la stringa di connessione in questo modo:
dim con as string

con = Configuration.ConfigurationSettings.AppSettings("Connectionstring")

Me.SqlConnection1.ConnectionString = con


invece la stringa di connessione è la seguente :

questa è sul pc server

<add key="ConnectionString" value="workstation id=server;packet size=4096;integrated security=SSPI;data source=server;persist security info=False;initial catalog=agendaofficina" />
<add key="Timeout" value="50" />


questa è quella del client

<add key="ConnectionString" value="Data Source=192.168.0.2,1433;Initial Catalog=agendaofficina;User ID=sa;Password=xxx"/>
<add key="Timeout" value="0" />


Praticamente succede questo a video ho un datagrid dove visualizzo filtrandoli gli appuntamenti se io vado ad aprire le applicazioni su due pc e modifico da uno un rigo la modifica non viene visualizzata sull'altro pc ed in più se provo a modificare lo stesso rigo mi da il seguente errore :


Violazione di concorrenza: updatecommand ha modificato 0 record


spero che ciò possa aiutarti a capire meglio il problema grazie.

alx_81 Profilo | Guru

><add key="ConnectionString" value="Data Source=192.168.0.2,1433;Initial Catalog=agendaofficina;User ID=sa;Password=xxx"/>
sulla connessione non ci sono problemi, non c'è nulla da fare lato sviluppo per realizzare la "multiutenza" è l'rdbms che accetta più utenze. Quindi il problema non è dipendente da come scrivi il software. Magari evita di usare sa che è sysadmin e può fare tutto, pensa piuttosto ad un set di utenze dedicate all'applicazione.

>Praticamente succede questo a video ho un datagrid dove visualizzo filtrandoli gli appuntamenti se io vado ad aprire le applicazioni
>su due pc e modifico da uno un rigo la modifica non viene visualizzata sull'altro pc ed in più se provo a modificare lo stesso rigo mi da il seguente errore :
>Violazione di concorrenza: updatecommand ha modificato 0 record.
Questo perchè probabilmente utilizzi strumenti disconnessi per gestire i dati. Puoi postare un po' di codice?

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

alex78 Profilo | Newbie

Scusa il ritardo della risposta. Allora il codice è questo :

Dim myConnection As New SqlConnection(Configuration.ConfigurationSettings.AppSettings("Connectionstring"))
myConnection.Open()

Dim myCommand As SqlCommand = myConnection.CreateCommand()
Dim myTrans As SqlTransaction

myTrans = myConnection.BeginTransaction()
myCommand.Connection = myConnection
myCommand.Transaction = myTrans

Try

Dim i As Integer
Dim con As String

If Me.incarico.Checked = True Then

If Me.idselect.Text = "" Then

Else

If Me.statolav.Text = "in carico" Then

Else

Dim r1 As DialogResult = MessageBox.Show(" Stato di lavorazione modificato, Confermi la modifica ?", " Modifica stato lavorazione ", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)


If r1 = DialogResult.Yes Then

If Me.incarico.Checked = True Then

Me.statolavtemp.Text = "in carico"

For i = 0 To Me.DSappuntamenti1.appuntamenti.Rows.Count - 1

If Me.DSappuntamenti1.appuntamenti.Rows(i)("id") = Me.idselect.Text Then

Me.DSappuntamenti1.appuntamenti.Rows(i)("statolavor") = Me.statolavtemp.Text
BindingContext(DSappuntamenti1, "appuntamenti").EndCurrentEdit()

Me.statolavtemp.Text = ""

myTrans.Commit()

SaveData(Me.SqlDataAdapter1, DSappuntamenti1)



Exit For

End If

Next

End If
Catch

Try
myTrans.Rollback()
Catch ex As SqlException
If Not myTrans.Connection Is Nothing Then
Console.WriteLine("An exception of type " & ex.GetType().ToString() & _
" was encountered while attempting to roll back the transaction.")
End If
End Try

Console.WriteLine("An exception of type " & e.GetType().ToString() & _
"was encountered while inserting the data.")
Console.WriteLine("Neither record was written to database.")
Finally
myConnection.Close()
End Try


Io ho fatto questo per rimediare non so se è corretto probabilmente no ovvero ho preso un timer ed ho messo l'aggiornamento del db come segue


Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed

Try

LoadData(Me.SqlDataAdapter1, DSappuntamenti1)

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try

End Sub

avete consigli da darmi per evitare il timer e farlo in modo corretto ? e poi è giusto il mio modo di gestire tale operazione ?

Grazie
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5