{
#region Fields
-#if ONLY_1_1
- bool disposed;
-
- DataTable dbSchemaTable;
- string quotePrefix;
- string quoteSuffix;
- string tableName;
- SqlDataAdapter adapter;
- SqlCommand insertCommand;
- SqlCommand deleteCommand;
- SqlCommand updateCommand;
- // Used to construct WHERE clauses
- static readonly string clause1 = "({0} = 1 AND {1} IS NULL)";
- static readonly string clause2 = "({0} = {1})";
-
-#else
readonly string _catalogSeparator = ".";
readonly string _schemaSeparator = ".";
readonly CatalogLocation _catalogLocation = CatalogLocation.Start;
-#endif
#endregion // Fields
[DefaultValue (null)]
public new SqlDataAdapter DataAdapter {
get {
-#if ONLY_1_1
- return adapter;
-#else
return (SqlDataAdapter)base.DataAdapter;
-#endif
} set {
-#if ONLY_1_1
- if (adapter != null)
- adapter.RowUpdating -= new SqlRowUpdatingEventHandler (RowUpdatingHandler);
-
- adapter = value;
- if (adapter != null)
- adapter.RowUpdating += new SqlRowUpdatingEventHandler (RowUpdatingHandler);
-#else
base.DataAdapter = value;
-#endif
}
}
override
string QuotePrefix {
get {
-#if ONLY_1_1
- if (quotePrefix == null)
- return string.Empty;
- return quotePrefix;
-#else
return base.QuotePrefix;
-#endif
}
set {
-#if ONLY_1_1
- if (dbSchemaTable != null)
- throw new InvalidOperationException (
- "The QuotePrefix and QuoteSuffix " +
- "properties cannot be changed once " +
- "an Insert, Update, or Delete " +
- "command has been generated.");
- quotePrefix = value;
-#else
if (value != "[" && value != "\"")
throw new ArgumentException ("Only '[' " +
"and '\"' are allowed as value " +
"for the 'QuoteSuffix' property.");
base.QuotePrefix = value;
-#endif
}
}
override
string QuoteSuffix {
get {
-#if ONLY_1_1
- if (quoteSuffix == null)
- return string.Empty;
- return quoteSuffix;
-#else
return base.QuoteSuffix;
-#endif
}
set {
-#if ONLY_1_1
- if (dbSchemaTable != null)
- throw new InvalidOperationException (
- "The QuotePrefix and QuoteSuffix " +
- "properties cannot be changed once " +
- "an Insert, Update, or Delete " +
- "command has been generated.");
- quoteSuffix = value;
-#else
if (value != "]" && value != "\"")
throw new ArgumentException ("Only ']' " +
"and '\"' are allowed as value " +
"for the 'QuoteSuffix' property.");
base.QuoteSuffix = value;
-#endif
}
}
}
-#if ONLY_1_1
- private SqlCommand SourceCommand {
- get {
- if (adapter != null)
- return adapter.SelectCommand;
- return null;
- }
- }
-#endif
#endregion // Properties
#region Methods
-#if ONLY_1_1
- private void BuildCache (bool closeConnection)
- {
- SqlCommand sourceCommand = SourceCommand;
- if (sourceCommand == null)
- throw new InvalidOperationException ("The DataAdapter.SelectCommand property needs to be initialized.");
- SqlConnection connection = sourceCommand.Connection;
- if (connection == null)
- throw new InvalidOperationException ("The DataAdapter.SelectCommand.Connection property needs to be initialized.");
-
- if (dbSchemaTable == null) {
- if (connection.State == ConnectionState.Open)
- closeConnection = false;
- else
- connection.Open ();
-
- SqlDataReader reader = sourceCommand.ExecuteReader (CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo);
- dbSchemaTable = reader.GetSchemaTable ();
- reader.Close ();
- if (closeConnection)
- connection.Close ();
- BuildInformation (dbSchemaTable);
- }
- }
-
- private void BuildInformation (DataTable schemaTable)
- {
- tableName = String.Empty;
- foreach (DataRow schemaRow in schemaTable.Rows) {
- if (schemaRow.IsNull ("BaseTableName") ||
- (string) schemaRow ["BaseTableName"] == String.Empty)
- continue;
-
- if (tableName == String.Empty)
- tableName = (string) schemaRow ["BaseTableName"];
- else if (tableName != (string) schemaRow["BaseTableName"])
- throw new InvalidOperationException ("Dynamic SQL generation is not supported against multiple base tables.");
- }
- if (tableName == String.Empty)
- throw new InvalidOperationException ("Dynamic SQL generation is not supported with no base table.");
- dbSchemaTable = schemaTable;
- }
-
- private SqlCommand CreateDeleteCommand (bool useColumnsForParameterNames)
- {
- // If no table was found, then we can't do an delete
- if (QuotedTableName == String.Empty)
- return null;
-
- CreateNewCommand (ref deleteCommand);
-
- string command = String.Format ("DELETE FROM {0}", QuotedTableName);
- StringBuilder whereClause = new StringBuilder ();
- bool keyFound = false;
- int parmIndex = 1;
-
- foreach (DataRow schemaRow in dbSchemaTable.Rows) {
- if ((bool)schemaRow["IsExpression"] == true)
- continue;
- if (!IncludedInWhereClause (schemaRow))
- continue;
-
- if (whereClause.Length > 0)
- whereClause.Append (" AND ");
-
- bool isKey = (bool) schemaRow ["IsKey"];
- SqlParameter parameter = null;
-
- if (isKey)
- keyFound = true;
-
- bool allowNull = (bool) schemaRow ["AllowDBNull"];
- if (!isKey) {
- string sourceColumnName = (string) schemaRow ["BaseColumnName"];
- if (useColumnsForParameterNames) {
- parameter = deleteCommand.Parameters.Add (
- GetNullCheckParameterName (sourceColumnName),
- SqlDbType.Int);
- } else {
- parameter = deleteCommand.Parameters.Add (
- GetParameterName (parmIndex++),
- SqlDbType.Int);
- }
- parameter.IsNullable = allowNull;
- parameter.SourceVersion = DataRowVersion.Current;
- parameter.Value = 1;
-
- whereClause.Append ("(");
- whereClause.Append (String.Format (clause1, parameter.ParameterName,
- GetQuotedString (sourceColumnName)));
- whereClause.Append (" OR ");
- }
-
- if (useColumnsForParameterNames)
- parameter = CreateParameter (schemaRow, true);
- else
- parameter = CreateParameter (parmIndex++, schemaRow);
- deleteCommand.Parameters.Add (parameter);
- ApplyParameterInfo (parameter, schemaRow, StatementType.Delete, true);
- parameter.IsNullable = allowNull;
- parameter.SourceVersion = DataRowVersion.Original;
-
- whereClause.Append (String.Format (clause2, GetQuotedString (parameter.SourceColumn), parameter.ParameterName));
-
- if (!isKey)
- whereClause.Append (")");
- }
- if (!keyFound)
- throw new InvalidOperationException ("Dynamic SQL generation for the DeleteCommand is not supported against a SelectCommand that does not return any key column information.");
-
- // We're all done, so bring it on home
- string sql = String.Format ("{0} WHERE ( {1} )", command, whereClause.ToString ());
- deleteCommand.CommandText = sql;
- return deleteCommand;
- }
-
- private SqlCommand CreateInsertCommand (bool useColumnsForParameterNames)
- {
- if (QuotedTableName == String.Empty)
- return null;
-
- CreateNewCommand (ref insertCommand);
-
- string command = String.Format ("INSERT INTO {0}", QuotedTableName);
- string sql;
- StringBuilder columns = new StringBuilder ();
- StringBuilder values = new StringBuilder ();
-
- int parmIndex = 1;
- foreach (DataRow schemaRow in dbSchemaTable.Rows) {
- if (!IncludedInInsert (schemaRow))
- continue;
-
- if (parmIndex > 1) {
- columns.Append (" , ");
- values.Append (" , ");
- }
-
- SqlParameter parameter = null;
- if (useColumnsForParameterNames) {
- parameter = CreateParameter (schemaRow, false);
- } else {
- parameter = CreateParameter (parmIndex, schemaRow);
- }
-
- insertCommand.Parameters.Add (parameter);
- ApplyParameterInfo (parameter, schemaRow, StatementType.Insert, false);
- parameter.SourceVersion = DataRowVersion.Current;
- parameter.IsNullable = (bool) schemaRow ["AllowDBNull"];
-
- columns.Append (GetQuotedString (parameter.SourceColumn));
- values.Append (parameter.ParameterName);
-
- parmIndex++;
- }
-
- sql = String.Format ("{0}( {1} ) VALUES ( {2} )", command, columns.ToString (), values.ToString ());
- insertCommand.CommandText = sql;
- return insertCommand;
- }
-
- private void CreateNewCommand (ref SqlCommand command)
- {
- SqlCommand sourceCommand = SourceCommand;
- if (command == null) {
- command = sourceCommand.Connection.CreateCommand ();
- command.CommandTimeout = sourceCommand.CommandTimeout;
- command.Transaction = sourceCommand.Transaction;
- }
- command.CommandType = CommandType.Text;
- command.UpdatedRowSource = UpdateRowSource.None;
- command.Parameters.Clear ();
- }
-
- private SqlCommand CreateUpdateCommand (bool useColumnsForParameterNames)
- {
- // If no table was found, then we can't do an update
- if (QuotedTableName == String.Empty)
- return null;
-
- CreateNewCommand (ref updateCommand);
-
- string command = String.Format ("UPDATE {0} SET ", QuotedTableName);
- StringBuilder columns = new StringBuilder ();
- StringBuilder whereClause = new StringBuilder ();
- int parmIndex = 1;
- bool keyFound = false;
-
- // First, create the X=Y list for UPDATE
- foreach (DataRow schemaRow in dbSchemaTable.Rows) {
- if (!IncludedInUpdate (schemaRow))
- continue;
- if (columns.Length > 0)
- columns.Append (" , ");
-
- SqlParameter parameter = null;
- if (useColumnsForParameterNames) {
- parameter = CreateParameter (schemaRow, false);
- } else {
- parameter = CreateParameter (parmIndex++, schemaRow);
- }
- updateCommand.Parameters.Add (parameter);
- ApplyParameterInfo (parameter, schemaRow, StatementType.Update, false);
- parameter.IsNullable = (bool) schemaRow ["AllowDBNull"];
- parameter.SourceVersion = DataRowVersion.Current;
-
- columns.Append (String.Format ("{0} = {1}", GetQuotedString (parameter.SourceColumn), parameter.ParameterName));
- }
-
- // Now, create the WHERE clause. This may be optimizable, but it would be ugly to incorporate
- // into the loop above. "Premature optimization is the root of all evil." -- Knuth
- foreach (DataRow schemaRow in dbSchemaTable.Rows) {
- if ((bool)schemaRow["IsExpression"] == true)
- continue;
-
- if (!IncludedInWhereClause (schemaRow))
- continue;
-
- if (whereClause.Length > 0)
- whereClause.Append (" AND ");
-
- bool isKey = (bool) schemaRow ["IsKey"];
- SqlParameter parameter = null;
-
- if (isKey)
- keyFound = true;
-
- bool allowNull = (bool) schemaRow ["AllowDBNull"];
- if (!isKey) {
- string sourceColumnName = (string) schemaRow ["BaseColumnName"];
- if (useColumnsForParameterNames) {
- parameter = updateCommand.Parameters.Add (
- GetNullCheckParameterName (sourceColumnName),
- SqlDbType.Int);
- } else {
- parameter = updateCommand.Parameters.Add (
- GetParameterName (parmIndex++),
- SqlDbType.Int);
- }
- parameter.IsNullable = allowNull;
- parameter.SourceVersion = DataRowVersion.Current;
- parameter.Value = 1;
-
- whereClause.Append ("(");
- whereClause.Append (String.Format (clause1, parameter.ParameterName,
- GetQuotedString (sourceColumnName)));
- whereClause.Append (" OR ");
-
- }
-
- if (useColumnsForParameterNames) {
- parameter = CreateParameter (schemaRow, true);
- } else {
- parameter = CreateParameter (parmIndex++, schemaRow);
- }
- updateCommand.Parameters.Add (parameter);
- ApplyParameterInfo (parameter, schemaRow, StatementType.Update, true);
- parameter.IsNullable = allowNull;
- parameter.SourceVersion = DataRowVersion.Original;
-
- whereClause.Append (String.Format (clause2, GetQuotedString (parameter.SourceColumn), parameter.ParameterName));
-
- if (!isKey)
- whereClause.Append (")");
- }
- if (!keyFound)
- throw new InvalidOperationException ("Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.");
-
- // We're all done, so bring it on home
- string sql = String.Format ("{0}{1} WHERE ( {2} )", command, columns.ToString (), whereClause.ToString ());
- updateCommand.CommandText = sql;
- return updateCommand;
- }
-
- private SqlParameter CreateParameter (DataRow schemaRow, bool whereClause)
- {
- string sourceColumn = (string) schemaRow ["BaseColumnName"];
- string name;
- if (whereClause)
- name = GetParameterName ("Original_" + sourceColumn);
- else
- name = GetParameterName (sourceColumn);
-
- SqlParameter param = new SqlParameter ();
- param.ParameterName = name;
- param.SourceColumn = sourceColumn;
- return param;
- }
-
- private SqlParameter CreateParameter (int paramIndex, DataRow schemaRow)
- {
- string sourceColumn = (string) schemaRow ["BaseColumnName"];
- string name = GetParameterName (paramIndex);
-
- SqlParameter param = new SqlParameter ();
- param.ParameterName = name;
- param.SourceColumn = sourceColumn;
- return param;
- }
-#endif // ONLY_1_1
public static void DeriveParameters (SqlCommand command)
{
command.DeriveParameters ();
}
-#if ONLY_1_1
- protected override void Dispose (bool disposing)
- {
- if (!disposed) {
- if (disposing) {
- if (insertCommand != null)
- insertCommand.Dispose ();
- if (deleteCommand != null)
- deleteCommand.Dispose ();
- if (updateCommand != null)
- updateCommand.Dispose ();
- if (dbSchemaTable != null)
- dbSchemaTable.Dispose ();
- }
- disposed = true;
- }
- }
-#endif
public
new
return true;
}
-#if ONLY_1_1
- private string GetQuotedString (string value)
- {
- if (value == null || value.Length == 0)
- return value;
-
- string prefix = QuotePrefix;
- string suffix = QuoteSuffix;
-
- if (prefix.Length == 0 && suffix.Length == 0)
- return value;
- return String.Format ("{0}{1}{2}", prefix, value, suffix);
- }
-
- string GetNullCheckParameterName (string parameterName)
- {
- return GetParameterName ("IsNull_" + parameterName);
- }
-
-
- private string QuotedTableName {
- get { return GetQuotedString (tableName); }
- }
-
- public void RefreshSchema ()
- {
- // FIXME: "Figure out what else needs to be cleaned up when we refresh."
- tableName = String.Empty;
- dbSchemaTable = null;
- deleteCommand = null;
- insertCommand = null;
- updateCommand = null;
- }
-#endif
protected override void ApplyParameterInfo (DbParameter parameter,
DataRow datarow,