2016-05-01 13 views
1

製造元のコンボボックスを使用したフォームがあります< < 1つのモデルを選択するモデルの場合は>> 番目のコンボボックス(cbModel)最初のテキストボックス(txtColour)に移動して、ccolourを入力してテキストボックス(txtRegNo)に登録します。追加車両のボタンを押して、だから私は薄暗いquerysStringラインaroundwithいじってきたこのコンボボックスの内容をSQLクエリで使用する

Private Sub CreateVehicle() 
    'Read in the model name and change it to a modelID no 
    Dim ticket As String = cbModel.Text 
    Dim queryString As String = "Select ModelID FROM Model WHERE Modelname = " & ticket & "' " 

    ' Run Query 
    SQL.RunQuery(queryString) 


    Dim da As New SqlClient.SqlDataAdapter() 
    Dim dt = New DataTable 
    da.Fill(dt) 

    'show what is in dt is now 
    MsgBox(dt) 

    'temporary break to get first part working 
    Exit Sub 

    If Len(cbModel.Text) >= 0 And Len(txtColour.Text) >= 0 And Len(txtRegNo.Text) >= 0 Then 

     'Add new user to database 
     SQL.AddVehicle(cbModel.Text, txtColour.Text, txtRegNo.Text) 
    Else 
     MsgBox("Please make sure you have filled in ALL Fields Correctly!") 
     Exit Sub 
    End If 

End Sub 

を取得するが、私はそれが仕事を得ることができない、私が得るすべてのエラーメッセージ「閉じられていない引用符は、文字列 『』の後にあります。その後、はInvalidOperation例外が未処理だった(私が思うに、これが満たされてdtが停止FRSTエラーが原因でしょうか?)私は徐々に狂っつもりですし、割り当てが終了したから遠く離れているよう

は誰が助けてください!おかげ

+0

あなたのselectステートメントには、引用符がありません。 – dinotom

+0

a)SQLパラメータを常に使用してください。b) 'SQL'は他のSQL" helper "のように見えますが、これは干渉しているかもしれません。 db Objectはクエリからクエリへの再利用性がほとんどありませんc)別のステップとしてデータ検証を行い、合格した場合のみ 'CreateVehicle'を呼び出す必要があります。 – Plutonix

答えて

0

私はかなりModelNameがいくつかのテのフィールドだと確信していますxtタイプ。これが正しければ、そのフィールドの値を検索する場合は、単一引用符で囲む必要があります。たとえば、

Dim queryString As String = "Select ModelID FROM Model " & _ 
          "WHERE Modelname = 'ValueToSearch'" 

代わりに、値の先頭に引用符がありません。だからあなたのコードが動作しないようにする単純なタイプミスです。
しかし、それを修正することは、私があなたに与えたいアドバイスではありません。代わりに、今

Dim queryString As String = "Select ModelID FROM Model " & _ 
          "WHERE Modelname = @model" 
' Run Query ' 
Dim da As New SqlClient.SqlDataAdapter(queryString, yourConnection) 
da.SelectCommand.Parameters.Add("@model", SqlDbType.NVarChar).Value = ticket 
Dim dt = New DataTable 
da.Fill(dt) 

パラメータ化クエリを使用しようと、

SQL.RunQuery(queryString) 

であなたのアプローチには、この方法を適用する方法を言うのは難しいですが、あなたは本当に彼らので、パラメータ化クエリを受け入れるようにそのコードを変更する必要がありますより安全で(Sql Injectionはありません)、あなたの値に引用符が存在するような単純な解析エラーの対象にはなりません。

+0

申し訳ありません@steveはここに新しいです、あなたは '@ mode'lに言及しています。 Dim ticket As String = cbModel.Text(これは私がクエリ用の可変チケットを作ったと信じていますが) '@model'を入れてしまったのですが、どういう存在ですか? runqueryに関しては、ロバの仕事は、それを呼び出すだけで、クエリーストリング内のクエリ文字列 –

+0

を選択できるようにします。_ @ model_ textは単なるプレースホルダです。クエリがSQL Serverのクエリを処理するコードによってクエリがデータベースエンジンに到達したときに、パラメータの実効値を適用する位置を設定します。コードには意味がありません。単なる文字列リテラルです。代わりにParameters.Add行は_ticket_変数の値を_ @ model_という名前のパラメータに関連付け、すべてのものは処理のためにデータベースエンジンに渡されます – Steve

+0

RunQueryコードについては、これらの「ヘルパー」をPlutonix彼らのコメントではまれに彼らがまったく助けなかったからだ。 – Steve

関連する問題