我正在为体育俱乐部制作预订系统申请表。在我的SQL Server数据库中,我有两个表;一个名为Memberships
,另一个名为Bookings
。
现在,我想要的是仅允许拥有会员资格的客户进行新预订。在数据库中,我通过cust_id
属性加入了两个表,其中Memberships
表是父表,Bookings
表是子表。我希望在尝试新预订时,首先应检查数据库中是否存在客户ID。如果它存在,则应允许预订,否则不允许。但是,我的代码首先显示错误,然后允许预订
这是我的代码:
Dim i As Integer
Dim str2 As String ' defines string variable for taking select query
str2 = "select Memberships.cust_id, booking_date, booking_time, booking_duration, game, poolno, courtno, tableno from Bookings, Memberships where Memberships.cust_id = Bookings.cust_id"
i = -1
Dim cmd2 As New SqlCommand(str2, con) 'defines a new sql command with str2 as query string and con as connection string
con.Open() 'sets the connection state to open
Dim bookchk As SqlDataReader = cmd2.ExecuteReader 'Defines and initiates the datareader to read data from database using cmd2 command
While bookchk.Read()
If Me.MskdTxtCustId.Text = bookchk("cust_id") Then
i = 1
End If
End While
bookchk.Close()
con.Close()
If i = -1 Then
MessageBox.Show("Error")
Exit Sub
End If
答案 0 :(得分:0)
为什么不在他们预订之前询问客户会员编号?
否则,您可以将会员编号设为必填字段。
我可以理解,如果检查数据库是否有效,请检查数据库是否有效,否则在连接数据库之前检查所需的数据。
答案 1 :(得分:0)
试试这个:
Dim sql As String
Dim customerIDyouWantToCheck As String
Dim i As Integer
i = 0
sql = "select cust_id from Memberships where Memberships.cust_id = '" & customerIDyouWantToCheck & "'"
Dim cmd2 As New SqlCommand(str2, con)
con.Open()
Dim bookchk As SqlDataReader = cmd2.ExecuteReader
If bookchk.HasRows() Then
i = 1
Else
i = -1
EndIf
我假设您知道要为其预订的客户的ID。否则我不确定你在做什么。
答案 2 :(得分:0)
处理这类事情的最佳方法是确保数据库首先返回您想要的内容。您是否尝试过针对sql-server直接运行查询?
您真正需要的是检查会员资格表首先中的客户ID,并且一旦单独建立了正确的客户,请继续插入预订表。 这些都是原子交易。
我认为你这个问题太复杂了。
答案 3 :(得分:0)
加载所有预订/会员组合并循环浏览它们以查找某个客户ID是不好的做法。 最好直接查询所需的客户ID。另外,您应该使用SQL参数而不是字符串连接来将客户ID传递给查询。
之前:
str2 = "select [...] where Memberships.cust_id = Bookings.cust_id"
i = -1
Dim cmd2 As New SqlCommand(str2, con)
之后:
str2 = "select [...] where Memberships.cust_id = Bookings.cust_id and Bookings.cust_id = @CustomerID"
i = -1
Dim cmd2 As New SqlCommand(str2, con)
cmd2.Parameters.Add(New SqlParameter("@CustomerID", SqlDbType.Int).Value = Me.MskdTxtCustId.Text)
关于您的实际问题:
但我的代码首先显示错误,然后允许预订
由于您没有显示预订的代码以及它与您展示的代码的关联方式,我们无法告诉您如何使用您发布的代码中的结果来确定预订是否已完成
您应该将您发布的代码包装在返回true或false的方法中,具体取决于是否允许预订。
'the CustomerHasMembership() method contains the code you posted and
'returns true when the customer DOES have a membership
If CustomerHasMembership(Me.MskdTxtCustId.Text) Then
DoBooking()
End If