古いVB Webアプリに小さな変更を加えようとしています。これまで運がなかった文字列内に引用符を追加する必要があります。文字列は
Dim sql As String = "Select * from Usertask Where UserId = " & Session("UserId") & " and JobID=" & ddlReqTask.SelectedValue
Session( "UserID")値を引用符で囲む必要があります。
""
を使用して、文字列に引用符を挿入できます。例:
dim sometext as String = "Hello ""Frank"" how are you?"
それはあなたに
こんにちは「フランク」お元気ですか?
見積もりをエスケープするには、別の見積もりを追加する必要があります。これが必要なものだと思います。
Dim sql As String = "Select * from Usertask Where UserId = """ & Session("UserId") & """ and JobID=" & ddlReqTask.SelectedValue
このようなアドホックSQLステートメントを作成するのではなく、パラメーター化されたSQLを使用することをお勧めします。これは、SQLインジェクションを受け入れることができるためです。これは、引用符を文字列に連結することを心配する必要がないことを意味します。また、実行プランのキャッシュと再利用が可能になるため、クエリのパフォーマンスも向上します(SQLサーバーを想定)。
例えば.
Dim sql As String = "Select * from Usertask Where UserId = ? AND JobID = ?"
次に、2つのADODB.ParametersをCommandオブジェクトに追加して、2つのパラメーターの値を指定します。
Set param = New ADODB.Parameter
param.Name = "@UserId"
param.Direction = adParamInput
param.Type = adVarChar
param.Size = (give size of user id field)
param.value = Session("UserId")
yourADOCommand.Parameters.Append param
また、JobIdパラメーターについても同じです。
これはSQLインジェクションの脆弱性であり、[〜#〜] not [〜#〜]実行する必要があります。このようにすることで、次のようなUserIdを与えることで、ユーザーが必要なクエリを実行できるようになります。
'; DROP TABLE Usertask; --
代わりに、パラメーターを使用してください。 SQLの実行方法に応じて、さまざまな方法があります。 SQLクエリを実行するコードを教えてください。
あなたの質問に答えて、
Dim StringWithQuotes As String = "Hello, I've got ""Quotes""!"
この文字列は
こんにちは、「見積もり」があります!
連結でChr(34)
を使用することもできます。
Dim sql As String = "Select * from Usertask Where UserId = " & Chr(34) & Replace(Session("UserId"), Chr(34), Chr(34) & Chr(34)) & Chr(34) & " and JobID=" & CLng(ddlReqTask.SelectedValue)
どちらの方法でも機能します(他の例とこれ)。混乱が少ないのでこれを好む人もいますが、上記の例は完全に判読可能であり、ロケット科学は非常に重要です。
私の経験では、ほとんどのSQLサーバーでは、文字列を一重引用符で囲む必要があります。そのための最良の方法は、SQLパラメータを使用して.netを自分で管理することです。これがサンプルです(VB.Netにもあります): http://www.knowdotnet.com/articles/dynamicsqlparameters.html
これには、SQLインジェクションに対するセキュリティの利点もあります。
こんな感じです..
dim user_id as string="SomePerson"
debug.print "UserId=" & chr(34) & user_id & Chr(34)
生成します。
UserID="SomePerson"