困難

2017-06-23 13 views
-1

は、だから、私は、特定の奇妙な問題を持っている学校の休日困難

のためのサインアップFRMにあなたを導き、私のVBAのログインFRMに接続されているアクセスもデータベースを持っています私のVBAコード、それは私のSQLの部分と、私は何dpを続けることはできません。 VBAはSQLから得られる結果が正しいか否かを判断しません。

私はいくつかのSQL文に文字列を入れました。

私のプログラムにログインしている学生のloginIDは、特定のクラスにあるので、コンボボックスで休暇の特定の場所しか見ることができないため、下位クラスの他の学生は、それらのいくつかは両方のクラスのために結合されています。

何とか私のSQLコードは正しくありません。

データベーステーブルBEHEERには、そのクラスがKlasと呼ばれるLoginID(コード内のleerlingnr)とパスワード(wachtwoord)があります。 1人の学生がID 12とパスワード1を持っていますLeerlingenテーブル(オランダ語の学生)ではクラス1に割り当てられましたが、将来はA5Aになりますが、コードクラッシュの安全性のために1にしました。

Public Class frmInschrijven 

Dim strSql As String = "" 

Dim strConnectionString As String = "" 

Private Sub frmInschrijven_Load() Handles MyBase.Load 
'Declareer alle variabelen 
Dim strUsername2 As String = "" 
Dim strKlas As String = "" 
'Bepaal CommandText (=SQL statement om records op te vragen: 
strSql = "SELECT B.Leerlingnr, L.Leerlingnr, Wachtwoord, L.KLas, plaats FROM BEHEER B, LEERLINGEN L, Plaatsen P" 

'Definieer de verbinding: 
strConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=Werkweek.accdb" 
'Maak connection aan op basis van de connectionstring en 
'command op basis van de SQL opdracht en gemaakte connection: 
Dim objConnection As New OleDb.OleDbConnection(strConnectionString) 
Dim objCommand As New OleDb.OleDbCommand(strSql, objConnection) 
'Open de verbinding: 
objCommand.Connection.Open() 
'Maak een DataReader aan op basis van de ingestelde command: 
Dim objDataReader As OleDb.OleDbDataReader = objCommand.ExecuteReader(CommandBehavior.CloseConnection) 
'Doorloop de Leerlingnr's om te zien in welke klas ze zitten 

'Doorloop alle records in de tabel: 
While objDataReader.Read 
    strUsername2 = frmInloggen.strUsername 
    'Nog zorgen dat ALLEEN data van 1 leerling beschikbaar is, dan pas kan strKlas 

    strKlas = objDataReader("Select Klas FROM LEERLINGEN L, BEHEER B WHERE L.Leerlingnr=""" & frmInloggen.strUsername & """AND B.LEERLINGNR=L.LEERLINGNR") 
    If strKlas = "1" Then 
     MsgBox("Correct, you saved me!") 

    ElseIf strKlas Like "H4A" Then 
     With cboKeuze1 
      .Items.Add("apart") 
     End With 


    Else MsgBox("try again") 
    End If 


End While 
'Sluit de DataReader en de Connection: 
objDataReader.Close() 
objConnection.Close() 
End Sub 

BEHEERそしてLEERLINGENは、両方のBEHEERで、それはユーザー名として使用されている学生のIDを持っています。

あなたがメッセージボックスが正しい取得する場合は、コードが動作するはずです、その後私を救ったが、今、私はこの部分を通過することができないよ:

strKlas = objDataReader("Select Klas FROM LEERLINGEN L, BEHEER B WHERE L.Leerlingnr=""" & frmInloggen.strUsername & """AND B.LEERLINGNR=L.LEERLINGNR") 

誰かが私を助けてください。 私が全体の.slnを含める必要がある場合は、リクエストしてください。私はそれをあなたに提供します。 ありがとうございます。

+1

VBA?あなたはVB.NETを意味します。サイドノート:連結されたstrngをクエリとして使用しないでください。その代わりに、パラメータ化されたクエリを使用してください!参照:[パラメータ化されたクエリを実行する方法](https://msdn.microsoft.com/library/bb738521(v=vs.100).aspx) –

答えて

0

非常に最後の文をチェックしてください=

strKlas = objDataReader("Select Klas FROM LEERLINGEN L, BEHEER B WHERE L.Leerlingnr=""" & frmInloggen.strUsername & """AND B.LEERLINGNR=L.LEERLINGNR") 

は、私が質問にコメントで述べたように、あなたの代わりに文字列を連結のパラメータ化クエリを使用する必要が

strKlas = objDataReader("Select Klas FROM LEERLINGEN L, BEHEER B WHERE L.Leerlingnr='" & frmInloggen.strUsername & "' AND B.LEERLINGNR='L.LEERLINGNR'") 
+0

本当ですか?私に関しては、あなたは間違っています。 –

+0

再チェック...あなたの文字列の連結が間違っています。 –

+0

何も私に変更されていません。唯一の違いは、taht OPはdoble quotを使い、あなたは一重引用符を使用しているということです。これは同じ意味です。 –

2

する必要があります!それはSQL injectionの一般的な理由です。

それを行うための適切な方法は次のとおりです。詳細については

Dim command As New OleDbCommand() 
command.CommandText = _ 
    "SELECT <ListOfColumns>" & vbCr _ 
    "FROM YourTable WHERE Column1 = @Parameter1" 
command.Parameters.AddWithValue("@Parameter1", rmInloggen.strUsername) 

は、以下を参照してください。
OleDbCommand.Parameters Property
OleDbParameterCollection.AddWithValue Method (String, Object)

+0

申し訳ありませんが、私はそれには反応しませんでした。 –

+0

これをコンボボックスに挿入する方法は? –

+0

たとえば、[DataTable](https://msdn.microsoft.com/en-us/library/system.data.datatable(v = vs.110) .docファイルを編集するには、以下のようにしてください:DotOrdr = command.ExecuteReader()Dim oDt As DataTable = New DataTable dt.Load(oRdr) 'Combobox1.DataSource = dt'を使用してください –

0

読み込みする必要があります - スペースで:

strKlas = objDataReader("Select Klas FROM LEERLINGEN As L, BEHEER As B WHERE L.Leerlingnr='" & frmInloggen.strUsername & "' AND B.LEERLINGNR=L.LEERLINGNR") 
+0

申し訳ありませんが、これは私が戻ったものですが、私は非常に理解していないので、私は彼の解決策を@Maciej試していません。これが発生しました:System.Data.dllで 'System.IndexOutOfRangeException'型の処理されない例外が発生しました 追加情報:Lを選択してLE LELLINGENからL BEHEERをB WHERE L.Leerlingnr = ''およびB.LEERLINGNR = L.LEERLINGNR –

+0

'L.Leerlingnr = ''とB.LEERLINGNR = L.LEERLINGNR'の場合は、' 'L '、B':L '、L'' LINGINGNR ''の順で選択してください。 'frmInloggen.strUsername'は空です。 – Gustav

+0

@Gustavはい、私はその結論に達しました。しかし、プログラム全体が停止するまでその値を保持するために、別のフォームから変数を作成するにはどうすればいいですか? –