コード例 #1
0
        public object[][] Select(IDbConnection connection, Metadatas metadata, RowIdentifier row)
        {
            var rows          = new List <object[]>();
            var tableMetadata = metadata.GetTable(row);
            var nbParams      = row.Columns.Count;
            var selectWriter  = SqlWriter.GetSelectWriter()
                                .AppendColumns(row, tableMetadata.ColumnsDefinition);

            using (var cmd = connection.CreateCommand())
            {
                //Build query / params
                for (var i = 0; i < nbParams; i++)
                {
                    var colName   = row.Columns.ElementAt(i).Key;
                    var paramName = SqlWriter.NamedParamPrefix + colName;

                    var p = cmd.CreateParameter();
                    p.ParameterName = paramName;
                    p.Value         = row.Columns.ElementAt(i).Value;
                    cmd.Parameters.Add(p);

                    selectWriter.AppendToWhere(colName, paramName);
                }
                cmd.CommandText = selectWriter.ToStringBuilder().ToString();

                //Exec query
                connection.Open();
                using (var r = cmd.ExecuteReader())
                {
                    while (r.Read())
                    {
                        var values = new object[r.FieldCount];
                        r.GetValues(values);
                        rows.Add(values);
                    }
                }
                connection.Close();
            }
            return(rows.ToArray());
        }
コード例 #2
0
 public static TableMetadata GetTable(this Metadatas metadatas, DerivativeTable dt)
 {
     return(metadatas.GetTable(dt.ServerId, dt.Database, dt.Schema, dt.Table));
 }
コード例 #3
0
 public static TableMetadata GetTable(this Metadatas metadatas, ForeignKey fk)
 {
     return(metadatas.GetTable(fk.ServerIdTo, fk.DatabaseTo, fk.SchemaTo, fk.TableTo));
 }
コード例 #4
0
 public static TableMetadata GetTable(this Metadatas metadatas, TableIdentifier dt)
 {
     return(metadatas.GetTable(dt.ServerId, dt.Database, dt.Schema, dt.Table));
 }
コード例 #5
0
        internal void GemerateInsertStatment(Metadatas metadata, InsertStep step, IDbCommand cmd, StringBuilder sql, IDbTransaction transaction, ref int nbParams)
        {
            var tableMetadata = metadata.GetTable(step.DestinationTable);

            if (tableMetadata.ColumnsDefinition.Count != step.Datarow.Length)
            {
                throw new Exception("The step doesn't correspond to schema!");
            }

            var insertWriter = SqlWriter.GetInsertWriter()
                               .AppendColumns(step.DestinationTable, tableMetadata.ColumnsDefinition);

            var sbPostInsert = new StringBuilder();

            //Valeurs des colonnes
            for (var i = 0; i < tableMetadata.ColumnsDefinition.Count; i++)
            {
                var col    = tableMetadata.ColumnsDefinition[i];
                var sqlVar = step.Datarow[i] as SqlVariable;

                //Variable à générer
                if (((col.IsPrimary && !col.IsAutoIncrement) || col.IsUniqueKey) && !col.IsForeignKey)
                {
                    if (sqlVar == null)
                    {
                        throw new NullReferenceException();
                    }

                    sqlVar.Value = DataBuilder.BuildDataColumn(this, transaction, step.DestinationTable.ServerId, step.DestinationTable.Database,
                                                               step.DestinationTable.Schema, step.TableMetadata, col);
                    insertWriter.AppendValue(sqlVar.Value);
                }
                //Post insert variable (auto generated primary key)
                else if (col.IsPrimary && col.IsAutoIncrement)
                {
                    if (sqlVar == null)
                    {
                        throw new NullReferenceException();
                    }

                    if (step.Depth == 0 || sqlVar.QueryValue)
                    {
                        sbPostInsert.Append(SqlWriter.SelectLastIdentity(sqlVar.Id, tableMetadata.Name, col.Name));
                    }
                }
                //Normal variables
                else
                {
                    //On fait référence à une variable
                    if (sqlVar != null)
                    {
                        //Si variable auto-généré
                        if (sqlVar.Value == null)
                        {
                            insertWriter.AppendVariable(sqlVar.Id.ToString());
                        }
                        //Sinon variable déjà générée
                        else
                        {
                            insertWriter.AppendValue(sqlVar.Value);
                        }
                    }
                    //C'est une valeur brute
                    else
                    {
                        var sqlVarName = SqlWriter.NamedParamPrefix + tableMetadata.ColumnsDefinition[i].Name.FormatSqlParam() + step.StepId;
                        var p          = cmd.CreateParameter();
                        p.ParameterName = sqlVarName;

                        if (col.IsDataColumnBuildable())
                        {
                            p.Value = DataBuilder.BuildDataColumn(this, transaction, step.DestinationTable.ServerId, step.DestinationTable.Database,
                                                                  step.DestinationTable.Schema, step.TableMetadata, col);
                        }
                        else
                        {
                            p.Value = step.Datarow[i];
                        }
                        p.DbType = col.DbType;
                        cmd.Parameters.Add(p);

                        insertWriter.Append(sqlVarName).Append(",");
                        nbParams++;
                    }
                }
            }
            insertWriter.Complete();

            sql.Append(insertWriter.ToStringBuilder())
            .Append(sbPostInsert);
        }