我知道我需要参数化我的查询,主要是出于安全原因,我需要帮助。我在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'。
可能是我错过了一些蠢事。
答案 0 :(得分:5)
您正在将SQL对象与OLEDB对象混合使用。看起来你正在使用OLEDB连接,这意味着你必须使用OLEDB-Objects,所以使用OleDbCommand而不是SqlCommand等。
您的参数行应如下所示:
.add(new OleDbParameter("@strname", strName))
对于OleDB查询,重要的是要意识到参数实际上忽略了名称@strname
,只是按索引顺序更新参数信息。因此,参数在sql语句中出现的顺序必须与提供参数的顺序相同。
答案 1 :(得分: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。
答案 2 :(得分: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,但它确实有帮助。
祝你好运