From: Richard B. <rb...@us...> - 2004-10-18 03:32:02
|
Update of /cvsroot/jcframework/dotnet In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15129 Modified Files: CClassMap.vb CConnection.vb CCursor.vb CMsAccessDatabase.vb CMsSqlDatabase.vb CMySqlDatabase.vb CODBCDatabase.vb CPersistenceBroker.vb CRelationalDatabase.vb CSqlStatement.vb Log Message: Fixed for ANSI Null behaviour. New parameter in Db config called "ansinulls" to control behaviour of the system when generating SQL for NULL values in the where clause. (bug 1046809) Index: CRelationalDatabase.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CRelationalDatabase.vb,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- CRelationalDatabase.vb 28 Sep 2004 07:30:33 -0000 1.19 +++ CRelationalDatabase.vb 18 Oct 2004 03:31:51 -0000 1.20 @@ -49,6 +49,7 @@ ''' </history> '''----------------------------------------------------------------------------- Property ConnectionPool() As Stack + Property UseANSINulls() As Boolean '''----------------------------------------------------------------------------- ''' <summary> ''' Releases a connection @@ -582,6 +583,7 @@ Private m_connectionPool As Stack Private m_name As String Private m_oidTablename As String + Private m_useAnsiNulls As Boolean Protected m_disposed As Boolean '''----------------------------------------------------------------------------- @@ -641,6 +643,15 @@ End Set End Property + Public Property UseANSINulls() As Boolean Implements _CRelationalDatabase.UseANSINulls + Get + Return m_useAnsiNulls + End Get + Set(ByVal Value As Boolean) + m_useAnsiNulls = Value + End Set + End Property + Public Sub New() MyBase.New() m_connectionPool = New Stack Index: CPersistenceBroker.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CPersistenceBroker.vb,v retrieving revision 1.67 retrieving revision 1.68 diff -u -d -r1.67 -r1.68 --- CPersistenceBroker.vb 18 Oct 2004 01:36:43 -0000 1.67 +++ CPersistenceBroker.vb 18 Oct 2004 03:31:51 -0000 1.68 @@ -298,28 +298,28 @@ End If obj.IsLoading = True - Dim statement As CSqlStatement - If useFind Then - statement = cm.getSQLFind(Me, Nothing) - Else - statement = cm.getSQLRetrieve(Me, Nothing) - End If + Dim statement As New CSqlStatement cm2 = cm Do If useFind Then For i = 1 To cm2.getFindSize am = cm2.FindAttributeMaps(i) - statement.addSqlParameter(i, obj.getValueByAttribute(am.Name), am.ColumnMap) + statement.addSqlParameter(i, obj.GetValueByAttribute(am.Name), am.ColumnMap) Next i cm2 = cm2.SuperClass Else For i = 1 To cm2.getKeySize am = cm2.getKeyAttributeMap(i) - statement.addSqlParameter(i, obj.getValueByAttribute(am.Name), am.ColumnMap) + statement.addSqlParameter(i, obj.GetValueByAttribute(am.Name), am.ColumnMap) Next i cm2 = Nothing End If Loop While Not cm2 Is Nothing + If useFind Then + statement.SqlString = cm.getSQLFind(Me, statement.Parameters) + Else + statement.SqlString = cm.getSQLRetrieve(Me, statement.Parameters) + End If joins = cm.Joins @@ -377,11 +377,11 @@ 'Only process one-to-one relationships on the first record retrieved If udamap.Cardinality = CUDAMap.CardinalityEnum.ONE_TO_ONE And i = 0 Then gotValue = False - targetobj = obj.getObjectByAttribute(udamap.Target) + targetobj = obj.GetObjectByAttribute(udamap.Target) If Not targetobj Is Nothing Then 'if the class as child classes then check if the targetobj is of type child If cm2.ChildrenMaps.Count > 0 Then - cm3 = targetobj.getClassMap() + cm3 = targetobj.GetClassMap() cm2.retrieveObject(cm3, targetobj, rs, joins.GetTableAlias(cm3)) Else cm2.retrieveObject(cm2, targetobj, rs, mapName) @@ -455,7 +455,7 @@ End If End If ElseIf udamap.Cardinality = CUDAMap.CardinalityEnum.ONE_TO_MANY Then - col = obj.getCollectionByAttribute(udamap.Target) + col = obj.GetCollectionByAttribute(udamap.Target) 'Check whether the object is of child type If udamap.ForClass.ChildrenMaps.Count > 0 Then Index: CCursor.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CCursor.vb,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- CCursor.vb 18 Oct 2004 00:08:10 -0000 1.10 +++ CCursor.vb 18 Oct 2004 03:31:51 -0000 1.11 @@ -236,17 +236,25 @@ ''' </history> '''----------------------------------------------------------------------------- Public Sub loadObject(ByRef obj As Object) - loadObject(obj, 0) + If obj.GetType.IsSubclassOf(GetType(CPersistentObject)) OrElse TypeOf (obj) Is CPersistentObject Then + loadPersistentObject(obj) + Else + loadObject(obj, 0) + End If End Sub Public Sub loadObject(ByRef obj As Object, ByVal offset As Integer) + If obj.GetType.IsSubclassOf(GetType(CPersistentObject)) OrElse TypeOf (obj) Is CPersistentObject Then + loadPersistentObject(obj, offset) + Exit Sub + End If Dim _alias As String = "" Dim mr As CMultiRetrieveCriteria Dim clMap As CClassMap Dim pbroker As CPersistenceBroker = modPersistenceBrokerSingleton.getPersistenceBrokerInstance Dim injObj As CInjectedObject - injobj = pbroker.LocateOrCreateInjObject(obj) + injObj = pbroker.LocateOrCreateInjObject(obj) If Not m_parentCriteria Is Nothing Then If m_parentCriteria.GetType Is GetType(CMultiRetrieveCriteria) Then mr = m_parentCriteria @@ -272,11 +280,11 @@ clMap = pbroker.getClassMap(obj.GetType) If Not m_holdsProxies Then - clMap.retrieveObject(injobj, m_row) + clMap.retrieveObject(injObj, m_row) If clMap.AssociationMapCount > 0 Then - injobj.AssociationsLoaded = False + injObj.AssociationsLoaded = False Else - injobj.AssociationsLoaded = True + injObj.AssociationsLoaded = True End If pbroker.InjectedObjects.Add(injObj) Else @@ -287,7 +295,7 @@ End If End Sub - Public Sub loadObject(ByRef obj As CPersistentObject) + Public Sub loadPersistentObject(ByRef obj As CPersistentObject) loadObject(obj, 0) End Sub @@ -314,7 +322,7 @@ ''' [rbanks] 4/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- - Public Sub loadObject(ByRef obj As CPersistentObject, ByVal offset As Integer) + Public Sub loadPersistentObject(ByRef obj As CPersistentObject, ByVal offset As Integer) 'TO DO: Handle errors Dim _alias As String = "" Dim cm As CMultiRetrieveCriteria Index: CMsSqlDatabase.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CMsSqlDatabase.vb,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- CMsSqlDatabase.vb 11 Oct 2004 23:03:38 -0000 1.18 +++ CMsSqlDatabase.vb 18 Oct 2004 03:31:51 -0000 1.19 @@ -99,6 +99,11 @@ m_serverName = properties.Item("serverName") m_user = properties.Item("user") m_password = properties.Item("password") + If properties.Item("ansinulls") Is Nothing Then + UseANSINulls = False + Else + UseANSINulls = properties.Item("ansinulls") + End If MyBase.OIDTable = properties.Item("OIDTable") End Sub Index: CConnection.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CConnection.vb,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- CConnection.vb 6 Oct 2004 23:42:24 -0000 1.26 +++ CConnection.vb 18 Oct 2004 03:31:51 -0000 1.27 @@ -413,11 +413,13 @@ m_command.CommandText = statement.SqlString 'new bit for parameters For Each cp In statement.Parameters - param = New OleDbParameter - param.ParameterName = cp.Name - param.OleDbType = CType(cp.Column.ProviderType, System.Data.OleDb.OleDbType) - param.Value = cp.Value - m_command.Parameters.Add(param) + If Not cp.Ignore Then + param = New OleDbParameter + param.ParameterName = cp.Name + param.OleDbType = CType(cp.Column.ProviderType, System.Data.OleDb.OleDbType) + param.Value = cp.Value + m_command.Parameters.Add(param) + End If Next m_command.Transaction = m_transaction @@ -455,11 +457,13 @@ m_command.Connection = m_connection m_command.CommandText = statement.SqlString For Each cp As CSQLParameter In statement.Parameters - param = New OleDbParameter - param.ParameterName = cp.Name - param.OleDbType = CType(cp.Column.ProviderType, OleDbType) - param.Value = cp.Value - m_command.Parameters.Add(param) + If Not cp.Ignore Then + param = New OleDbParameter + param.ParameterName = cp.Name + param.OleDbType = CType(cp.Column.ProviderType, OleDbType) + param.Value = cp.Value + m_command.Parameters.Add(param) + End If Next Try @@ -866,20 +870,22 @@ m_command.Connection = m_connection m_command.CommandText = statement.SqlString For Each cp In statement.Parameters - param = New SqlParameter - param.ParameterName = cp.Name - param.SqlDbType = CType(cp.Column.ProviderType, SqlDbType) - If TypeOf (cp.Value) Is DateTime Then - dd = cp.Value - If dd.Ticks = 0 Then - dd = DateAdd(DateInterval.Year, 1899, dd) - Else - dd = New Date(dd.Year, dd.Month, dd.Day, dd.Hour, dd.Minute, dd.Second, 0) + If Not cp.Ignore Then + param = New SqlParameter + param.ParameterName = cp.Name + param.SqlDbType = CType(cp.Column.ProviderType, SqlDbType) + If TypeOf (cp.Value) Is DateTime Then + dd = cp.Value + If dd.Ticks = 0 Then + dd = DateAdd(DateInterval.Year, 1899, dd) + Else + dd = New Date(dd.Year, dd.Month, dd.Day, dd.Hour, dd.Minute, dd.Second, 0) + End If + cp.Value = dd End If - cp.Value = dd + param.Value = cp.Value + m_command.Parameters.Add(param) End If - param.Value = cp.Value - m_command.Parameters.Add(param) Next m_command.Transaction = m_transaction Debug.WriteLine(m_command.CommandText) @@ -920,20 +926,22 @@ m_command.Connection = m_connection m_command.CommandText = statement.SqlString For Each cp As CSQLParameter In statement.Parameters - param = New SqlParameter - param.ParameterName = cp.Name - param.SqlDbType = CType(cp.Column.ProviderType, SqlDbType) - If TypeOf (cp.Value) Is DateTime Then - dd = cp.Value - If dd.Ticks = 0 Then - dd = DateAdd(DateInterval.Year, 1899, dd) - Else - dd = New Date(dd.Year, dd.Month, dd.Day, dd.Hour, dd.Minute, dd.Second, 0) + If Not cp.Ignore Then + param = New SqlParameter + param.ParameterName = cp.Name + param.SqlDbType = CType(cp.Column.ProviderType, SqlDbType) + If TypeOf (cp.Value) Is DateTime Then + dd = cp.Value + If dd.Ticks = 0 Then + dd = DateAdd(DateInterval.Year, 1899, dd) + Else + dd = New Date(dd.Year, dd.Month, dd.Day, dd.Hour, dd.Minute, dd.Second, 0) + End If + cp.Value = dd End If - cp.Value = dd + param.Value = cp.Value + m_command.Parameters.Add(param) End If - param.Value = cp.Value - m_command.Parameters.Add(param) Next Try @@ -1370,11 +1378,13 @@ m_command.Connection = m_connection m_command.CommandText = statement.SqlString For Each cp In statement.Parameters - param = New MySqlParameter - param.ParameterName = cp.Name - param.MySqlDbType = CType(cp.Column.ProviderType, MySqlDbType) - param.Value = cp.Value - m_command.Parameters.Add(param) + If Not cp.Ignore Then + param = New MySqlParameter + param.ParameterName = cp.Name + param.MySqlDbType = CType(cp.Column.ProviderType, MySqlDbType) + param.Value = cp.Value + m_command.Parameters.Add(param) + End If Next m_command.Transaction = m_transaction m_recordcount = m_command.ExecuteNonQuery() @@ -1414,11 +1424,13 @@ m_command.Connection = m_connection m_command.CommandText = statement.SqlString For Each cp In statement.Parameters - param = New MySqlParameter - param.ParameterName = cp.Name - param.MySqlDbType = CType(cp.Column.ProviderType, MySqlDbType) - param.Value = cp.Value - m_command.Parameters.Add(param) + If Not cp.Ignore Then + param = New MySqlParameter + param.ParameterName = cp.Name + param.MySqlDbType = CType(cp.Column.ProviderType, MySqlDbType) + param.Value = cp.Value + m_command.Parameters.Add(param) + End If Next Try @@ -1793,11 +1805,13 @@ m_command.CommandText = statement.SqlString 'new bit for parameters For Each cp In statement.Parameters - param = New OdbcParameter - param.ParameterName = cp.Name - param.OdbcType = CType(cp.Column.ProviderType, System.Data.odbc.OdbcType) - param.Value = cp.Value - m_command.Parameters.Add(param) + If Not cp.Ignore Then + param = New OdbcParameter + param.ParameterName = cp.Name + param.OdbcType = CType(cp.Column.ProviderType, System.Data.odbc.OdbcType) + param.Value = cp.Value + m_command.Parameters.Add(param) + End If Next m_command.Transaction = m_transaction @@ -1834,11 +1848,13 @@ m_command.Connection = m_connection m_command.CommandText = statement.SqlString For Each cp As CSQLParameter In statement.Parameters - param = New OdbcParameter - param.ParameterName = cp.Name - param.OdbcType = CType(cp.Column.ProviderType, System.Data.odbc.OdbcType) - param.Value = cp.Value - m_command.Parameters.Add(param) + If Not cp.Ignore Then + param = New OdbcParameter + param.ParameterName = cp.Name + param.OdbcType = CType(cp.Column.ProviderType, System.Data.odbc.OdbcType) + param.Value = cp.Value + m_command.Parameters.Add(param) + End If Next Try Index: CODBCDatabase.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CODBCDatabase.vb,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- CODBCDatabase.vb 28 Sep 2004 07:30:32 -0000 1.4 +++ CODBCDatabase.vb 18 Oct 2004 03:31:51 -0000 1.5 @@ -51,6 +51,11 @@ '''----------------------------------------------------------------------------- Public Overrides Sub init(ByVal properties As HybridDictionary) m_connectionString = properties.Item("name") + If properties.Item("ansinulls") Is Nothing Then + UseANSINulls = False + Else + UseANSINulls = properties.Item("ansinulls") + End If MyBase.OIDTable = properties.Item("OIDTable") End Sub Index: CMySqlDatabase.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CMySqlDatabase.vb,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- CMySqlDatabase.vb 28 Sep 2004 07:30:32 -0000 1.19 +++ CMySqlDatabase.vb 18 Oct 2004 03:31:51 -0000 1.20 @@ -120,6 +120,11 @@ m_password = properties.Item("password") m_portNumber = properties.Item("portNumber") m_option = properties.Item("option") + If properties.Item("ansinulls") Is Nothing Then + UseANSINulls = False + Else + UseANSINulls = properties.Item("ansinulls") + End If MyBase.OIDTable = properties.Item("OIDTable") End Sub Index: CMsAccessDatabase.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CMsAccessDatabase.vb,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- CMsAccessDatabase.vb 28 Sep 2004 07:30:32 -0000 1.17 +++ CMsAccessDatabase.vb 18 Oct 2004 03:31:51 -0000 1.18 @@ -55,6 +55,11 @@ m_name = properties.Item("name") m_user = properties.Item("user") m_password = properties.Item("password") + If properties.Item("ansinulls") Is Nothing Then + UseANSINulls = False + Else + UseANSINulls = properties.Item("ansinulls") + End If MyBase.OIDTable = properties.Item("OIDTable") End Sub Index: CClassMap.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CClassMap.vb,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- CClassMap.vb 18 Oct 2004 01:36:43 -0000 1.35 +++ CClassMap.vb 18 Oct 2004 03:31:51 -0000 1.36 @@ -63,6 +63,8 @@ Private m_joinSet As CJoin Private m_sqlFindStatement As CSqlStatement Private m_sqlRetrieveStatement As CSqlStatement + Private m_updateWhereParamPosition As Integer + Private m_insertWhereParamPosition As Integer Private m_classFactoryName As String Private m_classFactory As IClassFactory @@ -777,17 +779,33 @@ m_deleteStatement.addSqlClause(Me.RelationalDatabase.getClauseStringWhere & " ") For i = 1 To Me.getKeySize map = Me.getKeyAttributeMap(i) - If i = 1 Then - 'm_deleteStatement.addSqlClause(map.ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(obj.getValueByAttribute(map.Name)))) - m_deleteStatement.addSqlClause(map.ColumnMap.getFullyQualifiedName & "=" & m_relationalDatabase.getParamHolder(i)) - Else - 'm_deleteStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & map.ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(obj.getValueByAttribute(map.Name)))) - m_deleteStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & map.ColumnMap.getFullyQualifiedName & "=" & m_relationalDatabase.getParamHolder(i)) + If i > 1 Then + m_deleteStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " ") End If + 'm_deleteStatement.addSqlClause(map.ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(obj.getValueByAttribute(map.Name)))) + 'm_deleteStatement.addSqlClause(map.ColumnMap.getFullyQualifiedName & "=" & m_relationalDatabase.getParamHolder(i)) + m_deleteStatement.addSqlClause(map.ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo("_" & i.ToString & "_")) m_deleteStatement.addSqlParameter(i, obj.GetValueByAttribute(map.Name), map.ColumnMap) Next i End If - getDeleteSqlFor = m_deleteStatement + + Dim x As String = m_deleteStatement.SqlString + Dim p As CSQLParameter + For i = 1 To Me.getKeySize + p = m_deleteStatement.Parameters.Item(i) + If IsNullAlias(p.Value) Then + If Me.RelationalDatabase.UseANSINulls = False Then + x = x.Replace(" = _" & i.ToString & "_", " is NULL") + p.Ignore = True + Else + x = x.Replace("_" & i.ToString & "_", Me.RelationalDatabase.getParamHolder(i)) + End If + Else + x = x.Replace("_" & i.ToString & "_", Me.RelationalDatabase.getParamHolder(i)) + End If + Next + m_deleteStatement.SqlString = x + Return m_deleteStatement End Function '''----------------------------------------------------------------------------- @@ -1216,107 +1234,122 @@ ''' </history> '''----------------------------------------------------------------------------- Public Function getUpdateSqlFor(ByVal obj As IPersistableObject) As CSqlStatement - If Not m_updateStatement Is Nothing Then - m_updateStatement = Nothing - End If + Dim AttrMap As CAttributeMap Dim i As Short, paramCount As Short Dim isFirst As Boolean - If m_updateStatement Is Nothing Then - 'New statement - m_updateStatement = New CSqlStatement - 'Add UPDATE clause - 'Use the save query to improve speed if it exists - If m_sqlUpdateStub.Length > 0 Then - m_updateStatement.addSqlClause(m_sqlUpdateStub) - Else - m_updateStatement.addSqlClause(RelationalDatabase.getClauseStringUpdate & " ") - AttrMap = getAttributeMap(1) - If Not AttrMap Is Nothing Then - m_updateStatement.addSqlClause(AttrMap.ColumnMap.TableMap.Name & " ") - End If - 'add each field - m_updateStatement.addSqlClause(RelationalDatabase.getClauseStringSet & " ") - isFirst = True - For i = 1 To Me.getSize - AttrMap = Me.getAttributeMap(i) - If Not AttrMap.ColumnMap.IsIdentity Then - If Not isFirst Then - m_updateStatement.addSqlClause(", " & Me.getAttributeMap(i).ColumnMap.Name & "=" & m_relationalDatabase.getParamHolder(i)) - Else - 'This is the first attribute - m_updateStatement.addSqlClause("" & Me.getAttributeMap(i).ColumnMap.Name & "=" & m_relationalDatabase.getParamHolder(i)) - isFirst = False - End If - End If - Next i - m_sqlUpdateStub = m_updateStatement.SqlString + m_updateStatement = New CSqlStatement + 'Add UPDATE clause + 'Use the save query to improve speed if it exists + If m_sqlUpdateStub.Length > 0 Then + m_updateStatement.addSqlClause(m_sqlUpdateStub) + Else + m_updateStatement.addSqlClause(RelationalDatabase.getClauseStringUpdate & " ") + AttrMap = getAttributeMap(1) + If Not AttrMap Is Nothing Then + m_updateStatement.addSqlClause(AttrMap.ColumnMap.TableMap.Name & " ") End If - - 'Add Parameter values + 'add each field + m_updateStatement.addSqlClause(RelationalDatabase.getClauseStringSet & " ") + isFirst = True For i = 1 To Me.getSize AttrMap = Me.getAttributeMap(i) If Not AttrMap.ColumnMap.IsIdentity Then - m_updateStatement.addSqlParameter(i, obj.GetValueByAttribute(AttrMap.Name), AttrMap.ColumnMap) + If Not isFirst Then + m_updateStatement.addSqlClause(", " & Me.getAttributeMap(i).ColumnMap.Name & "=" & m_relationalDatabase.getParamHolder(i)) + Else + 'This is the first attribute + m_updateStatement.addSqlClause("" & Me.getAttributeMap(i).ColumnMap.Name & "=" & m_relationalDatabase.getParamHolder(i)) + isFirst = False + End If End If Next i - paramCount = Me.getSize - 'Add WHERE clause - m_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringWhere & " ") - isFirst = True + m_sqlUpdateStub = m_updateStatement.SqlString + End If + m_updateWhereParamPosition = Me.getSize - 'Need to set where clause based on original values for key fields, - 'not on the current values, otherwise the update statement - 'may reference a non-existant column, or a wrong record. - 'Note: this would only occur if the key values for an object were changed - Dim keyValuesCol As New Collection - If Not obj.OriginalCacheKey Is Nothing Then - For i = 1 To Me.getKeySize - AttrMap = Me.getKeyAttributeMap(i) - 'keyValuesCol.Add(m_relationalDatabase.getValueFor(obj.OriginalCacheKey.GetKeyValue(i))) - keyValuesCol.Add(obj.OriginalCacheKey.GetKeyValue(i)) - Next - Else - For i = 1 To Me.getKeySize - AttrMap = Me.getKeyAttributeMap(i) - 'keyValuesCol.Add(m_relationalDatabase.getValueFor(obj.getValueByAttribute(AttrMap.Name))) - keyValuesCol.Add(obj.GetValueByAttribute(AttrMap.Name)) - Next + 'Add Parameter values + For i = 1 To Me.getSize + AttrMap = Me.getAttributeMap(i) + If Not AttrMap.ColumnMap.IsIdentity Then + m_updateStatement.addSqlParameter(i, obj.GetValueByAttribute(AttrMap.Name), AttrMap.ColumnMap) End If + Next i + paramCount = Me.getSize + 'Add WHERE clause + m_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringWhere & " ") + isFirst = True + 'Need to set where clause based on original values for key fields, + 'not on the current values, otherwise the update statement + 'may reference a non-existant column, or a wrong record. + 'Note: this would only occur if the key values for an object were changed + Dim keyValuesCol As New Collection + If Not obj.OriginalCacheKey Is Nothing Then For i = 1 To Me.getKeySize AttrMap = Me.getKeyAttributeMap(i) + 'keyValuesCol.Add(m_relationalDatabase.getValueFor(obj.OriginalCacheKey.GetKeyValue(i))) + keyValuesCol.Add(obj.OriginalCacheKey.GetKeyValue(i)) + Next + Else + For i = 1 To Me.getKeySize + AttrMap = Me.getKeyAttributeMap(i) + 'keyValuesCol.Add(m_relationalDatabase.getValueFor(obj.getValueByAttribute(AttrMap.Name))) + keyValuesCol.Add(obj.GetValueByAttribute(AttrMap.Name)) + Next + End If + + For i = 1 To Me.getKeySize + AttrMap = Me.getKeyAttributeMap(i) + paramCount += 1 + If Not isFirst Then + 'm_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & AttrMap.ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(keyValuesCol.Item(i)))) + 'm_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & AttrMap.ColumnMap.getFullyQualifiedName & "=" & m_relationalDatabase.getParamHolder(paramCount)) + m_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd) + End If + 'm_updateStatement.addSqlClause("" & AttrMap.ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(keyValuesCol.Item(i)))) + 'm_updateStatement.addSqlClause(AttrMap.ColumnMap.getFullyQualifiedName & "=" & m_relationalDatabase.getParamHolder(paramCount)) + m_updateStatement.addSqlClause(" " & AttrMap.ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo("_" & paramCount.ToString & "_")) + isFirst = False + m_updateStatement.addSqlParameter(paramCount, keyValuesCol.Item(i), AttrMap.ColumnMap) + Next i + If Not Me.SharedTableField Is Nothing Then + If Not isFirst Then + m_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & Me.SharedTableField & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(Me.SharedTableValue))) + Else + m_updateStatement.addSqlClause("" & RelationalDatabase.getClauseStringAnd & " " & Me.SharedTableField & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(Me.SharedTableValue))) + isFirst = False + End If + End If + For i = 1 To Me.getSize + 'process timestamp attributes + If Me.getAttributeMap(i).isTimeStamp Then paramCount += 1 - If Not isFirst Then - 'm_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & AttrMap.ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(keyValuesCol.Item(i)))) - m_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & AttrMap.ColumnMap.getFullyQualifiedName & "=" & m_relationalDatabase.getParamHolder(paramCount)) - Else - 'm_updateStatement.addSqlClause("" & AttrMap.ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(keyValuesCol.Item(i)))) - m_updateStatement.addSqlClause("" & AttrMap.ColumnMap.getFullyQualifiedName & "=" & m_relationalDatabase.getParamHolder(paramCount)) - isFirst = False - End If - m_updateStatement.addSqlParameter(paramCount, keyValuesCol.Item(i), AttrMap.ColumnMap) - Next i - If Not Me.SharedTableField Is Nothing Then - If Not isFirst Then - m_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & Me.SharedTableField & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(Me.SharedTableValue))) + 'm_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & Me.getAttributeMap(i).ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(obj.getValueByAttribute("Original" & Me.getAttributeMap(i).Name)))) + 'm_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & Me.getAttributeMap(i).ColumnMap.getFullyQualifiedName & "=" & m_relationalDatabase.getParamHolder(paramCount)) + m_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & Me.getAttributeMap(i).ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo("_" & paramCount.ToString & "_")) + m_updateStatement.addSqlParameter(paramCount, obj.GetValueByAttribute("Original" & Me.getAttributeMap(i).Name), Me.getAttributeMap(i).ColumnMap) + End If + Next i + + Dim x As String = m_updateStatement.SqlString + Dim p As CSQLParameter + For i = m_updateWhereParamPosition To m_updateStatement.Parameters.Count + p = m_updateStatement.Parameters.Item(i) + If IsNullAlias(p.Value) Then + If Me.RelationalDatabase.UseANSINulls = False Then + x = x.Replace(" = _" & i.ToString & "_", " is NULL") + p.Ignore = True Else - m_updateStatement.addSqlClause("" & RelationalDatabase.getClauseStringAnd & " " & Me.SharedTableField & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(Me.SharedTableValue))) - isFirst = False + x = x.Replace("_" & i.ToString & "_", Me.RelationalDatabase.getParamHolder(i)) End If + Else + x = x.Replace("_" & i.ToString & "_", Me.RelationalDatabase.getParamHolder(i)) End If - For i = 1 To Me.getSize - 'process timestamp attributes - If Me.getAttributeMap(i).isTimeStamp Then - paramCount += 1 - 'm_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & Me.getAttributeMap(i).ColumnMap.getFullyQualifiedName & m_relationalDatabase.getClauseStringEqualTo(m_relationalDatabase.getValueFor(obj.getValueByAttribute("Original" & Me.getAttributeMap(i).Name)))) - m_updateStatement.addSqlClause(" " & RelationalDatabase.getClauseStringAnd & " " & Me.getAttributeMap(i).ColumnMap.getFullyQualifiedName & "=" & m_relationalDatabase.getParamHolder(paramCount)) - m_updateStatement.addSqlParameter(paramCount, obj.GetValueByAttribute("Original" & Me.getAttributeMap(i).Name), Me.getAttributeMap(i).ColumnMap) - End If - Next i - End If - getUpdateSqlFor = m_updateStatement + Next + m_updateStatement.SqlString = x + Return m_updateStatement End Function '''----------------------------------------------------------------------------- @@ -1740,23 +1773,26 @@ Return False End Function - Public Function getSQLRetrieve(ByRef pbroker As CPersistenceBroker, ByVal args As ArrayList) As CSqlStatement + Public Function getSQLRetrieve(ByRef pbroker As CPersistenceBroker, ByVal params As Collection) As String Dim statement As New CSqlStatement Dim i As Integer = 1 If m_sqlRetrieveStub.Length > 0 Then - statement.SqlString = m_sqlRetrieveStub - Return statement - 'Dim x As String = m_sqlRetrieveStub - 'For Each s As String In args - ' If s = "NULL" Then - ' x = x.Replace(" = _" & i.ToString & "_", " is NULL") - ' Else - ' x = x.Replace("_" & i.ToString & "_", s) - ' End If - ' i += 1 - 'Next - 'statement.SqlString = x - 'Return statement + Dim x As String = m_sqlRetrieveStub + Dim o As CSQLParameter + For i = 1 To params.Count + o = params.Item(i) + If IsNullAlias(o.Value) Then + If Me.RelationalDatabase.UseANSINulls = True Then + x = x.Replace(" = _" & i.ToString & "_", " is NULL") + o.Ignore = True + Else + x = x.Replace("_" & i.ToString & "_", Me.RelationalDatabase.getParamHolder(i)) + End If + Else + x = x.Replace("_" & i.ToString & "_", Me.RelationalDatabase.getParamHolder(i)) + End If + Next + Return x End If Dim rMaps As New HybridDictionary @@ -1843,10 +1879,10 @@ Else isfirst = False End If - 'statement.addSqlClause(" " & am.ColumnMap.getAliasQualifiedName(mapName) _ - ' & cm2.RelationalDatabase.getClauseStringEqualTo("_" & i.ToString & "_")) statement.addSqlClause(" " & am.ColumnMap.getAliasQualifiedName(mapName) _ - & " = " & cm2.RelationalDatabase.getParamHolder(i)) + & cm2.RelationalDatabase.getClauseStringEqualTo("_" & i.ToString & "_")) + 'statement.addSqlClause(" " & am.ColumnMap.getAliasQualifiedName(mapName) _ + ' & " = " & cm2.RelationalDatabase.getParamHolder(i)) Next i cm2 = Nothing Loop While Not cm2 Is Nothing @@ -1854,26 +1890,30 @@ m_sqlRetrieveStub = statement.SqlString 'Now that we've built the string we need to fill in the values - Return getSQLRetrieve(pbroker, args) + Return getSQLRetrieve(pbroker, params) End Function - Public Function getSQLFind(ByRef pbroker As CPersistenceBroker, ByVal args As ArrayList) As CSqlStatement + Public Function getSQLFind(ByRef pbroker As CPersistenceBroker, ByVal params As Collection) As String Dim statement As New CSqlStatement Dim i As Integer = 1 + If m_sqlFindStub.Length > 0 Then - statement.SqlString = m_sqlFindStub - Return statement - 'Dim x As String = m_sqlFindStub - 'For Each s As String In args - ' If s = "NULL" Then - ' x = x.Replace(" = _" & i.ToString & "_", " is NULL") - ' Else - ' x = x.Replace("_" & i.ToString & "_", s) - ' End If - ' i += 1 - 'Next - 'statement.SqlString = x - 'Return statement + Dim x As String = m_sqlFindStub + Dim o As Object + For i = 1 To params.Count + o = params.Item(i) + If IsNullAlias(o.value) Then + If Me.RelationalDatabase.UseANSINulls = False Then + x = x.Replace(" = _" & i.ToString & "_", " is NULL") + o.Ignore = True + Else + x = x.Replace("_" & i.ToString & "_", Me.RelationalDatabase.getParamHolder(i)) + End If + Else + x = x.Replace("_" & i.ToString & "_", Me.RelationalDatabase.getParamHolder(i)) + End If + Next + Return x End If Dim rMaps As New HybridDictionary @@ -1962,10 +2002,10 @@ Else isfirst = False End If - 'statement.addSqlClause(" " & am.ColumnMap.getAliasQualifiedName(mapName) _ - ' & cm2.RelationalDatabase.getClauseStringEqualTo("_" & i.ToString & "_")) statement.addSqlClause(" " & am.ColumnMap.getAliasQualifiedName(mapName) _ - & " = " & cm2.RelationalDatabase.getParamHolder(i)) + & cm2.RelationalDatabase.getClauseStringEqualTo("_" & i.ToString & "_")) + 'statement.addSqlClause(" " & am.ColumnMap.getAliasQualifiedName(mapName) _ + ' & " = " & cm2.RelationalDatabase.getParamHolder(i)) Next i cm2 = Nothing Loop While Not cm2 Is Nothing @@ -1973,7 +2013,7 @@ m_sqlFindStub = statement.SqlString 'Now that we've built the string we need to fill in the values - Return getSQLFind(pbroker, args) + Return getSQLFind(pbroker, params) End Function Public ReadOnly Property Joins() As CJoin Index: CSqlStatement.vb =================================================================== RCS file: /cvsroot/jcframework/dotnet/CSqlStatement.vb,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- CSqlStatement.vb 7 Oct 2004 05:57:33 -0000 1.10 +++ CSqlStatement.vb 18 Oct 2004 03:31:51 -0000 1.11 @@ -171,9 +171,10 @@ ''' </history> '''----------------------------------------------------------------------------- Friend Class CSQLParameter - Public m_Name As String - Public m_Column As CColumnMap - Public m_Value As Object + Private m_Name As String + Private m_Column As CColumnMap + Private m_Value As Object + Private m_ignore As Boolean '''----------------------------------------------------------------------------- ''' <summary> @@ -230,5 +231,14 @@ Set(ByVal InValue As Object) m_Value = InValue End Set - End Property + End Property + + Public Property Ignore() As Boolean + Get + Return m_ignore + End Get + Set(ByVal Value As Boolean) + m_ignore = Value + End Set + End Property End Class |