【问题标题】:How to insert customer details into Orders table如何将客户详细信息插入订单表
【发布时间】:2012-05-04 17:35:46
【问题描述】:

我的任务是构建一个基本的数据库驱动的电子商务网站。我有一个主页、一个产品页面、一个订单页面、一个订单确认页面、一个购物车页面和一个查看当前订单页面。该站点使用具有三个表的 Access 数据库。

一个客户表,包含所有客户详细信息(FirstName、LastName、EmailAdd、CardNo、CardEx、SortCode、DeliveryAdd、Postcode)

一个 Products 表,包含所有产品信息(ProductID、ProductName、Price、ProductType、Images、ProductDescription)。

还有一个包含 CustomerID 和 ProductID 的 Orders 表。

我正在尝试在订单页面上创建一个 INSERT 语句,以便当客户插入他们的详细信息并按下提交按钮时,客户表将插入一条新记录。我还希望它在订单表中创建一个条目,并将客户端重定向到订单确认页面,该页面将显示订单的详细信息。

这是我的代码,当单击订单上的提交按钮时运行。

编辑我已经修复了缺少撇号的错误。尝试使用两个 sql 命令插入,因为我被告知 access 数据库不能同时处理两个。不过还是报错。

  Protected Sub btnAddRecord_Click(ByVal sender As Object, ByVal e As System.EventArgs)

    Dim strFirstName As String
    Dim strLastName As String
    Dim strEmailAdd As String
    Dim intCardNo As String
    Dim strCardEx As String
    Dim intSortCode As String
    Dim strDeliveryAdd As String
    Dim strPostCode As String
    Dim intProductID As Integer
    strFirstName = tbxFirstName.Text
    strLastName = tbxLastName.Text
    strEmailAdd = tbxEmailAdd.Text
    intCardNo = tbxCardNo.Text
    strCardEx = tbxCardEx.Text
    intSortCode = tbxSortCode.Text
    strDeliveryAdd = tbxDeliveryAdd.Text
    strPostCode = tbxPostcode.Text
    intProductID = ddlProduct.SelectedValue
    
    Dim strDatabaseNameAndLocation As String
    strDatabaseNameAndLocation = Server.MapPath("KingToots.mdb")
    Dim strSQLCommand As String
    strSQLCommand = "INSERT INTO Customer(FirstName, LastName, EmailAdd, CardNo, CardEx, SortCode, DeliveryAdd, Postcode) " & _
        "Values ('" & strFirstName & "', '" & strLastName & "', '" & strEmailAdd & "', '" & intCardNo & "', '" & strCardEx & "', '" & intSortCode & "', '" & strDeliveryAdd & "', '" & strPostCode & "');"
    Dim objOleDbConnection As System.Data.OleDb.OleDbConnection
    objOleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=" & strDatabaseNameAndLocation)
    objOleDbConnection.Open()
    Dim objOleDbCommand As System.Data.OleDb.OleDbCommand
    objOleDbCommand = New System.Data.OleDb.OleDbCommand(strSQLCommand, objOleDbConnection)
    objOleDbCommand.ExecuteNonQuery()
    objOleDbConnection.Close()
    strSQLCommand = "INSERT INTO Orders(ProductID) " & "Values ('" & intProductID & "');"
    objOleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=" & strDatabaseNameAndLocation)
    objOleDbConnection.Open()
    objOleDbCommand = New System.Data.OleDb.OleDbCommand(strSQLCommand, objOleDbConnection)
    objOleDbCommand.ExecuteNonQuery()
    objOleDbConnection.Close()
    strSQLCommand = "SELECT Customer.* FROM Customer ORDER BY Customer.CustomerID DESC;"
    objOleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=" & strDatabaseNameAndLocation)
    objOleDbConnection.Open()
    objOleDbCommand = New System.Data.OleDb.OleDbCommand(strSQLCommand, objOleDbConnection)
    Dim objOleDbDataReader As System.Data.OleDb.OleDbDataReader
    objOleDbDataReader = objOleDbCommand.ExecuteReader()
    Dim datDataTable As System.Data.DataTable
    datDataTable = New System.Data.DataTable()
    datDataTable.Load(objOleDbDataReader)
    objOleDbConnection.Close()
    tbxFirstName.Text = ""
    tbxLastName.Text = ""
    tbxEmailAdd.Text = ""    
    tbxCardNo.Text = ""
    tbxCardEx.Text = ""
    tbxSortCode.Text = ""
    tbxDeliveryAdd.Text = ""
    tbxPostcode.Text = ""

End Sub

【问题讨论】:

  • 您的代码是SQL-Injection的正式邀请。使用parameters
  • 如果您不担心 SQL 注入,请发布将要托管的链接;我相信这里有人会在几秒钟内告诉你为什么......(一定要备份数据库!并期望客户或订单表“消失”
  • 您好,它托管在大学服务器上,需要用户名和密码,以便讲师对其进行标记。我不认为我可以提供直接链接。

标签: sql vb.net e-commerce


【解决方案1】:

您在此行末尾缺少右引号:

strSQLCommand = "INSERT INTO Customer(FirstName, LastName, EmailAdd, CardNo, CardEx, SortCode, DeliveryAdd, Postcode) " & _
    "Values ('" & strFirstName & "', '" & strLastName & "', '" & strEmailAdd & "', '" & intCardNo & "', '" & strCardEx & "', '" & intSortCode & "', '" & strDeliveryAdd & "', '" & strPostCode & ");"

关于明显的 SQL 注入问题,切换到参数将是最好的方法(如果这样做,您将永远不会遇到原始问题,参数不使用引号),但至少运行替换您的字符串以将 ' 替换为 '',这样您的程序就不会在您有一个叫 O'Neil 的客户时死掉。

【讨论】:

  • 好的,谢谢,我一直在关注如何插入记录的 uni 笔记。没有考虑过像奥尼尔这样的名字的问题。我更关心的是在我剩下的时间里让它启动并运行。已输入缺少的 ' 现在我收到错误“SQL 语句结束后找到的字符。”
  • 哦,它是一个 Access“数据库”,对。您必须将语句拆分为多个命令并分别发送。 Access 不支持在同一命令中使用多个语句,这与 Sql Server 不同。
  • 谢谢 我明白你的意思,不太清楚该怎么做。我试了一下,但我仍然收到“extra characters at end”错误。
  • 您在同一命令中连接两个插入语句。只需发送一个然后另一个,就像您使用 select 语句一样(它使用不同的命令!)。我假设您不会太在意不浪费资源或适当的 ADO.NET 编程技术,只是一种快速而肮脏的方式来实现它。
  • 是的,又快又脏是我追求的!我已经在那里的问题中更新了我当前的代码。和以前一样的错误,显然我需要更多的练习!
【解决方案2】:

他是对的,你不想这样做你会得到sql注入。但无论如何,这是解决您问题的方法。

问题不在最后一条sql语句,而在前一条。

'" & strPostCode & " 缺少最后一个单引号。

应该是:

'" & strPostCode & "');

【讨论】:

  • 非常感谢。现在我收到错误“SQL 语句结束后找到的字符”。我还有哪里出错了?
  • 将sql语句打印到屏幕并粘贴到这里
  • 您好我已经更新了我的页面。现在,当我提交表单时,它给了我一个溢出错误。我的代码仍然有问题,还是您认为是其他原因导致了问题?谢谢。
  • 啊,没关系,我的访问数据库中的数字数据类型是问题所在。谢谢
猜你喜欢
  • 2016-12-28
  • 2015-01-28
  • 2014-07-10
  • 2023-02-01
  • 2011-12-11
  • 2014-05-15
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多