-1

我知道我需要参数化我的查询,主要是出于安全原因,我需要帮助。我在 Visual Studio 2012 和 SQL Server 2012 中使用 VB。我以前从未这样做过,我在网上找到的所有内容似乎都不适合我的特定代码。我认为需要工作的一点是:

objconnection.Open()

    strSQL = "insert into dbo.Event(ID, Name, Summary, Date) values (NEWID(), '" & strName & "','" & strSummary & "','" & strLocation & "','" & strDate & "')"
    objcmd = New OleDbCommand(strSQL, objconnection)
    objcmd.ExecuteNonQuery()
    objconnection.Close()
    MsgBox("Event Created", vbMsgBoxSetForeground)

任何指针都非常感谢。如果您需要更多代码,请告诉我!

来自评论:

我确实看过并尝试过,但我遇到了问题。在这部分:

.add(new SqlParameter("@strname", '"& strName &"'))

"@streventname" 和 '"strName"' 之间的 , 带有下划线,它说Expression expected.

Dim cmd As SqlCommand = New SqlCommand(cmdText, objconnection)

objconnection 收到错误“'System.Data.OleDb.OleDbConnection' 类型的值无法转换为 'System.Data.SqlClient.SqlConnection'。

可能是我错过了一些愚蠢的事情。

4

3 回答 3

5

您正在将 SQL 对象与 OLEDB 对象混合。看起来您正在使用 OLEDB 连接,这意味着您必须使用 OLEDB-Objects,因此请使用 OleDbCommand 而不是 SqlCommand 等。

您的参数行应如下所示:

.add(new OleDbParameter("@strname", strName))

对于 OleDB 查询,重要的是要意识到参数实际上是忽略名称@strname,只是按索引顺序更新参数信息。因此,参数在 sql 语句中出现的顺序必须与您提供参数的顺序相同。

于 2013-09-18T16:23:20.133 回答
1

感谢您的所有帮助。我设法解决了它。如果有人感兴趣,这就是我现在拥有的。

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strName As String = Request.Form("txtName")
        Dim strSummary As String = Request.Form("txtSummary")
        Dim strDate As String = Request.Form("txtDate")

        Dim objconnection As OleDbConnection = Nothing
        Dim objcmd As OleDbCommand = Nothing
        Dim strconnection As String, strSQL As String

        strconnection = "provider=SQLOLEDB;data source=XXX;database=Events;uid=XXX;pwd=XXX;"

        objconnection = New OleDbConnection(strconnection)
        objconnection.ConnectionString = strconnection

        objconnection.Open()

        strSQL = "insert into dbo.CreateApp(ID, Name, Summary, Date)values(NEWID(), ?, ?, ?)"
        objcmd = New OleDbCommand(strSQL, objconnection)
        objcmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("@Name", strName))
        objcmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("@Summary", strSummary))   
        objcmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("@Date", strDate))
        objcmd.ExecuteNonQuery()

        objconnection.Close()

    End Sub
End Class

关键是输入?s。

于 2013-09-19T15:06:37.137 回答
0

我同意 Lars 的观​​点,但你错过了 sql 错误的事实。这是一个更完整的例子。

    Dim sql = <value>insert into dbo.Event(ID, Name, Summary, Date) values (NEWID(),@Name,@Summary,@Date)</value>

    Using connection As OleDb.OleDbConnection(connectionString)
        Using command As New OleDb.OleDbCommand(sql.Value, connection)
            command.Parameters.AddWithValue("@Name", nameValue)
            command.Parameters.AddWithValue("@Summary", summaryValue)
            command.Parameters.AddWithValue("@Date", DateValue)

            command.ExecuteNonQuery()
        End Using
    End Using 

如果您不想打扰 ADO 并且正在寻找更简单的东西,我建议使用 Simple.Data http://simplefx.org/simpledata/docs/。到目前为止,它是无需 SQL 或 ADO 即可与数据库交互的最简单方法之一,但它确实有帮助。

祝你好运

于 2013-09-18T22:52:50.967 回答