2012-01-11 63 views
1

現在の問題:asmxファイルをローカルで実行しているときにエラーが発生しても、次のような値は表示されません。今すぐパラメータを追加しましたが、エラーはまだ表示されています。OleDbException:1つまたは複数の必須パラメータに値が指定されていません

しかし今、SQLが正しく動作するように変更されたため、このエラーはasmxにはないと思います。これは、必要な情報が渡される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 

これは、セッションが接続されている1つのサービスから渡されるとsortcode、ACCOUNTNUMBERとselectcaseがすべて正しく表示されている方法です。

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を呼び出しているファイルであり、私はそれが動作している場合だけチェックするローカルASMXを実行するたびに、私はエラーを取得します。私は呼び出している関数をチェックしましたが、エラーを見つけることはできません。誰かが私が間違っていたことに気付くことを望んでいる。

エラー:

System.Data.OleDb.OleDbException: No value given for one or more required parameters. 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.ExecuteReader(CommandBehavior behavior) at HSBC.over(Int64 accountnumber) at HSBC.OverDraft(Int64 accountnumber)

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
'             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 

ACCOUNTNUMBERが他の人によって作成されたサービスから持ち帰ったセッションに格納され、私はそれがあることを確認し、これは今までにページのように正しく渡さなっている知っています正しいものが送信され使用されます。

誰もが何か提案がありますか?また、データベースに必要な権限をすべて追加しました。

答えて

0

非常に近い。あなたのお問い合わせ:

"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()が呼び出されることに頼っているため、特に重要です。 '使用する'はあなたのためにこれを簡素化します。

あなたの関数は、次に似すぎだろう:あなたが渡されるあなたのACCOUNTNUMBERにコマンドのパラメータを設定する必要が

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 
+0

は、私はそれが今のアカウントに置く方法を聞いても数?申し訳ありませんが、私はそれがどうやって起こっているのか少し失っています。私はusingステートメントの使用について読むことを知っていますが、もう一度そのステートメントを少し失ってしまいました。 VB Web開発者でも、oledbパラメータは型であり、式として使用することはできません。また、エラー= OleDbParameter行で定義することはできませんエラーが表示されます。これはasmxページです – user1134409

+0

Dim accountParamからOleDbParameter行として始まるセクションです。パラメータを宣言し、それをコマンドに属するパラメータのコレクションに追加し、パラメータの値をアカウント番号に設定します。 OleDbドライバがこのクエリを処理すると、疑問符はaccountParam値に置き換えられます。複数のパラメータがある場合は、クエリに表示される順序でパラメータを追加します。 – dash

+0

上記のように、VBでエラーが発生しています。oledbparameterは型であり、式として使用することはできません。また、エラー= OleDbParameter行で定義することはできませんエラーが表示されます。 – user1134409

1

connectioncmd = New OleDbCommand(Sql, connection) 
     Dim p As OleDb.OleDbParameter = connectioncmd.CreateParameter() 
     p.Value = accoutnumber 
     connectioncmd.Parameters.Add(p) 
+0

それは何を置き換えるものですか?はい? – user1134409

+0

はい、それはそれを置き換えます –

+0

私はあなたに2つの理由で+1を与えています。あなたは最初に文法権を持っています(accountnumber変数に欠けているnを除いて)、2)あなたのアバターは今までにない最高のサッカークラブです(IMO);-) – dash

関連する問題