-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathSQLTableFields.cls
More file actions
executable file
·205 lines (148 loc) · 5.74 KB
/
SQLTableFields.cls
File metadata and controls
executable file
·205 lines (148 loc) · 5.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "SQLTableFields"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
' ___________________________________________________
'
' © Hi-Integrity Systems 2007. All rights reserved.
' www.hisystems.com.au - Toby Wicks
' ___________________________________________________
'
Option Explicit
Private Const pcintAlterModeUninitialized As Integer = -1
Private pcolFields As Collection
Private peAlterMode As SQLTableFieldsAlterModeEnum
Friend Property Let AlterMode(ByVal eValue As SQLTableFieldsAlterModeEnum)
peAlterMode = eValue
End Property
Friend Property Get AlterMode() As SQLTableFieldsAlterModeEnum
AlterMode = peAlterMode
End Property
Public Function Add( _
Optional ByVal strFieldName As String, _
Optional ByVal eDataType As DataTypeEnum = dboDataTypeVariableCharacter, _
Optional ByVal intSize As Integer = 0) As SQLTableField
EnsureAlterModeValid dboTableFieldsModeAdd
Dim objField As SQLTableField
Set objField = New SQLTableField
With objField
.Name = strFieldName
.DataType = eDataType
If intSize > 0 Then
.Size = intSize
End If
End With
pcolFields.Add objField
Set Add = objField
End Function
Public Property Get Item(ByVal strFieldName As String) As SQLTableField
Attribute Item.VB_UserMemId = 0
EnsureAlterModeValid dboTableFieldsModeAlter
Dim intIndex As Integer
strFieldName = Trim$(strFieldName)
intIndex = FieldNameIndex(strFieldName)
If intIndex = 0 Then
Set Item = New SQLTableField
Item.Name = strFieldName
pcolFields.Add Item
Else
Set Item = pcolFields(intIndex)
End If
End Property
Public Sub Drop(ByVal strFieldName As String)
EnsureAlterModeValid dboTableFieldsModeDrop
Dim objField As SQLTableField
Set objField = New SQLTableField
objField.Name = strFieldName
If FieldNameIndex(strFieldName) = 0 Then
pcolFields.Add objField
Else
RaiseError dboErrorInvalidArgument, "Field '" & strFieldName & "' already exists"
End If
End Sub
Public Property Get Count() As Integer
Count = pcolFields.Count
End Property
Public Property Get Enumerator() As IUnknown
Attribute Enumerator.VB_UserMemId = -4
Set Enumerator = pcolFields.[_NewEnum]
End Property
Private Function FieldNameIndex( _
ByVal strFieldName As String) As Integer
Dim intIndex As Integer
strFieldName = Trim$(strFieldName)
For intIndex = 1 To pcolFields.Count
If StrComp(pcolFields(intIndex).Name, strFieldName, vbTextCompare) = 0 Then
FieldNameIndex = intIndex
Exit For
End If
Next
End Function
Private Sub Class_Initialize()
Set pcolFields = New Collection
peAlterMode = pcintAlterModeUninitialized
End Sub
Friend Property Get SQL(ByVal eConnectionType As ConnectionTypeEnum, Optional ByVal bIncludeMode As Boolean = True) As String
Const cstrSeperator As String = ", "
Dim strSQL As String
Dim objField As SQLTableField
Dim bOnlyFieldName As Boolean
Dim strMode As String
bOnlyFieldName = peAlterMode = dboTableFieldsModeDrop
'Include mode when altering a table, otherwise when creating a table the mode is not required.
If bIncludeMode Then
Select Case peAlterMode
Case dboTableFieldsModeAdd:
strMode = "ADD"
Case dboTableFieldsModeAlter:
Select Case eConnectionType
Case dboConnectionTypeMySQL
strMode = "MODIFY COLUMN"
Case Else
strMode = "ALTER COLUMN"
End Select
Case dboTableFieldsModeDrop:
strMode = "DROP COLUMN"
End Select
Select Case eConnectionType
Case dboConnectionTypeMicrosoftAccess, dboConnectionTypeSQLServer
strSQL = strMode & " "
End Select
End If
For Each objField In pcolFields
If bIncludeMode Then
Select Case eConnectionType
Case dboConnectionTypeMySQL
strSQL = strSQL & strMode & " "
End Select
End If
strSQL = strSQL & objField.SQL(eConnectionType, bOnlyFieldName) & cstrSeperator
Next
SQL = Left$(strSQL, Len(strSQL) - Len(cstrSeperator)) 'remove the last comma and space
End Property
Private Sub EnsureAlterModeValid(ByVal eAlterMode As SQLTableFieldsAlterModeEnum)
'if the alter mode hasn't been set then any of the modes are valid
If peAlterMode = pcintAlterModeUninitialized Then
peAlterMode = eAlterMode
Else
If eAlterMode <> peAlterMode Then
RaiseError dboErrorMethodOrPropertyLocked, "Cannot mix " & AlterModeDescription(peAlterMode) & " fields and " & AlterModeDescription(eAlterMode) & " fields into one SQL statement"
End If
End If
End Sub
Private Function AlterModeDescription(ByVal eAlterMode As SQLTableFieldsAlterModeEnum) As String
Select Case eAlterMode
Case dboTableFieldsModeAdd: AlterModeDescription = "adding"
Case dboTableFieldsModeAlter: AlterModeDescription = "altering"
Case dboTableFieldsModeDrop: AlterModeDescription = "dropping"
End Select
End Function