/// <summary> /// Renders INSERT statement. /// </summary> /// <param name="insert">INSERT statement that is being rendered.</param> /// <param name="nextSequence">Ignored. SQLite doesn't use sequences.</param> /// <param name="dbms">Target DBMS. Different auto-id retrieval for SQL 7.0 then in newer versions.</param> /// <param name="output">StringBuilder to which the SQL code is appended.</param> /// <param name="parameters">SQL parameter collection to which the object's and its children's /// parameters are added. After the rendering is done the collection contains all parameters with unique names.</param> /// <returns><b>null</b> because automatically generated ID must be fetched via SELECT after INSERT.</returns> public DbParameter RenderInsert(InsertStatement insert, DbParameter nextSequence, DbmsType dbms, StringBuilder output, DbParameterCollection parameters) { // Renders INSERT statements for DBMSs that support an auto-identity fields. // Auto-id field may or may not be in the column-value list. // If auto-incremented field is in the column-value list it will be skipped. // Table may have only one auto-identity field. // Method expects that all errors have been identified and processed in the caller. // Renders all fields except auto-id field; thus -1 if auto-id is contained in the column-value list. int numberOfFieldsToRender = GetTotalNumberOfFieldsToRender(insert); AppendInsertIntoTableName(insert, dbms, output); if (numberOfFieldsToRender > 0) { AppendBracketsWithAllFieldsExceptAutoId(insert, dbms, output, numberOfFieldsToRender); AppendValuesForAllFieldsExceptAutoId(insert, dbms, output, parameters, numberOfFieldsToRender); } else { AppendDefaultValuesExpression(output); } // Auto ID must be fetched via SELECT after INSERT. DbParameter autoId = null; return autoId; }
/// <summary> /// Renders INSERT statement and code that retrieves the new ID. /// </summary> /// <param name="insert">INSERT statement that is being rendered.</param> /// <param name="nextSequence">Ignored. SQL Server doesn't use sequences.</param> /// <param name="dbms">Target DBMS. Different auto-id retrieval for SQL 7.0 then in newer versions.</param> /// <param name="output">StringBuilder to which the SQL code is appended.</param> /// <param name="parameters">SQL parameter collection to which the object's and its children's /// parameters are added. After the rendering is done the collection contains all parameters with unique names.</param> /// <returns>Ouput parameter that will contain the value retrieved by RETURNING clause.</returns> public DbParameter RenderInsert(InsertStatement insert, DbParameter nextSequence, DbmsType dbms, StringBuilder output, DbParameterCollection parameters) { // Renders INSERT statements for DBMSs that support an auto-identity fields. // Auto-id field may or may not be in the column-value list. // If auto-incremented field is in the column-value list it will be skipped. // Table may have only one auto-identity field. // Method expects that all errors have been identified and processed in the caller. // Renders all fields except auto-id field; thus -1 if auto-id is contained in the column-value list. int numberOfFieldsToRender = GetTotalNumberOfFieldsToRender(insert); AppendInsertIntoTableName(insert, dbms, output); if (numberOfFieldsToRender > 0) { AppendBracketsWithAllFieldsExceptAutoId(insert, dbms, output, numberOfFieldsToRender); AppendValuesForAllFieldsExceptAutoId(insert, dbms, output, parameters, numberOfFieldsToRender); } else { AppendDefaultValuesExpression(output); } IDbColumn autoIdField = GetAutoIdField(insert.Table); DbParameter autoId = null; if (autoIdField != null) { // RETURNING id output.Append(" RETURNING "); autoIdField.RenderColumnName(dbms, output); autoId = new DbParameter("?", DbType.Int32) { Direction = ParameterDirection.Output }; parameters.Add(autoId); } // Return auto-id DB parameter. Callers require it to retrieve the new ID value. return autoId; }
private static IDbDataParameter ConvertToNativeParameter(DbParameter dbParameter) { IDbDataParameter clone = new FbParameter(); ((FbParameter)clone).IsNullable = dbParameter.IsNullable; clone.ParameterName = parameterRenderer.RenderParameterName(dbParameter); clone.DbType = dbParameter.DbType; clone.Direction = dbParameter.Direction; clone.Precision = dbParameter.Precision; clone.Scale = dbParameter.Scale; clone.Size = dbParameter.Size; clone.SourceColumn = dbParameter.SourceColumn; clone.SourceVersion = dbParameter.SourceVersion; clone.Value = dbParameter.Value; return clone; }
private UpdateExpression(object parameterValue, DbType parameterType, int size, string parameterNamePrefix) { // Unique parameter ID is automatically appended to parameter name during the rendering phase. // Eg: 'parameter_15'. This is a safety precaution. It is possible that there are more // parameters with the same name. DbParameter dbpar = new DbParameter(); dbpar.ParameterName = SqlItemUtil.CleanParameterName(parameterNamePrefix); dbpar.Direction = ParameterDirection.Input; dbpar.DbType = parameterType; dbpar.Value = parameterValue; if (size > 0) dbpar.Size = size; this.Item = dbpar; this.ItemType = SqlItemType.Parameter; this.DataType = DBTypeUtil.NetTypeFrom(parameterType); this.DbType = parameterType; }
///// <summary> ///// Index of newId output parameter in the parameter collection. ///// </summary> ///// <remarks>Renderers set the value to a positive integer if the newId output parameter has been renderd. ///// BatchQuery is the only class that reads the value.</remarks> //internal int NewIdOutputParameterIndexAfterRenderCompleted = -1; /// <summary> /// Renders INSERT statement. /// Throws exception if the columns/values list is empty. /// </summary> /// <param name="dbms">Target DBMS.</param> /// <param name="output">StringBuilder to which SQL is appended.</param> /// <param name="parameters">SQL parameter collection to which the object's and its children's /// parameters are added. After the rendering is done the collection contains all parameters with unique names.</param> public override void Render(DbmsType dbms, StringBuilder output, DbParameterCollection parameters) { // Renderers set the value to a positive integer if the newId output parameter has been renderd. //this.NewIdOutputParameterIndexAfterRenderCompleted = -1; IInserter renderer = DbmsComponentFactory.GetComponent<IInserter>(dbms); DbParameter newId = new DbParameter("newId", DbType.Int32, null, ParameterDirection.Input); renderer.RenderInsert(this, newId, dbms, output, parameters); }
public string RenderParameterName(DbParameter parameter) { return ":" + parameter.ParameterName; }