0
|
1 using System;
|
|
2 using System.Data;
|
|
3 using System.Data.Common;
|
|
4 using System.Globalization;
|
|
5 using System.Threading;
|
|
6
|
|
7 using IBM.Data.Informix;
|
|
8
|
|
9 namespace BLToolkit.Data.DataProvider
|
|
10 {
|
|
11 using Sql.SqlProvider;
|
|
12
|
|
13 public class InformixDataProvider : DataProviderBase
|
|
14 {
|
|
15 public override IDbConnection CreateConnectionObject () { return new IfxConnection (); }
|
|
16 public override DbDataAdapter CreateDataAdapterObject() { return new IfxDataAdapter (); }
|
|
17 public override ISqlProvider CreateSqlProvider () { return new InformixSqlProvider(); }
|
|
18
|
|
19 public override Type ConnectionType { get { return typeof(IfxConnection); } }
|
|
20 public override string Name { get { return DataProvider.ProviderName.Informix; } }
|
|
21
|
|
22 public override bool DeriveParameters(IDbCommand command)
|
|
23 {
|
|
24 if (command is IfxCommand)
|
|
25 {
|
|
26 IfxCommandBuilder.DeriveParameters((IfxCommand)command);
|
|
27 return true;
|
|
28 }
|
|
29
|
|
30 return false;
|
|
31 }
|
|
32
|
|
33 public override object Convert(object value, ConvertType convertType)
|
|
34 {
|
|
35 switch (convertType)
|
|
36 {
|
|
37 case ConvertType.ExceptionToErrorNumber:
|
|
38 if (value is IfxException)
|
|
39 {
|
|
40 var ex = (IfxException)value;
|
|
41
|
|
42 foreach (IfxError error in ex.Errors)
|
|
43 return error.NativeError;
|
|
44
|
|
45 return 0;
|
|
46 }
|
|
47
|
|
48 break;
|
|
49 }
|
|
50
|
|
51 return SqlProvider.Convert(value, convertType);
|
|
52 }
|
|
53
|
|
54 public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters)
|
|
55 {
|
|
56 base.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
|
|
57
|
|
58 if (commandParameters != null) foreach (var p in commandParameters)
|
|
59 {
|
|
60 if (p.Value is Guid)
|
|
61 {
|
|
62 var value = p.Value.ToString();
|
|
63 p.DbType = DbType.AnsiStringFixedLength;
|
|
64 p.Value = value;
|
|
65 p.Size = value.Length;
|
|
66 }
|
|
67 else if (p.Value is bool)
|
|
68 {
|
|
69 p.Value = ((InformixSqlProvider)SqlProvider).ConvertBooleanValue((bool)p.Value);
|
|
70 }
|
|
71 //else if (p.DbType == DbType.Binary)
|
|
72 //{
|
|
73 // var ip = (IfxParameter)p;
|
|
74
|
|
75 // ip.IfxType = IfxType.Blob;
|
|
76 //}
|
|
77 }
|
|
78 }
|
|
79
|
|
80 /*
|
|
81 public override int ExecuteArray(IDbCommand command, int iterations)
|
|
82 {
|
|
83 var cmd = (IfxCommand)command;
|
|
84 try
|
|
85 {
|
|
86 cmd.ArrayBindCount = iterations;
|
|
87 return cmd.ExecuteNonQuery();
|
|
88 }
|
|
89 finally
|
|
90 {
|
|
91 cmd.ArrayBindCount = 0;
|
|
92 }
|
|
93 }
|
|
94 */
|
|
95
|
|
96 #region GetDataReader
|
|
97
|
|
98 public override IDataReader GetDataReader(Mapping.MappingSchema schema, IDataReader dataReader)
|
|
99 {
|
|
100 return dataReader is IfxDataReader?
|
|
101 new InformixDataReaderEx((IfxDataReader)dataReader):
|
|
102 base.GetDataReader(schema, dataReader);
|
|
103 }
|
|
104
|
|
105 class InformixDataReaderEx : DataReaderBase<IfxDataReader>, IDataReader
|
|
106 {
|
|
107 public InformixDataReaderEx(IfxDataReader rd): base(rd)
|
|
108 {
|
|
109 }
|
|
110
|
|
111 public new float GetFloat(int i)
|
|
112 {
|
|
113 var current = Thread.CurrentThread.CurrentCulture;
|
|
114
|
|
115 if (Thread.CurrentThread.CurrentCulture != CultureInfo.InvariantCulture)
|
|
116 Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
|
|
117
|
|
118 var value = DataReader.GetFloat(i);
|
|
119
|
|
120 if (current != CultureInfo.InvariantCulture)
|
|
121 Thread.CurrentThread.CurrentCulture = current;
|
|
122
|
|
123 return value;
|
|
124 }
|
|
125
|
|
126 public new double GetDouble(int i)
|
|
127 {
|
|
128 var current = Thread.CurrentThread.CurrentCulture;
|
|
129
|
|
130 if (Thread.CurrentThread.CurrentCulture != CultureInfo.InvariantCulture)
|
|
131 Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
|
|
132
|
|
133 var value = DataReader.GetDouble(i);
|
|
134
|
|
135 if (current != CultureInfo.InvariantCulture)
|
|
136 Thread.CurrentThread.CurrentCulture = current;
|
|
137
|
|
138 return value;
|
|
139 }
|
|
140
|
|
141 public new decimal GetDecimal(int i)
|
|
142 {
|
|
143 var current = Thread.CurrentThread.CurrentCulture;
|
|
144
|
|
145 if (Thread.CurrentThread.CurrentCulture != CultureInfo.InvariantCulture)
|
|
146 Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
|
|
147
|
|
148 var value = DataReader.GetDecimal (i);
|
|
149
|
|
150 if (current != CultureInfo.InvariantCulture)
|
|
151 Thread.CurrentThread.CurrentCulture = current;
|
|
152
|
|
153 return value;
|
|
154 }
|
|
155 }
|
|
156
|
|
157 #endregion
|
|
158 }
|
|
159 }
|