1
1
using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Data ;
2
4
using System . Data . Common ;
3
5
using System . Text ;
4
6
using NHibernate . AdoNet . Util ;
5
- using NHibernate . Dialect ;
6
7
using NHibernate . Exceptions ;
7
8
using NHibernate . SqlCommand ;
8
9
@@ -139,92 +140,88 @@ protected override void Dispose(bool isDisposing)
139
140
140
141
private partial class BatchingCommandSet : IDisposable
141
142
{
142
- private DbCommand _batchCommand ;
143
143
private readonly GenericBatchingBatcher _batcher ;
144
+ private readonly SqlStringBuilder _sql = new SqlStringBuilder ( ) ;
145
+ private readonly List < SqlTypes . SqlType > _sqlTypes = new List < SqlTypes . SqlType > ( ) ;
146
+ private readonly List < BatchParameter > _parameters = new List < BatchParameter > ( ) ;
147
+ private CommandType _commandType ;
148
+
149
+ private class BatchParameter
150
+ {
151
+ public ParameterDirection Direction { get ; set ; }
152
+
153
+ public byte Precision { get ; set ; }
154
+
155
+ public byte Scale { get ; set ; }
156
+
157
+ public int Size { get ; set ; }
158
+
159
+ public object Value { get ; set ; }
160
+ }
144
161
145
162
public BatchingCommandSet ( GenericBatchingBatcher batcher )
146
163
{
147
164
_batcher = batcher ;
148
165
}
149
-
166
+
150
167
public int CountOfCommands { get ; private set ; }
151
168
152
169
public int CountOfParameters { get ; private set ; }
153
170
154
171
public void Append ( DbParameterCollection parameters )
155
172
{
156
- if ( _batchCommand == null )
173
+ if ( CountOfCommands > 0 )
157
174
{
158
- _batchCommand = _batcher . Driver . GenerateCommand (
159
- _batcher . CurrentCommand . CommandType ,
160
- _batcher . CurrentCommandSql ,
161
- _batcher . CurrentCommandParameterTypes ) ;
162
- UpdateCommandParameters ( _batchCommand , parameters ) ;
163
- CountOfParameters = parameters . Count ;
175
+ _sql . Add ( _batcher . StatementTerminator . ToString ( ) ) ;
164
176
}
165
177
else
166
178
{
167
- // We need to create a new command with different parameter names to avoid duplicates
168
- var command = _batcher . Driver . GenerateCommand (
169
- _batcher . CurrentCommand . CommandType ,
170
- PrepareSqlString ( _batcher . CurrentCommandSql ) ,
171
- _batcher . CurrentCommandParameterTypes ) ;
172
- UpdateCommandParameters ( command , parameters ) ;
173
- _batchCommand . CommandText += $ " { _batcher . StatementTerminator } { command . CommandText } " ;
174
- while ( command . Parameters . Count > 0 )
179
+ _commandType = _batcher . CurrentCommand . CommandType ;
180
+ }
181
+ _sql . Add ( PrepareSqlString ( _batcher . CurrentCommandSql ) ) ;
182
+ _sqlTypes . AddRange ( _batcher . CurrentCommandParameterTypes ) ;
183
+
184
+ foreach ( DbParameter parameter in parameters )
185
+ {
186
+ _parameters . Add ( new BatchParameter
175
187
{
176
- var pram = command . Parameters [ 0 ] ;
177
- command . Parameters . RemoveAt ( 0 ) ;
178
- _batchCommand . Parameters . Add ( pram ) ;
179
- }
180
- command . Dispose ( ) ;
188
+ Direction = parameter . Direction ,
189
+ Precision = parameter . Precision ,
190
+ Scale = parameter . Scale ,
191
+ Size = parameter . Size ,
192
+ Value = parameter . Value
193
+ } ) ;
181
194
}
182
195
CountOfCommands ++ ;
183
196
}
184
197
185
198
public int ExecuteNonQuery ( )
186
199
{
187
- if ( _batchCommand == null )
200
+ if ( CountOfCommands == 0 )
188
201
{
189
202
return 0 ;
190
203
}
191
- _batcher . Prepare ( _batchCommand ) ;
192
- return _batchCommand . ExecuteNonQuery ( ) ;
193
- }
194
-
195
- public void Clear ( )
196
- {
197
- _batchCommand ? . Dispose ( ) ;
198
- _batchCommand = null ;
199
- CountOfParameters = 0 ;
200
- CountOfCommands = 0 ;
201
- }
202
-
203
- public void Dispose ( )
204
- {
205
- Clear ( ) ;
206
- }
207
-
208
- private void UpdateCommandParameters ( DbCommand command , DbParameterCollection parameters )
209
- {
210
- for ( var i = 0 ; i < parameters . Count ; i ++ )
204
+ var batcherCommand = _batcher . Driver . GenerateCommand (
205
+ _commandType ,
206
+ _sql . ToSqlString ( ) ,
207
+ _sqlTypes . ToArray ( )
208
+ ) ;
209
+ for ( var i = 0 ; i < _parameters . Count ; i ++ )
211
210
{
212
- var parameter = parameters [ i ] ;
213
- var cmdParam = command . Parameters [ i ] ;
211
+ var parameter = _parameters [ i ] ;
212
+ var cmdParam = batcherCommand . Parameters [ i ] ;
214
213
cmdParam . Value = parameter . Value ;
215
214
cmdParam . Direction = parameter . Direction ;
216
215
cmdParam . Precision = parameter . Precision ;
217
216
cmdParam . Scale = parameter . Scale ;
218
217
cmdParam . Size = parameter . Size ;
219
218
}
219
+ _batcher . Prepare ( batcherCommand ) ;
220
+ return batcherCommand . ExecuteNonQuery ( ) ;
220
221
}
221
222
222
223
private SqlString PrepareSqlString ( SqlString sql )
223
224
{
224
- if ( _batchCommand == null )
225
- {
226
- return sql ;
227
- }
228
225
sql = sql . Copy ( ) ;
229
226
foreach ( var part in sql )
230
227
{
@@ -235,6 +232,20 @@ private SqlString PrepareSqlString(SqlString sql)
235
232
}
236
233
return sql ;
237
234
}
235
+
236
+ public void Clear ( )
237
+ {
238
+ CountOfParameters = 0 ;
239
+ CountOfCommands = 0 ;
240
+ _sql . Clear ( ) ;
241
+ _sqlTypes . Clear ( ) ;
242
+ _parameters . Clear ( ) ;
243
+ }
244
+
245
+ public void Dispose ( )
246
+ {
247
+ Clear ( ) ;
248
+ }
238
249
}
239
250
}
240
251
}
0 commit comments