3 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
\r
5 // Permission is hereby granted, free of charge, to any person obtaining
\r
6 // a copy of this software and associated documentation files (the
\r
7 // "Software"), to deal in the Software without restriction, including
\r
8 // without limitation the rights to use, copy, modify, merge, publish,
\r
9 // distribute, sublicense, and/or sell copies of the Software, and to
\r
10 // permit persons to whom the Software is furnished to do so, subject to
\r
11 // the following conditions:
\r
13 // The above copyright notice and this permission notice shall be
\r
14 // included in all copies or substantial portions of the Software.
\r
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
18 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
\r
20 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
\r
21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
\r
22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
25 using System.Collections;
\r
27 namespace System.Data.Common
\r
29 internal abstract class AbstractDataContainer
\r
33 BitArray _nullValues;
\r
41 internal abstract object this[int index] {
\r
46 internal virtual int Capacity {
\r
48 return (_nullValues != null) ? _nullValues.Count : 0;
\r
51 if (_nullValues == null) {
\r
52 _nullValues = new BitArray(value);
\r
55 _nullValues.Length = value;
\r
60 internal Type Type {
\r
66 protected DataColumn Column {
\r
72 #endregion //Properties
\r
76 internal static AbstractDataContainer CreateInstance(Type type, DataColumn column)
\r
78 AbstractDataContainer container;
\r
79 switch (Type.GetTypeCode(type)) {
\r
80 case TypeCode.Int16 :
\r
81 container = new Int16DataContainer();
\r
83 case TypeCode.Int32 :
\r
84 container = new Int32DataContainer();
\r
86 case TypeCode.Int64 :
\r
87 container = new Int64DataContainer();
\r
89 case TypeCode.String :
\r
90 container = new StringDataContainer();
\r
92 case TypeCode.Boolean:
\r
93 container = new BitDataContainer();
\r
95 case TypeCode.Byte :
\r
96 container = new ByteDataContainer();
\r
98 case TypeCode.Char :
\r
99 container = new CharDataContainer();
\r
101 case TypeCode.Double :
\r
102 container = new DoubleDataContainer();
\r
104 case TypeCode.SByte :
\r
105 container = new SByteDataContainer();
\r
107 case TypeCode.Single :
\r
108 container = new SingleDataContainer();
\r
110 case TypeCode.UInt16 :
\r
111 container = new UInt16DataContainer();
\r
113 case TypeCode.UInt32 :
\r
114 container = new UInt32DataContainer();
\r
116 case TypeCode.UInt64 :
\r
117 container = new UInt64DataContainer();
\r
119 case TypeCode.DateTime :
\r
120 container = new DateTimeDataContainer();
\r
122 case TypeCode.Decimal :
\r
123 container = new DecimalDataContainer();
\r
126 container = new ObjectDataContainer();
\r
129 container._type = type;
\r
130 container._column = column;
\r
134 internal bool IsNull(int index)
\r
136 return (_nullValues != null) ? _nullValues[index] : true;
\r
139 internal void SetNullBit(int index,bool isNull)
\r
141 _nullValues[index] = isNull;
\r
144 protected void SetNull(int index,bool isNull,bool isDbNull)
\r
146 SetNullBit(index,isDbNull);
\r
147 // this method must be called after setting the value into value array
\r
148 // otherwise the dafault value will be overriden
\r
150 // set the value to default
\r
151 CopyValue(Column.Table.DefaultValuesRowIndex,index);
\r
155 internal void FillValues(int fromIndex)
\r
157 for(int i=0; i < Capacity; i++) {
\r
158 CopyValue(fromIndex,i);
\r
159 _nullValues[i] = _nullValues[fromIndex];
\r
163 internal virtual void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
165 _nullValues[toIndex] = fromContainer._nullValues[fromIndex];
\r
168 internal virtual void CopyValue(int fromIndex, int toIndex)
\r
170 _nullValues[toIndex] = _nullValues[fromIndex];
\r
173 internal virtual void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
175 bool isDbNull = record.IsDBNull(field);
\r
176 SetNull(index,false,isDbNull);
\r
179 protected int CompareNulls(int index1, int index2)
\r
181 bool null1 = IsNull(index1);
\r
182 bool null2 = IsNull(index2);
\r
184 if ( null1 ^ null2 ) {
\r
185 return null1 ? -1 : 1;
\r
192 internal abstract int CompareValues(int index1, int index2);
\r
194 internal abstract long GetInt64(int index);
\r
196 #endregion //Methods
\r
198 sealed class Int16DataContainer : AbstractDataContainer
\r
204 #endregion //Fields
\r
208 internal override object this[int index] {
\r
210 if (IsNull(index)) {
\r
211 return DBNull.Value;
\r
214 return _values[index];
\r
218 bool isDbNull = (value == DBNull.Value);
\r
219 if (value == null || isDbNull) {
\r
222 else if( value is short ) {
\r
223 SetValue(index,(short)value);
\r
226 SetValue(index,Convert.ToInt16(value));
\r
228 SetNull(index,value == null,isDbNull);
\r
232 internal override int Capacity {
\r
234 base.Capacity = value;
\r
235 if (_values == null) {
\r
236 _values = new short[value];
\r
239 short[] tmp = new short[value];
\r
240 Array.Copy(_values,0,tmp,0,_values.Length);
\r
246 #endregion //Properties
\r
250 private void SetValue(int index, short value)
\r
252 _values[index] = value;
\r
255 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
257 // if exception thrown, it should be caught in the caller method
\r
258 if (record is ISafeDataRecord) {
\r
259 SetValue(index,((ISafeDataRecord)record).GetInt16Safe(field));
\r
262 this[index] = record.GetValue(field);
\r
264 base.SetItemFromDataRecord(index,record,field);
\r
267 internal override void CopyValue(int fromIndex, int toIndex)
\r
269 base.CopyValue(fromIndex, toIndex);
\r
270 _values[toIndex] = _values[fromIndex];
\r
273 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
275 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
276 _values[toIndex] = ((Int16DataContainer)fromContainer)._values[fromIndex];
\r
279 internal override int CompareValues(int index1, int index2)
\r
281 short s1 = _values[index1];
\r
282 short s2 = _values[index2];
\r
284 if ( s1 == 0 || s2 == 0 ) {
\r
285 int cn = CompareNulls(index1, index2);
\r
293 internal override long GetInt64(int index)
\r
295 return (long) _values[index];
\r
298 #endregion //Methods
\r
301 sealed class Int32DataContainer : AbstractDataContainer
\r
307 #endregion //Fields
\r
311 internal override object this[int index] {
\r
313 if (IsNull(index)) {
\r
314 return DBNull.Value;
\r
317 return _values[index];
\r
321 bool isDbNull = (value == DBNull.Value);
\r
322 if (value == null || isDbNull) {
\r
325 else if( value is int ) {
\r
326 SetValue(index,(int)value);
\r
329 SetValue(index,Convert.ToInt32(value));
\r
331 SetNull(index,value == null,isDbNull);
\r
335 internal override int Capacity {
\r
337 base.Capacity = value;
\r
338 if (_values == null) {
\r
339 _values = new int[value];
\r
342 int[] tmp = new int[value];
\r
343 Array.Copy(_values,0,tmp,0,_values.Length);
\r
349 #endregion //Properties
\r
353 private void SetValue(int index, int value)
\r
355 _values[index] = value;
\r
358 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
360 // if exception thrown, it should be caught in the caller method
\r
361 if (record is ISafeDataRecord) {
\r
362 SetValue(index,((ISafeDataRecord)record).GetInt32Safe(field));
\r
365 this[index] = record.GetValue(field);
\r
367 base.SetItemFromDataRecord(index,record,field);
\r
370 internal override void CopyValue(int fromIndex, int toIndex)
\r
372 base.CopyValue(fromIndex, toIndex);
\r
373 _values[toIndex] = _values[fromIndex];
\r
376 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
378 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
379 _values[toIndex] = ((Int32DataContainer)fromContainer)._values[fromIndex];
\r
382 internal override int CompareValues(int index1, int index2)
\r
384 int i1 = _values[index1];
\r
385 int i2 = _values[index2];
\r
387 if (i1 == 0 || i2 == 0) {
\r
388 int cn = CompareNulls(index1, index2);
\r
394 return ( i1 == i2 ) ? 0 : -1;
\r
399 internal override long GetInt64(int index)
\r
401 return (long) _values[index];
\r
404 #endregion //Methods
\r
407 sealed class Int64DataContainer : AbstractDataContainer
\r
413 #endregion //Fields
\r
417 internal override object this[int index] {
\r
419 if (IsNull(index)) {
\r
420 return DBNull.Value;
\r
423 return _values[index];
\r
427 bool isDbNull = (value == DBNull.Value);
\r
428 if (value == null || isDbNull) {
\r
431 else if( value is long ) {
\r
432 SetValue(index,(long)value);
\r
435 SetValue(index,Convert.ToInt64(value));
\r
437 SetNull(index,value == null,isDbNull);
\r
441 internal override int Capacity {
\r
443 base.Capacity = value;
\r
444 if (_values == null) {
\r
445 _values = new long[value];
\r
448 long[] tmp = new long[value];
\r
449 Array.Copy(_values,0,tmp,0,_values.Length);
\r
455 #endregion //Properties
\r
459 private void SetValue(int index, long value)
\r
461 _values[index] = value;
\r
464 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
466 // if exception thrown, it should be caught in the caller method
\r
467 if (record is ISafeDataRecord) {
\r
468 SetValue(index,((ISafeDataRecord)record).GetInt64Safe(field));
\r
471 this[index] = record.GetValue(field);
\r
473 base.SetItemFromDataRecord(index,record,field);
\r
476 internal override void CopyValue(int fromIndex, int toIndex)
\r
478 base.CopyValue(fromIndex, toIndex);
\r
479 _values[toIndex] = _values[fromIndex];
\r
482 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
484 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
485 _values[toIndex] = ((Int64DataContainer)fromContainer)._values[fromIndex];
\r
488 internal override int CompareValues(int index1, int index2)
\r
490 long l1 = _values[index1];
\r
491 long l2 = _values[index2];
\r
493 if ( l1 == 0 || l2 == 0 ) {
\r
494 int cn = CompareNulls(index1, index2);
\r
501 return ( l1 != l2 ) ? -1 : 0;
\r
506 internal override long GetInt64(int index)
\r
508 return _values[index];
\r
511 #endregion //Methods
\r
514 sealed class SingleDataContainer : AbstractDataContainer
\r
520 #endregion //Fields
\r
524 internal override object this[int index] {
\r
526 if (IsNull(index)) {
\r
527 return DBNull.Value;
\r
530 return _values[index];
\r
534 bool isDbNull = (value == DBNull.Value);
\r
535 if (value == null || isDbNull) {
\r
538 else if( value is float ) {
\r
539 SetValue(index,(float)value);
\r
542 SetValue(index,Convert.ToSingle(value));
\r
544 SetNull(index,value == null,isDbNull);
\r
548 internal override int Capacity {
\r
550 base.Capacity = value;
\r
551 if (_values == null) {
\r
552 _values = new float[value];
\r
555 float[] tmp = new float[value];
\r
556 Array.Copy(_values,0,tmp,0,_values.Length);
\r
562 #endregion //Properties
\r
566 private void SetValue(int index, float value)
\r
568 _values[index] = value;
\r
571 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
573 // if exception thrown, it should be caught in the caller method
\r
574 if (record is ISafeDataRecord) {
\r
575 SetValue(index,((ISafeDataRecord)record).GetFloatSafe(field));
\r
578 this[index] = record.GetValue(field);
\r
580 base.SetItemFromDataRecord(index,record,field);
\r
583 internal override void CopyValue(int fromIndex, int toIndex)
\r
585 base.CopyValue(fromIndex, toIndex);
\r
586 _values[toIndex] = _values[fromIndex];
\r
589 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
591 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
592 _values[toIndex] = ((SingleDataContainer)fromContainer)._values[fromIndex];
\r
595 internal override int CompareValues(int index1, int index2)
\r
597 float f1 = _values[index1];
\r
598 float f2 = _values[index2];
\r
600 if ( f1 == 0 || f2 == 0 ) {
\r
601 int cn = CompareNulls(index1, index2);
\r
608 return ( f1 != f2 ) ? -1 : 0;
\r
613 internal override long GetInt64(int index)
\r
615 return Convert.ToInt64(_values[index]);
\r
618 #endregion //Methods
\r
621 sealed class DoubleDataContainer : AbstractDataContainer
\r
627 #endregion //Fields
\r
631 internal override object this[int index] {
\r
633 if (IsNull(index)) {
\r
634 return DBNull.Value;
\r
637 return _values[index];
\r
641 bool isDbNull = (value == DBNull.Value);
\r
642 if (value == null || isDbNull) {
\r
645 else if( value is double ) {
\r
646 SetValue(index,(double)value);
\r
649 SetValue(index,Convert.ToDouble(value));
\r
651 SetNull(index,value == null,isDbNull);
\r
655 internal override int Capacity {
\r
657 base.Capacity = value;
\r
658 if (_values == null) {
\r
659 _values = new double[value];
\r
662 double[] tmp = new double[value];
\r
663 Array.Copy(_values,0,tmp,0,_values.Length);
\r
669 #endregion //Properties
\r
673 private void SetValue(int index, double value)
\r
675 _values[index] = value;
\r
678 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
680 // if exception thrown, it should be caught in the caller method
\r
681 if (record is ISafeDataRecord) {
\r
682 SetValue(index,((ISafeDataRecord)record).GetDoubleSafe(field));
\r
685 this[index] = record.GetValue(field);
\r
687 base.SetItemFromDataRecord(index,record,field);
\r
690 internal override void CopyValue(int fromIndex, int toIndex)
\r
692 base.CopyValue(fromIndex, toIndex);
\r
693 _values[toIndex] = _values[fromIndex];
\r
696 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
698 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
699 _values[toIndex] = ((DoubleDataContainer)fromContainer)._values[fromIndex];
\r
702 internal override int CompareValues(int index1, int index2)
\r
704 double d1 = _values[index1];
\r
705 double d2 = _values[index2];
\r
707 if ( d1 == 0 || d2 == 0 ) {
\r
708 int cn = CompareNulls(index1, index2);
\r
715 return ( d1 != d2 ) ? -1 : 0;
\r
720 internal override long GetInt64(int index)
\r
722 return Convert.ToInt64(_values[index]);
\r
725 #endregion //Methods
\r
728 sealed class ByteDataContainer : AbstractDataContainer
\r
734 #endregion //Fields
\r
738 internal override object this[int index] {
\r
740 if (IsNull(index)) {
\r
741 return DBNull.Value;
\r
744 return _values[index];
\r
748 bool isDbNull = (value == DBNull.Value);
\r
749 if (value == null || isDbNull) {
\r
752 else if( value is byte ) {
\r
753 SetValue(index,(byte)value);
\r
756 SetValue(index,Convert.ToByte(value));
\r
758 SetNull(index,value == null,isDbNull);
\r
762 internal override int Capacity {
\r
764 base.Capacity = value;
\r
765 if (_values == null) {
\r
766 _values = new byte[value];
\r
769 byte[] tmp = new byte[value];
\r
770 Array.Copy(_values,0,tmp,0,_values.Length);
\r
776 #endregion //Properties
\r
780 private void SetValue(int index, byte value)
\r
782 _values[index] = value;
\r
785 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
787 // if exception thrown, it should be caught in the caller method
\r
788 if (record is ISafeDataRecord) {
\r
789 SetValue(index,((ISafeDataRecord)record).GetByteSafe(field));
\r
792 this[index] = record.GetValue(field);
\r
794 base.SetItemFromDataRecord(index,record,field);
\r
797 internal override void CopyValue(int fromIndex, int toIndex)
\r
799 base.CopyValue(fromIndex, toIndex);
\r
800 _values[toIndex] = _values[fromIndex];
\r
803 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
805 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
806 _values[toIndex] = ((ByteDataContainer)fromContainer)._values[fromIndex];
\r
809 internal override int CompareValues(int index1, int index2)
\r
811 byte b1 = _values[index1];
\r
812 byte b2 = _values[index2];
\r
814 if ( b1 == 0 || b2 == 0 ) {
\r
815 int cn = CompareNulls(index1, index2);
\r
824 internal override long GetInt64(int index)
\r
826 return (long) _values[index];
\r
829 #endregion //Methods
\r
832 sealed class BitDataContainer : AbstractDataContainer
\r
838 #endregion //Fields
\r
842 internal override object this[int index] {
\r
844 bool isNull = IsNull(index);
\r
846 return DBNull.Value;
\r
849 return _values[index];
\r
853 bool isDbNull = (value == DBNull.Value);
\r
854 if (value == null || isDbNull) {
\r
855 SetValue(index,false);
\r
857 else if( value is bool ) {
\r
858 SetValue(index,(bool)value);
\r
861 SetValue(index,Convert.ToBoolean(value));
\r
863 SetNull(index,value == null,isDbNull);
\r
867 internal override int Capacity {
\r
869 base.Capacity = value;
\r
870 if (_values == null) {
\r
871 _values = new bool[value];
\r
874 bool[] tmp = new bool[value];
\r
875 Array.Copy(_values,0,tmp,0,_values.Length);
\r
881 #endregion //Properties
\r
885 private void SetValue(int index, bool value)
\r
887 _values[index] = value;
\r
890 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
892 // if exception thrown, it should be caught in the caller method
\r
893 if (record is ISafeDataRecord) {
\r
894 SetValue(index,((ISafeDataRecord)record).GetBooleanSafe(field));
\r
897 this[index] = record.GetValue(field);
\r
901 internal override void CopyValue(int fromIndex, int toIndex)
\r
903 base.CopyValue(fromIndex, toIndex);
\r
904 _values[toIndex] = _values[fromIndex];
\r
907 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
909 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
910 _values[toIndex] = ((BitDataContainer)fromContainer)._values[fromIndex];
\r
913 internal override int CompareValues(int index1, int index2)
\r
915 bool b1 = _values[index1];
\r
916 bool b2 = _values[index2];
\r
919 return b1 ? 1 : -1;
\r
926 return CompareNulls(index1, index2);
\r
929 internal override long GetInt64(int index)
\r
931 return Convert.ToInt64(_values[index]);
\r
934 #endregion //Methods
\r
937 abstract class AbstractObjectDataContainer : AbstractDataContainer
\r
943 #endregion //Fields
\r
947 internal override object this[int index] {
\r
949 if (IsNull(index))
\r
950 return DBNull.Value;
\r
952 return _values[index];
\r
955 SetValue(index,value);
\r
956 SetNull(index,value == null,value == DBNull.Value);
\r
960 internal override int Capacity {
\r
962 base.Capacity = value;
\r
963 if (_values == null) {
\r
964 _values = new object[value];
\r
967 object[] tmp = new object[value];
\r
968 Array.Copy(_values,0,tmp,0,_values.Length);
\r
974 #endregion //Properties
\r
978 protected virtual void SetValue(int index, object value)
\r
980 if(value == null) {
\r
981 value = Column.DefaultValue;
\r
983 _values[index] = value;
\r
986 internal override void CopyValue(int fromIndex, int toIndex)
\r
988 base.CopyValue(fromIndex, toIndex);
\r
989 _values[toIndex] = _values[fromIndex];
\r
992 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
994 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
995 _values[toIndex] = ((AbstractObjectDataContainer)fromContainer)._values[fromIndex];
\r
998 internal override int CompareValues(int index1, int index2)
\r
1000 object obj1 = _values[index1];
\r
1001 object obj2 = _values[index2];
\r
1008 int cn = CompareNulls(index1, index2);
\r
1012 if (obj1 is IComparable)
\r
1016 return ((IComparable)obj1).CompareTo(obj2);
\r
1023 if (obj2 is IComparable)
\r
1025 obj2 = Convert.ChangeType(obj2, Type.GetTypeCode(obj1.GetType()));
\r
1026 return ((IComparable)obj1).CompareTo(obj2);
\r
1031 return String.Compare(obj1.ToString(), obj2.ToString());
\r
1034 internal override long GetInt64(int index)
\r
1036 return Convert.ToInt64(_values[index]);
\r
1039 #endregion //Methods
\r
1043 sealed class ObjectDataContainer : AbstractObjectDataContainer
\r
1046 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
1048 // if exception thrown, it should be caught
\r
1049 // in the caller method
\r
1050 SetValue(index,record.GetValue(field));
\r
1051 base.SetItemFromDataRecord(index,record,field);
\r
1054 protected override void SetValue(int index, object value)
\r
1056 if(value != null && value != DBNull.Value && !Type.IsAssignableFrom(value.GetType()))
\r
1057 value = Convert.ChangeType(value, Type);
\r
1059 base.SetValue(index, value);
\r
1061 #endregion //Methods
\r
1065 sealed class DateTimeDataContainer : AbstractObjectDataContainer
\r
1068 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
1070 // if exception thrown, it should be caught
\r
1071 // in the caller method
\r
1072 base.SetValue(index,record.GetDateTime(field));
\r
1073 base.SetItemFromDataRecord(index,record,field);
\r
1076 protected override void SetValue(int index, object value)
\r
1078 if (value != null && value != DBNull.Value)
\r
1079 value = Convert.ToDateTime(value);
\r
1080 base.SetValue(index, value);
\r
1082 #endregion //Methods
\r
1086 sealed class DecimalDataContainer : AbstractObjectDataContainer
\r
1089 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
1091 // if exception thrown, it should be caught in the caller method
\r
1092 if (record is ISafeDataRecord) {
\r
1093 SetValue(index,((ISafeDataRecord)record).GetDecimalSafe(field));
\r
1096 this[index] = record.GetValue(field);
\r
1098 base.SetItemFromDataRecord(index,record,field);
\r
1101 protected override void SetValue(int index, object value)
\r
1103 if (value != null && value != DBNull.Value)
\r
1104 value = Convert.ToDecimal(value);
\r
1105 base.SetValue(index, value);
\r
1107 #endregion //Methods
\r
1111 sealed class StringDataContainer : AbstractObjectDataContainer
\r
1115 private void SetValue(int index, string value)
\r
1117 if (value != null && Column.MaxLength >= 0 && Column.MaxLength < value.Length ) {
\r
1118 throw new ArgumentException("Cannot set column '" + Column.ColumnName + "' to '" + value + "'. The value violates the MaxLength limit of this column.");
\r
1120 base.SetValue(index,value);
\r
1123 protected override void SetValue(int index, object value)
\r
1125 if ( value != null && value != DBNull.Value ) {
\r
1126 if ( value is string ) {
\r
1127 SetValue(index, (string) value);
\r
1130 SetValue(index, Convert.ToString(value));
\r
1135 base.SetValue(index, value);
\r
1138 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
1140 // if exception thrown, it should be caught
\r
1141 // in the caller method
\r
1142 if (record is ISafeDataRecord) {
\r
1143 SetValue(index,((ISafeDataRecord)record).GetStringSafe(field));
\r
1146 this[index] = record.GetValue(field);
\r
1148 base.SetItemFromDataRecord(index,record,field);
\r
1151 internal override int CompareValues(int index1, int index2)
\r
1153 bool isNull1 = IsNull(index1);
\r
1154 bool isNull2 = IsNull(index2);
\r
1157 return isNull2 ? 0 : -1;
\r
1164 return String.Compare((string)this[index1], (string)this[index2], !Column.Table.CaseSensitive);
\r
1167 #endregion //Methods
\r
1170 sealed class CharDataContainer : AbstractDataContainer
\r
1176 #endregion //Fields
\r
1178 #region Properties
\r
1180 internal override object this[int index] {
\r
1182 if (IsNull(index)) {
\r
1183 return DBNull.Value;
\r
1186 return _values[index];
\r
1190 bool isDbNull = (value == DBNull.Value);
\r
1191 if (value == null || isDbNull) {
\r
1192 SetValue(index,'\0');
\r
1194 else if( value is char ) {
\r
1195 SetValue(index,(char)value);
\r
1198 SetValue(index,Convert.ToChar(value));
\r
1200 SetNull(index,value == null,isDbNull);
\r
1204 internal override int Capacity {
\r
1206 base.Capacity = value;
\r
1207 if (_values == null) {
\r
1208 _values = new char[value];
\r
1211 char[] tmp = new char[value];
\r
1212 Array.Copy(_values,0,tmp,0,_values.Length);
\r
1218 #endregion //Properties
\r
1222 private void SetValue(int index, char value)
\r
1224 _values[index] = value;
\r
1227 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
1229 // if exception thrown, it should be caught in the caller method
\r
1230 if (record is ISafeDataRecord) {
\r
1231 SetValue(index,((ISafeDataRecord)record).GetCharSafe(field));
\r
1234 this[index] = record.GetValue(field);
\r
1236 base.SetItemFromDataRecord(index,record,field);
\r
1239 internal override void CopyValue(int fromIndex, int toIndex)
\r
1241 base.CopyValue(fromIndex, toIndex);
\r
1242 _values[toIndex] = _values[fromIndex];
\r
1245 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
1247 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
1248 _values[toIndex] = ((CharDataContainer)fromContainer)._values[fromIndex];
\r
1251 internal override int CompareValues(int index1, int index2)
\r
1253 char c1 = _values[index1];
\r
1254 char c2 = _values[index2];
\r
1256 if ( c1 == '\0' || c2 == '\0' )
\r
1258 int cn = CompareNulls(index1, index2);
\r
1266 internal override long GetInt64(int index)
\r
1268 return Convert.ToInt64(_values[index]);
\r
1271 #endregion //Methods
\r
1274 sealed class UInt16DataContainer : AbstractDataContainer
\r
1280 #endregion //Fields
\r
1282 #region Properties
\r
1284 internal override object this[int index] {
\r
1286 if (IsNull(index)) {
\r
1287 return DBNull.Value;
\r
1290 return _values[index];
\r
1294 bool isDbNull = (value == DBNull.Value);
\r
1295 if (value == null || isDbNull) {
\r
1296 SetValue(index,0);
\r
1298 else if( value is ushort ) {
\r
1299 SetValue(index,(ushort)value);
\r
1302 SetValue(index,Convert.ToUInt16(value));
\r
1304 SetNull(index,value == null,isDbNull);
\r
1308 internal override int Capacity {
\r
1310 base.Capacity = value;
\r
1311 if (_values == null) {
\r
1312 _values = new ushort[value];
\r
1315 ushort[] tmp = new ushort[value];
\r
1316 Array.Copy(_values,0,tmp,0,_values.Length);
\r
1322 #endregion //Properties
\r
1326 private void SetValue(int index, ushort value)
\r
1328 _values[index] = value;
\r
1331 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
1333 // if exception thrown, it should be caught in the caller method
\r
1334 if (record is ISafeDataRecord) {
\r
1335 SetValue(index,(ushort)((ISafeDataRecord)record).GetInt16Safe(field));
\r
1338 this[index] = record.GetValue(field);
\r
1340 base.SetItemFromDataRecord(index,record,field);
\r
1343 internal override void CopyValue(int fromIndex, int toIndex)
\r
1345 base.CopyValue(fromIndex, toIndex);
\r
1346 _values[toIndex] = _values[fromIndex];
\r
1349 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
1351 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
1352 _values[toIndex] = ((UInt16DataContainer)fromContainer)._values[fromIndex];
\r
1355 internal override int CompareValues(int index1, int index2)
\r
1357 ushort s1 = _values[index1];
\r
1358 ushort s2 = _values[index2];
\r
1360 if ( s1 == 0 || s2 == 0 ) {
\r
1361 int cn = CompareNulls(index1, index2);
\r
1369 internal override long GetInt64(int index)
\r
1371 return Convert.ToInt64(_values[index]);
\r
1374 #endregion //Methods
\r
1377 sealed class UInt32DataContainer : AbstractDataContainer
\r
1383 #endregion //Fields
\r
1385 #region Properties
\r
1387 internal override object this[int index] {
\r
1389 if (IsNull(index)) {
\r
1390 return DBNull.Value;
\r
1393 return _values[index];
\r
1397 bool isDbNull = (value == DBNull.Value);
\r
1398 if (value == null || isDbNull) {
\r
1399 SetValue(index,0);
\r
1401 else if( value is uint ) {
\r
1402 SetValue(index,(uint)value);
\r
1405 SetValue(index,Convert.ToUInt32(value));
\r
1407 SetNull(index,value == null,isDbNull);
\r
1411 internal override int Capacity {
\r
1413 base.Capacity = value;
\r
1414 if (_values == null) {
\r
1415 _values = new uint[value];
\r
1418 uint[] tmp = new uint[value];
\r
1419 Array.Copy(_values,0,tmp,0,_values.Length);
\r
1425 #endregion //Properties
\r
1429 private void SetValue(int index, uint value)
\r
1431 _values[index] = value;
\r
1434 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
1436 // if exception thrown, it should be caught in the caller method
\r
1437 if (record is ISafeDataRecord) {
\r
1438 SetValue(index,(uint)((ISafeDataRecord)record).GetInt32Safe(field));
\r
1441 this[index] = record.GetValue(field);
\r
1443 base.SetItemFromDataRecord(index,record,field);
\r
1446 internal override void CopyValue(int fromIndex, int toIndex)
\r
1448 base.CopyValue(fromIndex, toIndex);
\r
1449 _values[toIndex] = _values[fromIndex];
\r
1452 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
1454 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
1455 _values[toIndex] = ((UInt32DataContainer)fromContainer)._values[fromIndex];
\r
1458 internal override int CompareValues(int index1, int index2)
\r
1460 uint i1 = _values[index1];
\r
1461 uint i2 = _values[index2];
\r
1463 if ( i1 == 0 || i2 == 0 ) {
\r
1464 int cn = CompareNulls(index1, index2);
\r
1470 return ( i1 != i2 ) ? -1 : 0;
\r
1475 internal override long GetInt64(int index)
\r
1477 return Convert.ToInt64(_values[index]);
\r
1480 #endregion //Methods
\r
1483 sealed class UInt64DataContainer : AbstractDataContainer
\r
1489 #endregion //Fields
\r
1491 #region Properties
\r
1493 internal override object this[int index] {
\r
1495 if (IsNull(index)) {
\r
1496 return DBNull.Value;
\r
1499 return _values[index];
\r
1503 bool isDbNull = (value == DBNull.Value);
\r
1504 if (value == null || isDbNull) {
\r
1505 SetValue(index,0);
\r
1507 else if( value is ulong ) {
\r
1508 SetValue(index,(ulong)value);
\r
1511 SetValue(index,Convert.ToUInt64(value));
\r
1513 SetNull(index,value == null,isDbNull);
\r
1517 internal override int Capacity {
\r
1519 base.Capacity = value;
\r
1520 if (_values == null) {
\r
1521 _values = new ulong[value];
\r
1524 ulong[] tmp = new ulong[value];
\r
1525 Array.Copy(_values,0,tmp,0,_values.Length);
\r
1531 #endregion //Properties
\r
1535 private void SetValue(int index, ulong value)
\r
1537 _values[index] = value;
\r
1540 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
1542 // if exception thrown, it should be caught in the caller method
\r
1543 if (record is ISafeDataRecord) {
\r
1544 SetValue(index,(ulong)((ISafeDataRecord)record).GetInt64Safe(field));
\r
1547 this[index] = record.GetValue(field);
\r
1549 base.SetItemFromDataRecord(index,record,field);
\r
1552 internal override void CopyValue(int fromIndex, int toIndex)
\r
1554 base.CopyValue(fromIndex, toIndex);
\r
1555 _values[toIndex] = _values[fromIndex];
\r
1558 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
1560 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
1561 _values[toIndex] = ((UInt64DataContainer)fromContainer)._values[fromIndex];
\r
1564 internal override int CompareValues(int index1, int index2)
\r
1566 ulong l1 = _values[index1];
\r
1567 ulong l2 = _values[index2];
\r
1569 if ( l1 == 0 || l2 == 0 ) {
\r
1570 int cn = CompareNulls(index1, index2);
\r
1577 return ( l1 != l2 ) ? -1 : 0;
\r
1582 internal override long GetInt64(int index)
\r
1584 return Convert.ToInt64(_values[index]);
\r
1587 #endregion //Methods
\r
1591 sealed class SByteDataContainer : AbstractDataContainer
\r
1597 #endregion //Fields
\r
1599 #region Properties
\r
1601 internal override object this[int index] {
\r
1603 if (IsNull(index)) {
\r
1604 return DBNull.Value;
\r
1607 return _values[index];
\r
1611 bool isDbNull = (value == DBNull.Value);
\r
1612 if (value == null || isDbNull) {
\r
1613 SetValue(index,0);
\r
1615 else if( value is sbyte ) {
\r
1616 SetValue(index,(sbyte)value);
\r
1619 SetValue(index,Convert.ToSByte(value));
\r
1621 SetNull(index,value == null,isDbNull);
\r
1625 internal override int Capacity {
\r
1627 base.Capacity = value;
\r
1628 if (_values == null) {
\r
1629 _values = new sbyte[value];
\r
1632 sbyte[] tmp = new sbyte[value];
\r
1633 Array.Copy(_values,0,tmp,0,_values.Length);
\r
1639 #endregion //Properties
\r
1643 private void SetValue(int index, sbyte value)
\r
1645 _values[index] = value;
\r
1648 internal override void SetItemFromDataRecord(int index, IDataRecord record, int field)
\r
1650 // if exception thrown, it should be caught in the caller method
\r
1651 if (record is ISafeDataRecord) {
\r
1652 SetValue(index,(sbyte)((ISafeDataRecord)record).GetByteSafe(field));
\r
1655 this[index] = record.GetValue(field);
\r
1657 base.SetItemFromDataRecord(index,record,field);
\r
1660 internal override void CopyValue(int fromIndex, int toIndex)
\r
1662 base.CopyValue(fromIndex, toIndex);
\r
1663 _values[toIndex] = _values[fromIndex];
\r
1666 internal override void CopyValue(AbstractDataContainer fromContainer, int fromIndex, int toIndex)
\r
1668 base.CopyValue(fromContainer, fromIndex, toIndex);
\r
1669 _values[toIndex] = ((SByteDataContainer)fromContainer)._values[fromIndex];
\r
1672 internal override int CompareValues(int index1, int index2)
\r
1674 sbyte b1 = _values[index1];
\r
1675 sbyte b2 = _values[index2];
\r
1677 if ( b1 == 0 || b2 == 0 ) {
\r
1678 int cn = CompareNulls(index1, index2);
\r
1687 internal override long GetInt64(int index)
\r
1689 return Convert.ToSByte(_values[index]);
\r
1692 #endregion //Methods
\r