OleDbException: не указано значение для одного или нескольких обязательных параметров - PullRequest
1 голос
/ 12 января 2012

Текущая проблема: при локальном запуске файла asmx для проверки его работоспособности постоянно появляется сообщение об отсутствии значения, указанного ниже.Я добавил параметры сейчас, но ошибка все еще появляется.

Однако теперь я чувствую, что ошибка не в asmx, так как люди изменили SQL для правильной работы.Это файл aspx, в котором передается необходимая информация.Возможно ли, что существует проблема с передачей переменных сеанса, которые установлены?

 Dim Secure As New Visa.VISAServices()
    Dim authHeader As New Visa.AuthenticationHeader()

    authHeader.username = "HSBC"
    authHeader.password = "password"
    Secure.AuthenticationHeaderValue = authHeader

    Session("sessionsortnum") = sortnum.Text
    Session("sessionaccount") = account.Text


    'Change type for the sortcode
    Dim sortcode As String = CType(Session.Item("sessionsortnum"), String)
    Dim accountnumber As String = CType(Session.Item("sessionaccount"), String)

    lblVisa.Text = Secure.AuthenticateCardSecure(pin.Text, sortnum.Text, account.Text)

    'NEEDS TO STAY HERE DO NOT MOVE!
    Session("sessioncase") = lblVisa.Text
    Dim selectcase As String = CType(Session.Item("sessioncase"), String)

    'Tests - Being sent to the session var
    testsort.Text = sortcode
    testbank.Text = accountnumber
    testselectc.Text = selectcase

Это - то, как сеансы передаются от одного сервиса, к которому подключается, и sortcode, accountnumber и selectcaseвсе отображаются правильно.

Этот файл вызывает asmx:

Private Sub checkbalance(ByVal sender As Object, ByVal e As System.EventArgs)

    Dim sortcode As String = CType(Session.Item("sessionsortnum"), String)
    Dim accountnumber As String = CType(Session.Item("sessionaccount"), String)
    Dim selectcase As String = CType(Session.Item("sessioncase"), String)
    testsort.Text = sortcode
    testbank.Text = accountnumber
    testselectc.Text = selectcase

    Select Case testselectc.Text
        Case "1111111111"
            'Dim lloydsbalance As New Lloyds.
            'screen.Text = lloydsbalance.overdraft(accountnumber)
        Case "2222222222"
            Dim barclaysbalance As New Barclays.Transactions()
            screen.Text = barclaysbalance.overdraft(accountnumber, sortcode)
        Case "3333333333"
            Dim santanderbalance As New Santander.Santander()
            screen.Text = santanderbalance.overdraft(accountnumber, sortcode)
Case "4444444444"
Dim HSBCbalance As New HSBC.HSBC()
screen.Text = HSBCbalance.OverDraft(accountnumber)

        Case "5555555555"
            Dim halifaxbalance As New Halifax.Halifax()
            screen.Text = halifaxbalance.overdraft(accountnumber)
        Case "6666666666"
            Dim natwestbalance As New Natwest.natwest()
            screen.Text = natwestbalance.overdraft(accountnumber, sortcode)

    End Select
End Sub

Исходная проблема: всякий раз, когда я запускаю asmx локально, просто чтобы проверить, работает ли он, я просто получаюошибка.Я проверил вызываемую функцию, но не могу найти ошибку.Я надеюсь, что кто-то может определить, что я сделал неправильно.

Ошибка:

System.Data.OleDb.OleDbException: Не задано значение для одного или нескольких обязательных параметров.в System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (OleDbHResult hr) в System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult (tagDBPARAMS.OleDb.OleDbCommand.ExecuteCommand (поведение CommandBehavior, Object & executeResult) в System.Data.OleDb.OleDbCommand.ExecuteReaderInternal (поведение CommandBehavior, метод String) в System.Data.OleDb.OleDbCommand.ExBegn) в HSBC.OverDraft (номер учетной записи Int64)

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'                                                   Overdraft Call
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<WebMethod()> Public Function OverDraft(ByVal accountnumber As Long) As String
    Return over(accountnumber)
End Function

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'                                   Overdraft function
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

'Creates a service web method

Private Function over(ByVal accountnumber As Long) As String
    'Open the connection to the database

    Dim BalanceDr As OleDbDataReader
    Dim connectioncmd As OleDbCommand
    Dim connection As OleDbConnection
    Dim connx As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("../database/HSBc.mdb") & ";"
    Dim SQL As String = "SELECT Customer_Overdraft FROM Customer WHERE Account_Number=?"
    Dim overdraft As String
    connection = New OleDbConnection(connx)
    connectioncmd = New OleDbCommand(SQL, connection)
    connection.Open()
    'Create a DataReader that will return information.
    BalanceDr = _
    connectioncmd.ExecuteReader(CommandBehavior.CloseConnection)

    If BalanceDr.Read() Then
        'A row was returned
        overdraft = BalanceDr(0)
    Else
        'A row was not returned
        overdraft = "No Balance For Account Found"
    End If
    BalanceDr.Close()
    Return overdraft
End Function

номер учетной записи хранится в сеансе, который был возвращен из службы, созданной кем-то другим, я знаю, что она передается правильно, как и на любой страницеЯ проверяю, правильно ли он отправляется и используется.

У кого-нибудь есть предложения?Я также добавил все необходимые разрешения в базу данных.

Ответы [ 2 ]

1 голос
/ 12 января 2012

Вам необходимо установить параметр команды в свой номер счета, который передается в:

connectioncmd = New OleDbCommand(Sql, connection)
        Dim p As OleDb.OleDbParameter = connectioncmd.CreateParameter()
        p.Value = accoutnumber
        connectioncmd.Parameters.Add(p)
0 голосов
/ 12 января 2012

Очень близко; Ваш запрос:

 "SELECT Customer_Overdraft FROM Customer WHERE Account_Number=?" 

является параметризованным запросом; поэтому вам необходимо добавить OleDbParameter к вашему объекту команды.

Ваша функция должна тогда быть похожей (не рядом с Visual Studio, поэтому не может проверять синтаксис):

Private Function over(ByVal accountnumber As Long) As String  

   'Open the connection to the database  

    Dim BalanceDr As OleDbDataReader  
    Dim connectioncmd As OleDbCommand  
    Dim connection As OleDbConnection  
    Dim connx As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("../database/HSBc.mdb") & ";"  
    Dim SQL As String = "SELECT Customer_Overdraft FROM Customer WHERE Account_Number=?"  
    Dim overdraft As String  
    connection = New OleDbConnection(connx)  
    connectioncmd = New OleDbCommand(SQL, connection) 
    'Add A Parameter!
    connectioncmd.Parameters.AddWithValue("accnumber", accountnumber)

    connection.Open()

    'Create a DataReader that will return information.  
    BalanceDr = _  
    connectioncmd.ExecuteReader(CommandBehavior.CloseConnection)  

    If BalanceDr.Read() Then  
        'A row was returned  
        overdraft = BalanceDr(0)  
    Else  
        'A row was not returned  
        overdraft = "No Balance For Account Found"  
    End If  
    BalanceDr.Close()  
    Return overdraft  
End Function  

Я бы также предложил вам использовать оператор using . Это особенно важно, поскольку вы не закрываете соединение с базой данных явно, а вместо этого полагаетесь на тот факт, что будет вызван BalanceDr.Close (). «Использование» упростит это для вас.

Ваша функция будет тогда аналогичной:

Private Function over(ByVal accountnumber As Long) As String  

   'Open the connection to the database  

    Dim BalanceDr As OleDbDataReader  
    Dim connectioncmd As OleDbCommand  
    Dim connection As OleDbConnection  
    Dim connx As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("../database/HSBc.mdb") & ";"  
    Dim SQL As String = "SELECT Customer_Overdraft FROM Customer WHERE Account_Number=?"  
    Dim overdraft As String  

    Using connection = New OleDbConnection(connx)  
        Using connectioncmd = New OleDbCommand(SQL, connection) 
          'Add A Parameter!
          connectioncmd.Parameters.AddWithValue("accnumber", accountnumber)

          connection.Open()

          'Create a DataReader that will return information.  
          Using BalanceDr = connectioncmd.ExecuteReader()  

            If BalanceDr.Read() Then  
                'A row was returned  
                overdraft = BalanceDr(0)  
            Else  
                'A row was not returned  
                overdraft = "No Balance For Account Found"  
            End If

      End Using 

      End Using
    End Using

    Return overdraft

End Function  
...