Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
OleDbStoredProcedure.cs
1using System;
2using System.Data.Common;
3using System.Data.OleDb;
4using System.Threading.Tasks;
9
11{
15 public class OleDbStoredProcedure : ILambdaExpression, IDisposable
16 {
17 private readonly MultiReadSingleWriteObject synchObj;
18 private readonly OleDbCommand command;
19 private readonly int nrParameters;
20 private readonly string[] parameterNames;
21 private readonly ArgumentType[] parameterTypes;
22
23 internal OleDbStoredProcedure(OleDbCommand Command)
24 {
25 this.synchObj = new MultiReadSingleWriteObject(this);
26 this.command = Command;
27 this.nrParameters = this.command.Parameters.Count;
28 this.parameterNames = new string[this.nrParameters];
29 this.parameterTypes = new ArgumentType[this.nrParameters];
30
31 for (int i = 0; i < this.nrParameters; i++)
32 {
33 this.parameterNames[i] = this.command.Parameters[i].ParameterName;
34 this.parameterTypes[i] = ArgumentType.Normal;
35 }
36 }
37
41 public int NrArguments => this.nrParameters;
42
46 public string[] ArgumentNames => this.parameterNames;
47
51 public ArgumentType[] ArgumentTypes => this.parameterTypes;
52
57 public bool IsAsynchronous => true;
58
62 public void Dispose()
63 {
64 this.command?.Dispose();
65 }
66
74 {
75 return this.EvaluateAsync(Arguments, Variables).Result;
76 }
77
84 public async Task<IElement> EvaluateAsync(IElement[] Arguments, Variables Variables)
85 {
86 int i;
87
88 await this.synchObj.BeginWrite();
89 try
90 {
91 for (i = 0; i < this.nrParameters; i++)
92 {
93 OleDbParameter Parameter = this.command.Parameters[i];
94 object Value = Arguments[i].AssociatedObjectValue;
95
96 switch (Parameter.OleDbType)
97 {
98 case OleDbType.Empty:
99 case OleDbType.Double:
100 case OleDbType.Date:
101 case OleDbType.BSTR:
102 case OleDbType.IDispatch:
103 case OleDbType.Error:
104 case OleDbType.Boolean:
105 case OleDbType.Variant:
106 case OleDbType.IUnknown:
107 case OleDbType.Filetime:
108 case OleDbType.Guid:
109 case OleDbType.Binary:
110 case OleDbType.Char:
111 case OleDbType.WChar:
112 case OleDbType.DBDate:
113 case OleDbType.DBTime:
114 case OleDbType.DBTimeStamp:
115 case OleDbType.PropVariant:
116 case OleDbType.VarChar:
117 case OleDbType.LongVarChar:
118 case OleDbType.VarWChar:
119 case OleDbType.LongVarWChar:
120 case OleDbType.VarBinary:
121 case OleDbType.LongVarBinary:
122 default:
123 Parameter.Value = Value;
124 break;
125
126 case OleDbType.Decimal:
127 case OleDbType.Currency:
128 case OleDbType.Numeric:
129 case OleDbType.VarNumeric:
130 if (Value is decimal Decimal)
131 Parameter.Value = Decimal;
132 else if (Value is double d)
133 Parameter.Value = (decimal)d;
134 else
135 Parameter.Value = Convert.ToDecimal(Value);
136 break;
137
138 case OleDbType.Single:
139 if (Value is float Single)
140 Parameter.Value = Single;
141 else if (Value is double d)
142 Parameter.Value = (float)d;
143 else
144 Parameter.Value = Convert.ToSingle(Value);
145 break;
146
147 case OleDbType.SmallInt:
148 if (Value is Int16 Int16)
149 Parameter.Value = Int16;
150 else if (Value is double d)
151 Parameter.Value = (Int16)d;
152 else
153 Parameter.Value = Convert.ToInt16(Value);
154 break;
155
156 case OleDbType.Integer:
157 if (Value is Int32 Int32)
158 Parameter.Value = Int32;
159 else if (Value is double d)
160 Parameter.Value = (Int32)d;
161 else
162 Parameter.Value = Convert.ToInt32(Value);
163 break;
164
165 case OleDbType.BigInt:
166 if (Value is Int64 Int64)
167 Parameter.Value = Int64;
168 else if (Value is double d)
169 Parameter.Value = (Int64)d;
170 else
171 Parameter.Value = Convert.ToInt64(Value);
172 break;
173
174 case OleDbType.TinyInt:
175 if (Value is sbyte I8)
176 Parameter.Value = I8;
177 else if (Value is double d)
178 Parameter.Value = (sbyte)d;
179 else
180 Parameter.Value = Convert.ToSByte(Value);
181 break;
182
183 case OleDbType.UnsignedTinyInt:
184 if (Value is byte UI8)
185 Parameter.Value = UI8;
186 else if (Value is double d)
187 Parameter.Value = (byte)d;
188 else
189 Parameter.Value = Convert.ToByte(Value);
190 break;
191
192 case OleDbType.UnsignedSmallInt:
193 if (Value is UInt16 UI16)
194 Parameter.Value = UI16;
195 else if (Value is double d)
196 Parameter.Value = (UInt16)d;
197 else
198 Parameter.Value = Convert.ToUInt16(Value);
199 break;
200
201 case OleDbType.UnsignedInt:
202 if (Value is UInt32 UI32)
203 Parameter.Value = UI32;
204 else if (Value is double d)
205 Parameter.Value = (UInt32)d;
206 else
207 Parameter.Value = Convert.ToUInt32(Value);
208 break;
209
210 case OleDbType.UnsignedBigInt:
211 if (Value is UInt64 UI64)
212 Parameter.Value = UI64;
213 else if (Value is double d)
214 Parameter.Value = (UInt64)d;
215 else
216 Parameter.Value = Convert.ToUInt64(Value);
217 break;
218 }
219 }
220
221 DbDataReader Reader = await this.command.ExecuteReaderAsync();
222
223 return await Reader.ParseAndClose();
224 }
225 finally
226 {
227 await this.synchObj.EndWrite();
228 }
229 }
230
232 public override string ToString()
233 {
234 return LambdaDefinition.ToString(this);
235 }
236 }
237}
Represents an object that allows single concurrent writers but multiple concurrent readers....
Represents a stored precedure in an OLE DB Database.
IElement Evaluate(IElement[] Arguments, Variables Variables)
Evaluates the lambda expression.
async Task< IElement > EvaluateAsync(IElement[] Arguments, Variables Variables)
Evaluates the lambda expression.
bool IsAsynchronous
If the node (or its decendants) include asynchronous evaluation. Asynchronous nodes should be evaluat...
Collection of variables.
Definition: Variables.cs:25
Basic interface for all types of elements.
Definition: IElement.cs:20
object AssociatedObjectValue
Associated object value.
Definition: IElement.cs:33
Base interface for lambda expressions.
ArgumentType
Type of parameter used in a function definition or a lambda definition.
Definition: IFunction.cs:9