Avatar billede SommerFyr Seniormester
17. december 2016 - 01:22 Der er 18 kommentarer

WebService access

Hej Jeg er igang med at lave en webservice og da jeg udvikler den på min server som skal køre den, virker den men når jeg så vil bruge den så virker den ikke så melder den database fejl

håber der er en der kan finde ud af hvorfor den giver DB FEJL når jeg køre på den ude fra men virker når jeg køre den fra min server.

mens GetSession virker..

Min kode
    <WebMethod()> _
    Public Function CreateSession(ByVal MySession As String, ByVal SessionData As String) As String
        Dim MySessionNr As Double
        If MySession.Length > 0 Then
            MySession = MySession.Replace(" ", "")
            Double.TryParse(MySession, MySessionNr)
        Else
            Dim NewSession As System.Random = New System.Random()
            MySessionNr = NewSession.Next(100000000, 999999999)
        End If
        Dim DBConn As New OleDbConnection(String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", HttpContext.Current.Server.MapPath("\App_Data\Sessiondb.accdb")))
        Dim DBcomm As New OleDbCommand
        Dim DBupda As New OleDbCommand
        Dim DBInde As New OleDbCommand
        DBcomm.Connection = DBConn
        Try
            DBConn.Open()
            DBcomm.CommandText = "SELECT RemoteData FROM RemoteSession WHERE RemoteNr=" & MySessionNr & ";"
            Dim DBReader As OleDbDataReader = DBcomm.ExecuteReader
            If DBReader.HasRows Then  ' (Not reader Is Nothing)
                DBupda.CommandType = CommandType.Text
                DBupda.Connection = DBConn
                DBupda.CommandText = "UPDATE RemoteSession SET RemoteData='" & SessionData & "' WHERE RemoteNr=" & MySessionNr & ";"
                DBupda.ExecuteNonQuery()
                'Do While DBReader.Read
                'Me.txtName.Text = DBReader.Item("RemoteData").ToString
                'Loop
                DBReader.Close()
            Else
                DBInde.CommandType = CommandType.Text
                DBInde.CommandText = "INSERT INTO RemoteSession(RemoteNr,RemoteData) VALUES ('" & MySessionNr & "','" & SessionData & "');"
                DBInde.Connection = DBConn
                DBInde.ExecuteNonQuery()
                DBInde.Clone()
            End If
            Return System.Convert.ToString(MySessionNr)
        Catch ex As Exception
            DBConn.Close()
            Return "DB FEJL"
        End Try
    End Function


    <WebMethod()> _
    Public Function GetSession(ByVal MySession As String) As String
        Dim DBConn As New OleDbConnection(String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", HttpContext.Current.Server.MapPath("\App_Data\Sessiondb.accdb")))
        Dim DBcomm As New OleDbCommand
        DBcomm.Connection = DBConn
        Try
            DBConn.Open()
            DBcomm.CommandText = "SELECT RemoteData FROM RemoteSession WHERE RemoteNr=" & MySession & ";"
            Dim DBReader As OleDbDataReader = DBcomm.ExecuteReader
            If DBReader.HasRows Then  ' (Not reader Is Nothing)
                Do While DBReader.Read
                    Return DBReader.Item("RemoteData").ToString
                Loop
            Else
                Return "n/a"
            End If
            DBConn.Close()
        Catch ex As Exception
            DBConn.Close()
            Return "Fejl"
        End Try

    End Function
Avatar billede arne_v Ekspert
17. december 2016 - 02:05 #1
Erstat:

      Catch ex As Exception
            DBConn.Close()
            Return "DB FEJL"
        End Try

med:

      Catch ex As Exception
            DBConn.Close()
            Return "DB FEJL: " & ex.Message & " " & ex.StackTrace
        End Try

og se hvad der faktisk sker.
Avatar billede arne_v Ekspert
17. december 2016 - 02:13 #2
Derudover saa er der masser af problemer i koden:

1)

Double.TryParse(MySession, MySessionNr)

tester ikke paa retur varedi

2)

Dim NewSession As System.Random = New System.Random()

initialiserer en RNG for hver request - det giver ikke tilfaeldige tal

3)

MySessionNr = NewSession.Next(100000000, 999999999)

giver session numre som er nemme at gaette, hvilket muligvis er et sikkerheds problem

4)

Dim DBConn As New OleDbConnection(String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", HttpContext.Current.Server.MapPath("\App_Data\Sessiondb.accdb")))

burde bruge Using til at sikre close af connection

5)

Dim DBConn As New OleDbConnection(String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", HttpContext.Current.Server.MapPath("\App_Data\Sessiondb.accdb")))

MapPath til den sti ser meget suspekt ud

6)

DBupda.CommandText = "UPDATE RemoteSession SET RemoteData='" & SessionData & "' WHERE RemoteNr=" & MySessionNr & ";"

DBInde.CommandText = "INSERT INTO RemoteSession(RemoteNr,RemoteData) VALUES ('" & MySessionNr & "','" & SessionData & "');"

brug parameters

7)

du laver multiple commands samtidigt paa samme connection - det kan give problemer

8)

If DBReader.HasRows Then  ' (Not reader Is Nothing)
                Do While DBReader.Read
                    Return DBReader.Item("RemoteData").ToString
                Loop

kunne vel laves nemmere med en

If DBReader.Read Then
Avatar billede SommerFyr Seniormester
17. december 2016 - 02:46 #3
Hej Arne_V

Glad for du er med i denne tråd..
Den virker når jeg køre den i vs2010 men ikke når jeg smider den online..

Iden er at den checker om den får en MySession og få den ikke så laver den et random kode.

men jeg ved godt min kode nok er lidt klosse. men jeg ved ikke lige hvordan jeg ellers skal få den til at være mere ren.
Avatar billede SommerFyr Seniormester
17. december 2016 - 02:49 #4
Webservice køre lige nu bare som et minder forsøg. som skal modtage nåde data og hvis den ikke har et id så får den et. ellers rette den bare give ids data.
da det nummer skal man kun søge på og få give data..
Avatar billede arne_v Ekspert
17. december 2016 - 02:57 #5
Har du proevet forslaget i #1 for at se hvilken fejl der kommer naar det koeres paa serveren?
Avatar billede SommerFyr Seniormester
17. december 2016 - 02:59 #6
Ja jeg har lige prøve og der kommer der fejl i
Try
            DBConn.Open()  <! FEJL HER.
Avatar billede SommerFyr Seniormester
17. december 2016 - 03:04 #7
System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
  at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
  at System.Data.OleDb.OleDbConnection.Open()
  at HelpPcApi.RemoteTerminal.CreateSession(String MySession, String SessionData) in RemoteTerminal.asmx.vb:line 78
Avatar billede arne_v Ekspert
17. december 2016 - 03:14 #8
Det er stacktrace - er der ikke en message ogsaa?
Avatar billede SommerFyr Seniormester
17. december 2016 - 03:17 #9
jo #7
Avatar billede arne_v Ekspert
17. december 2016 - 03:37 #10
#7 er ex.StackTrace ikke ex.Message
Avatar billede SommerFyr Seniormester
17. december 2016 - 03:42 #11
ex.Message = DB FEJL: Operation must use an updateable query.
----
ex.StackTrace = DB FEJL:    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
  at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
  at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
  at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
  at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
  at System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
  at HelpPcApi.RemoteTerminal.CreateSession(String MySession, String SessionData) in RemoteTerminal.asmx.vb:line 85
Avatar billede arne_v Ekspert
17. december 2016 - 03:56 #12
Det bliver lidt et gaet, men du kunne proeve at close din reader inden ExecuteNonQuery
Avatar billede SommerFyr Seniormester
17. december 2016 - 04:06 #13
Jeg har prøve både før og efter men bliver ved med at give sammen fejl
Avatar billede SommerFyr Seniormester
17. december 2016 - 04:16 #14
Ups det er hvis det man kalder en fejl 40, Jeg har glemt at give min server skrive ret.. men nu virker det. selv om jeg godt nok ved det er lidt klosse kode.
Avatar billede arne_v Ekspert
17. december 2016 - 04:56 #15
Ah - de kryptiske OLE DB fejl beskeder har slaaet til igen.

Operation must use an updateable query = ingen skrive adgang til ACCDB filen

:-)

Har du overvejet at bruge noget andet end Access?
Avatar billede SommerFyr Seniormester
17. december 2016 - 05:26 #16
Ja mysql, men skulle bare lige hvad styr på at se det virker.
da jeg skal have nåde date fra en computer over til en anden som man så kan hente via id..
og her var det jo kun et meget simple script der skulle virker første.

Jeg er nemlig i gang med at lave nåde fjernstyring system.
Avatar billede SommerFyr Seniormester
17. december 2016 - 05:28 #17
Når ja jeg så lige du har haft fødselsdag stor tillykke her fra og god jul,
Avatar billede arne_v Ekspert
18. december 2016 - 03:14 #18
MySQL er en mulighed.

SQLServer

SQLServer CE (som ikke har mere tilfaelles med SQLServer end navnet)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester