Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlParameterizer.cs / 2 / SqlParameterizer.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.Linq.Mapping;
using System.Data.Linq.Provider;
using System.Linq.Expressions;
using System.Diagnostics.CodeAnalysis;
namespace System.Data.Linq.SqlClient {
internal enum SqlParameterType {
Value,
UserArgument,
PreviousResult
}
internal class SqlParameterInfo {
SqlParameter parameter;
object value;
Delegate accessor;
internal SqlParameterInfo(SqlParameter parameter, Delegate accessor) {
this.parameter = parameter;
this.accessor = accessor;
}
internal SqlParameterInfo(SqlParameter parameter, object value) {
this.parameter = parameter;
this.value = value;
}
internal SqlParameterInfo(SqlParameter parameter) {
this.parameter = parameter;
}
internal SqlParameterType Type {
get {
if (this.accessor != null) {
return SqlParameterType.UserArgument;
}
else if (this.parameter.Name == "@ROWCOUNT") {
return SqlParameterType.PreviousResult;
}
else {
return SqlParameterType.Value;
}
}
}
internal SqlParameter Parameter {
get { return this.parameter; }
}
internal Delegate Accessor {
get { return this.accessor; }
}
internal object Value {
get { return this.value; }
}
}
internal class SqlParameterizer {
TypeSystemProvider typeProvider;
SqlNodeAnnotations annotations;
int index;
internal SqlParameterizer(TypeSystemProvider typeProvider, SqlNodeAnnotations annotations) {
this.typeProvider = typeProvider;
this.annotations = annotations;
}
internal ReadOnlyCollection Parameterize(SqlNode node) {
return this.ParameterizeInternal(node).AsReadOnly();
}
private List ParameterizeInternal(SqlNode node) {
Visitor v = new Visitor(this);
v.Visit(node);
return new List(v.currentParams);
}
internal ReadOnlyCollection> ParameterizeBlock(SqlBlock block) {
SqlParameterInfo rowStatus =
new SqlParameterInfo(
new SqlParameter(typeof(int), typeProvider.From(typeof(int)), "@ROWCOUNT", block.SourceExpression)
);
List> list = new List>();
for (int i = 0, n = block.Statements.Count; i < n; i++) {
SqlNode statement = block.Statements[i];
List parameters = this.ParameterizeInternal(statement);
if (i > 0) {
parameters.Add(rowStatus);
}
list.Add(parameters.AsReadOnly());
}
return list.AsReadOnly();
}
internal virtual string CreateParameterName() {
return "@p" + this.index++;
}
class Visitor : SqlVisitor {
private SqlParameterizer parameterizer;
internal Dictionary