Radarr/Marr.Data/QGen/InsertQuery.cs

68 lines
2.0 KiB
C#

using System.Text;
using Marr.Data.Mapping;
using System.Data.Common;
using Marr.Data.QGen.Dialects;
namespace Marr.Data.QGen
{
/// <summary>
/// This class creates an insert query.
/// </summary>
public class InsertQuery : IQuery
{
protected Dialect Dialect { get; set; }
protected string Target { get; set; }
protected ColumnMapCollection Columns { get; set; }
protected DbCommand Command { get; set; }
public InsertQuery(Dialect dialect, ColumnMapCollection columns, DbCommand command, string target)
{
if (string.IsNullOrEmpty(target))
{
throw new DataMappingException("A target table must be passed in or set in a TableAttribute.");
}
Dialect = dialect;
Target = target;
Columns = columns;
Command = command;
}
public virtual string Generate()
{
StringBuilder sql = new StringBuilder();
StringBuilder values = new StringBuilder(") VALUES (");
sql.AppendFormat("INSERT INTO {0} (", Dialect.CreateToken(Target));
int sqlStartIndex = sql.Length;
int valuesStartIndex = values.Length;
foreach (DbParameter p in Command.Parameters)
{
var c = Columns.GetByColumnName(p.ParameterName);
if (c == null)
break; // All insert columns have been added
if (sql.Length > sqlStartIndex)
sql.Append(",");
if (values.Length > valuesStartIndex)
values.Append(",");
if (!c.ColumnInfo.IsAutoIncrement)
{
sql.AppendFormat(Dialect.CreateToken(c.ColumnInfo.Name));
values.AppendFormat("{0}{1}", Command.ParameterPrefix(), p.ParameterName);
}
}
values.Append(")");
sql.Append(values);
return sql.ToString();
}
}
}