示例#1
0
        /// <summary>
        /// Get columns for table
        /// </summary>
        internal static DmTable PrimaryKeysForTable(SqlConnection connection, SqlTransaction transaction, string tableName)
        {
            var commandColumn = @"select ind.name, col.name as columnName, ind_col.column_id, ind_col.key_ordinal 
                                  from sys.indexes ind
                                  left outer join sys.index_columns ind_col on ind_col.object_id = ind.object_id and ind_col.index_id = ind.index_id
                                  inner join sys.columns col on col.object_id = ind_col.object_id and col.column_id = ind_col.column_id
                                  inner join sys.tables tbl on tbl.object_id = ind.object_id
                                  where tbl.name = @tableName and ind.index_id >= 0 and ind.type <> 3 and ind.type <> 4 and ind.is_hypothetical = 0 and ind.is_primary_key = 1
                                  order by ind.index_id, ind_col.key_ordinal";

            var tableNameNormalized = ParserName.Parse(tableName).Unquoted().Normalized().ToString();
            var tableNameString     = ParserName.Parse(tableName).ToString();

            var dmTable = new DmTable(tableNameNormalized);

            using (var sqlCommand = new SqlCommand(commandColumn, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameString);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }
            return(dmTable);
        }
        /// <summary>
        /// Get relations table
        /// </summary>
        internal static DmTable RelationsForTable(OracleConnection connection, OracleTransaction transaction, string tableName)
        {
            var commandRelations = @"SELECT a.constraint_name AS ForeignKey, a.table_name AS TableName, a.column_name AS ColumnName, 
                                           c_pk.table_name AS ReferenceTableName,  b.column_name AS ReferenceColumnName
                                      FROM user_cons_columns a
                                      JOIN user_constraints c ON a.owner = c.owner
                                           AND a.constraint_name = c.constraint_name
                                      JOIN user_constraints c_pk ON c.r_owner = c_pk.owner
                                           AND c.r_constraint_name = c_pk.constraint_name
                                      JOIN user_cons_columns b ON C_PK.owner = b.owner
                                           AND  C_PK.CONSTRAINT_NAME = b.constraint_name AND b.POSITION = a.POSITION     
                                     WHERE c.constraint_type = 'R' AND a.table_name = :tableName";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName);
            DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);

            using (OracleCommand oracleCommand = new OracleCommand(commandRelations, connection, transaction))
            {
                oracleCommand.Parameters.Add("tableName", tableNameParser.ObjectName);

                using (var reader = oracleCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }


            return(dmTable);
        }
        internal static DmTable RelationsForTable(MySqlConnection connection, MySqlTransaction transaction, string tableName)
        {
            var commandRelations = @"Select CONSTRAINT_NAME as ForeignKey,
		                                    TABLE_NAME as TableName,
                                            COLUMN_NAME as ColumnName,
                                            REFERENCED_TABLE_NAME as ReferenceTableName,
                                            REFERENCED_COLUMN_NAME as ReferenceColumnName
                                    from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
                                    Where upper(TABLE_SCHEMA) = upper(@schema)
                                    and REFERENCED_TABLE_NAME is not null and upper(TABLE_NAME) = upper(@tableName)";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName, "`", "`");
            DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);

            using (MySqlCommand sqlCommand = new MySqlCommand(commandRelations, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);
                sqlCommand.Parameters.AddWithValue("@schema", connection.Database);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }


            return(dmTable);
        }
示例#4
0
        internal static DmTable RelationsForTable(MySqlConnection connection, MySqlTransaction transaction, string tableName)
        {
            var commandRelations = @"
            SELECT
              ke.CONSTRAINT_NAME as ForeignKey,
              ke.POSITION_IN_UNIQUE_CONSTRAINT as ForeignKeyOrder,
              ke.referenced_table_name as TableName,
              ke.REFERENCED_COLUMN_NAME as ColumnName,
              ke.table_name ReferenceTableName,
              ke.COLUMN_NAME ReferenceColumnName
            FROM
              information_schema.KEY_COLUMN_USAGE ke
            WHERE
              ke.referenced_table_name IS NOT NULL
              and ke.REFERENCED_TABLE_SCHEMA = schema()
              AND ke.REFERENCED_TABLE_NAME = @tableName
            ORDER BY
              ke.referenced_table_name;";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName, "`", "`");
            DmTable          dmTable         = new DmTable(tableNameParser.ObjectNameNormalized);

            using (MySqlCommand sqlCommand = new MySqlCommand(commandRelations, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }


            return(dmTable);
        }
示例#5
0
        /// <summary>
        /// Get columns for table
        /// </summary>
        public static DmTable ColumnsForTable(SqlConnection connection, SqlTransaction transaction, string tableName)
        {
            var commandColumn = $"Select col.name as name, col.column_id, typ.name as [type], col.max_length, col.precision, col.scale, col.is_nullable, col.is_computed, col.is_identity, ind.is_unique " +
                                $"from sys.columns as col " +
                                $"Inner join sys.tables as tbl on tbl.object_id = col.object_id " +
                                $"Inner Join sys.systypes typ on typ.xusertype = col.system_type_id " +
                                $"Left outer join sys.indexes ind on ind.object_id = col.object_id and ind.index_id = col.column_id " +
                                $"Where tbl.name = @tableName";

            var tableNameNormalized = ParserName.Parse(tableName).Unquoted().Normalized().ToString();
            var tableNameString     = ParserName.Parse(tableName).ToString();

            var dmTable = new DmTable(tableNameNormalized);

            using (var sqlCommand = new SqlCommand(commandColumn, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameString);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }
            return(dmTable);
        }
示例#6
0
        internal static DmTable RelationsForTable(SqlConnection connection, SqlTransaction transaction, string tableName)
        {
            var commandRelations = @"SELECT f.name AS ForeignKey,
                                        constraint_column_id as ForeignKeyOrder,
                                        OBJECT_NAME (f.referenced_object_id)  AS TableName,
                                        COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ColumnName,
                                        OBJECT_NAME(f.parent_object_id) AS ReferenceTableName,
                                        COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ReferenceColumnName
                                    FROM sys.foreign_keys AS f
                                    INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
                                    WHERE OBJECT_NAME(f.referenced_object_id) = @tableName";

            var tableNameNormalized = ParserName.Parse(tableName).Unquoted().Normalized().ToString();
            var tableNameString     = ParserName.Parse(tableName).ToString();

            var dmTable = new DmTable(tableNameNormalized);

            using (var sqlCommand = new SqlCommand(commandRelations, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameString);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }


            return(dmTable);
        }
示例#7
0
        /// <summary>
        /// Try to get a source row
        /// </summary>
        /// <returns></returns>
        private DmTable GetRow(DmRow sourceRow)
        {
            // Get the row in the local repository
            DbCommand selectCommand = GetCommand(DbCommandType.SelectRow);

            // Deriving Parameters
            this.SetCommandParameters(DbCommandType.SelectRow, selectCommand);

            this.SetColumnParametersValues(selectCommand, sourceRow);

            var alreadyOpened = Connection.State == ConnectionState.Open;

            // Open Connection
            if (!alreadyOpened)
            {
                Connection.Open();
            }

            if (Transaction != null)
            {
                selectCommand.Transaction = Transaction;
            }

            var dmTableSelected = new DmTable(this.TableDescription.TableName);

            try
            {
                using (var reader = selectCommand.ExecuteReader())
                    dmTableSelected.Fill(reader);

                // set the pkey since we will need them later
                var pkeys = new DmColumn[this.TableDescription.PrimaryKey.Columns.Length];
                for (int i = 0; i < pkeys.Length; i++)
                {
                    var pkName = this.TableDescription.PrimaryKey.Columns[i].ColumnName;
                    pkeys[i] = dmTableSelected.Columns.First(dm => this.TableDescription.IsEqual(dm.ColumnName, pkName));
                }
                dmTableSelected.PrimaryKey = new DmKey(pkeys);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Server Error on Getting a row : " + ex.Message);
                throw;
            }
            finally
            {
                // Close Connection
                if (!alreadyOpened)
                {
                    Connection.Close();
                }
            }

            return(dmTableSelected);
        }
        internal static DmTable RelationsForTable(NpgsqlConnection connection, NpgsqlTransaction transaction, string tableName)
        {
            var commandRelations = @"select 
                    con.constraint_name as ""foreignKey"",
                    att2.attname as ""columnName"", 
                    cl.relname as ""referenceTableName"", 
                    att.attname as ""referenceColumnName"",
                    con.child_table as ""tableName"",
                    con.child_schema
                    from
                    (select
                        unnest(con1.conkey) as ""parent"",
                    unnest(con1.confkey) as ""child"",
                    con1.conname as constraint_name,
                    con1.confrelid,
                    con1.conrelid,
                    cl.relname as child_table,
                    ns.nspname as child_schema
                    from
                        pg_class cl
                        join pg_namespace ns on cl.relnamespace = ns.oid
                    join pg_constraint con1 on con1.conrelid = cl.oid
                    where con1.contype = 'f'
                        ) con
                        join pg_attribute att on
                    att.attrelid = con.confrelid and att.attnum = con.child
                    join pg_class cl on
                    cl.oid = con.confrelid
                    join pg_attribute att2 on
                    att2.attrelid = con.conrelid and att2.attnum = con.parent
                WHERE con.child_table = @tableName AND con.child_schema = current_schema()";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName, "\"", "\"");
            DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);

            using (var sqlCommand = new NpgsqlCommand(commandRelations, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }


            return(dmTable);
        }
示例#9
0
        public override void ExecuteBatchCommand(DbCommand cmd, DmView applyTable, DmTable failedRows, ScopeInfo scope)
        {
            if (applyTable.Count <= 0)
            {
                return;
            }

            // Insert data in bulk table
            BulkInsertTemporyTable(BulkInsertTemporyTableText(applyTable));

            ((OracleParameterCollection)cmd.Parameters)["sync_scope_id"].Value      = scope.Id;
            ((OracleParameterCollection)cmd.Parameters)["sync_min_timestamp"].Value = scope.LastTimestamp;

            bool alreadyOpened = this._connection.State == ConnectionState.Open;

            try
            {
                if (!alreadyOpened)
                {
                    this._connection.Open();
                }

                if (this._transaction != null)
                {
                    cmd.Transaction = this._transaction;
                }

                using (DbDataReader dataReader = cmd.ExecuteReader())
                {
                    failedRows.Fill(dataReader);
                }
            }
            catch (DbException ex)
            {
                Debug.WriteLine(ex.Message);
                throw;
            }
            finally
            {
                if (!alreadyOpened && this._connection.State != ConnectionState.Closed)
                {
                    this._connection.Close();
                }
            }
        }
示例#10
0
        public static DmTable ColumnsForTable(MySqlConnection connection, MySqlTransaction transaction, string tableName)
        {
            string commandColumn = "select * from information_schema.COLUMNS where table_schema = schema() and table_name = @tableName";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName, "`", "`");
            DmTable          dmTable         = new DmTable(tableNameParser.ObjectNameNormalized);

            using (MySqlCommand sqlCommand = new MySqlCommand(commandColumn, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }
            return(dmTable);
        }
        internal static DmTable ColumnsForTable(NpgsqlConnection connection, NpgsqlTransaction transaction, string tableName)
        {
            string commandColumn = "select * from information_schema.columns WHERE table_schema = current_schema() and table_name = @tableName";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName, "\"", "\"");
            DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);

            using (var sqlCommand = new NpgsqlCommand(commandColumn, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }
            return(dmTable);
        }
        internal static DmTable PrimaryKeysForTable(MySqlConnection connection, MySqlTransaction transaction, string tableName)
        {
            var commandColumn = @"select * from information_schema.COLUMNS where table_schema = schema() and table_name = @tableName and column_key='PRI'";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName, "`", "`");
            DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);

            using (MySqlCommand sqlCommand = new MySqlCommand(commandColumn, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }
            return(dmTable);
        }
        /// <summary>
        /// Get columns for table
        /// </summary>
        public static DmTable ColumnsForTable(OracleConnection connection, OracleTransaction transaction, string tableName)
        {
            var commandColumn = @"SELECT column_name AS name, column_id, data_type, data_length, data_precision, data_scale, decode(nullable, 'N', 0, 1) AS is_nullable
                                    FROM USER_TAB_COLUMNS
                                    WHERE TABLE_NAME = :tableName";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName);
            DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);

            using (OracleCommand oracleCommand = new OracleCommand(commandColumn, connection, transaction))
            {
                oracleCommand.Parameters.Add("tableName", tableNameParser.ObjectName);

                using (var reader = oracleCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }
            return(dmTable);
        }
示例#14
0
        /// <summary>
        /// Get columns for table
        /// </summary>
        internal static DmTable ColumnsForTable(SqlConnection connection, SqlTransaction transaction, string tableName)
        {
            var commandColumn = $"Select col.name as name, col.column_id, typ.name as [type], col.max_length, col.precision, col.scale, col.is_nullable, col.is_identity from sys.columns as col " +
                                $"Inner join sys.tables as tbl on tbl.object_id = col.object_id " +
                                $"Inner Join sys.systypes typ on typ.xusertype = col.system_type_id " +
                                $"Where tbl.name = @tableName";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName);
            DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);

            using (SqlCommand sqlCommand = new SqlCommand(commandColumn, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }
            return(dmTable);
        }
        internal static DmTable PrimaryKeysForTable(NpgsqlConnection connection, NpgsqlTransaction transaction, string tableName)
        {
            var commandColumn = @"SELECT c.column_name, c.ordinal_position, *
                                  FROM information_schema.key_column_usage AS c
                                  LEFT JOIN information_schema.table_constraints AS t
                                  ON t.constraint_name = c.constraint_name
                                  WHERE t.table_schema = current_schema() AND t.table_name = @tableName AND t.constraint_type = 'PRIMARY KEY';";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName, "\"", "\"");
            DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);

            using (var sqlCommand = new NpgsqlCommand(commandColumn, connection, transaction))
            {
                sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);

                using (var reader = sqlCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }
            return(dmTable);
        }
        /// <summary>
        /// Get columns for table
        /// </summary>
        internal static DmTable PrimaryKeysForTable(OracleConnection connection, OracleTransaction transaction, string tableName)
        {
            var commandColumn = @"SELECT ac.constraint_name as name, column_name as columnName, position as column_id
                                    FROM all_cons_columns acc
                                    INNER JOIN all_constraints ac
                                    ON acc.constraint_name = ac.constraint_name AND acc.table_name = ac.table_name
                                    WHERE CONSTRAINT_TYPE IN ('P') AND ac.table_name = :tableName";

            ObjectNameParser tableNameParser = new ObjectNameParser(tableName);
            DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);

            using (OracleCommand oracleCommand = new OracleCommand(commandColumn, connection, transaction))
            {
                oracleCommand.Parameters.Add("tableName", tableNameParser.ObjectName);

                using (var reader = oracleCommand.ExecuteReader())
                {
                    dmTable.Fill(reader);
                }
            }

            return(dmTable);
        }
示例#17
0
        public void BuilderTable_CreateTable()
        {
            var provider = new SqlSyncProvider(clientConnectionString);

            using (var connection = provider.CreateConnection())
            {
                var options = DbBuilderOption.CreateOrUseExistingSchema;
                var builder = provider.GetDatabaseBuilder(set.Tables["Products"], options);

                var tableBuilder = builder.CreateTableBuilder(connection);
                tableBuilder.TableDescription = builder.TableDescription;

                connection.Open();

                // Check if we need to create the tables
                if (tableBuilder.NeedToCreateTable(options))
                {
                    tableBuilder.CreateTable();
                    tableBuilder.CreatePrimaryKey();
                    tableBuilder.CreateForeignKeyConstraints();
                }

                connection.Close();
            }

            // Check result
            using (var connection = new SqlConnection(clientConnectionString))
            {
                var table = set.Tables["Products"];

                // Check Columns
                var commandColumn = $"Select col.name as name, col.column_id, typ.name as [type], col.max_length, col.precision, col.scale, col.is_nullable, col.is_identity from sys.columns as col " +
                                    $"Inner join sys.tables as tbl on tbl.object_id = col.object_id " +
                                    $"Inner Join sys.systypes typ on typ.xusertype = col.system_type_id " +
                                    $"Where tbl.name = @tableName " +
                                    $"Order by col.column_id";

                ObjectNameParser tableNameParser = new ObjectNameParser(table.TableName);
                DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);
                using (SqlCommand sqlCommand = new SqlCommand(commandColumn, connection))
                {
                    sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);

                    connection.Open();
                    using (var reader = sqlCommand.ExecuteReader())
                    {
                        dmTable.Fill(reader);
                    }
                    connection.Close();
                }

                // Check columns number
                Assert.Equal(4, dmTable.Rows.Count);
                var rows = dmTable.Rows.OrderBy(r => (int)r["column_id"]).ToList();

                var c          = rows[0];
                var name       = c["name"].ToString();
                var ordinal    = (int)c["column_id"];
                var typeString = c["type"].ToString();
                var maxLength  = (Int16)c["max_length"];
                var precision  = (byte)c["precision"];
                var scale      = (byte)c["scale"];
                var isNullable = (bool)c["is_nullable"];
                var isIdentity = (bool)c["is_identity"];

                Assert.Equal("Id", name);
                Assert.False(isNullable);
                Assert.True(isIdentity);

                c          = rows[1];
                name       = c["name"].ToString();
                ordinal    = (int)c["column_id"];
                typeString = c["type"].ToString();
                maxLength  = (Int16)c["max_length"];
                precision  = (byte)c["precision"];
                scale      = (byte)c["scale"];
                isNullable = (bool)c["is_nullable"];
                isIdentity = (bool)c["is_identity"];

                Assert.Equal("clientId", name);
                Assert.True(isNullable);
                Assert.False(isIdentity);

                c          = rows[2];
                name       = c["name"].ToString();
                ordinal    = (int)c["column_id"];
                typeString = c["type"].ToString();
                maxLength  = (Int16)c["max_length"];
                precision  = (byte)c["precision"];
                scale      = (byte)c["scale"];
                isNullable = (bool)c["is_nullable"];
                isIdentity = (bool)c["is_identity"];

                Assert.Equal("name", name);
                Assert.False(isNullable);
                Assert.Equal(300, maxLength);
                Assert.Equal("nvarchar", typeString);

                c          = rows[3];
                name       = c["name"].ToString();
                ordinal    = (int)c["column_id"];
                typeString = c["type"].ToString();
                maxLength  = (Int16)c["max_length"];
                precision  = (byte)c["precision"];
                scale      = (byte)c["scale"];
                isNullable = (bool)c["is_nullable"];
                isIdentity = (bool)c["is_identity"];

                Assert.Equal("salary", name);
                Assert.False(isNullable);
                Assert.Equal(6, precision);
                Assert.Equal(2, scale);
            }
        }
示例#18
0
        /// <summary>
        /// Executing a batch command
        /// </summary>
        /// <param name="cmd">the DbCommand already prepared</param>
        /// <param name="applyTable">the table rows to apply</param>
        /// <param name="failedRows">the failed rows dmTable to store failed rows</param>
        /// <param name="scope">the current scope</param>
        public override void ExecuteBatchCommand(DbCommand cmd, DmTable applyTable, DmTable failedRows, ScopeInfo scope)
        {
            if (applyTable.Rows.Count <= 0)
            {
                return;
            }

            List <SqlDataRecord> records = new List <SqlDataRecord>(applyTable.Rows.Count);

            SqlMetaData[] metadatas = new SqlMetaData[applyTable.Columns.Count];
            for (int i = 0; i < applyTable.Columns.Count; i++)
            {
                var column = applyTable.Columns[i];

                SqlMetaData metadata = GetSqlMetadaFromType(column);
                metadatas[i] = metadata;
            }

            foreach (var dmRow in applyTable.Rows)
            {
                SqlDataRecord record = new SqlDataRecord(metadatas);
                for (int i = 0; i < dmRow.ItemArray.Length; i++)
                {
                    var     c            = dmRow.Table.Columns[i];
                    dynamic defaultValue = c.DefaultValue;
                    dynamic rowValue     = dmRow[i];

                    if (c.AllowDBNull && rowValue == null)
                    {
                        rowValue = DBNull.Value;
                    }
                    else if (rowValue == null)
                    {
                        rowValue = defaultValue;
                    }

                    record.SetValue(i, rowValue);
                }
                records.Add(record);
            }

            ((SqlParameterCollection)cmd.Parameters)["@changeTable"].TypeName     = string.Empty;
            ((SqlParameterCollection)cmd.Parameters)["@changeTable"].Value        = records;
            ((SqlParameterCollection)cmd.Parameters)["@sync_scope_id"].Value      = scope.Id;
            ((SqlParameterCollection)cmd.Parameters)["@sync_min_timestamp"].Value = scope.LastTimestamp;

            bool alreadyOpened = this.connection.State == ConnectionState.Open;

            try
            {
                if (!alreadyOpened)
                {
                    this.connection.Open();
                }

                if (this.transaction != null)
                {
                    cmd.Transaction = this.transaction;
                }


                using (DbDataReader dataReader = cmd.ExecuteReader())
                {
                    failedRows.Fill(dataReader);
                }
            }
            catch (DbException ex)
            {
                //DbException dbException = dbException1;
                //Error = CheckZombieTransaction(tvpCommandNameForApplyType, Adapter.TableName, dbException);
                //this.AddFailedRowsAfterRIFailure(applyTable, failedRows);
            }
            finally
            {
                if (!alreadyOpened && this.connection.State != ConnectionState.Closed)
                {
                    this.connection.Close();
                }
            }
        }
示例#19
0
        /// <summary>
        /// Executing a batch command
        /// </summary>
        /// <param name="cmd">the DbCommand already prepared</param>
        /// <param name="applyTable">the table rows to apply</param>
        /// <param name="failedRows">the failed rows dmTable to store failed rows</param>
        /// <param name="scope">the current scope</param>
        public override void ExecuteBatchCommand(DbCommand cmd, DmView applyTable, DmTable failedRows, ScopeInfo scope)
        {
            if (applyTable.Count <= 0)
            {
                return;
            }

            var lstMutableColumns = applyTable.Table.Columns.Where(c => !c.IsReadOnly).ToList();

            List <SqlDataRecord> records = new List <SqlDataRecord>(applyTable.Count);

            SqlMetaData[] metadatas = new SqlMetaData[lstMutableColumns.Count];

            for (int i = 0; i < lstMutableColumns.Count; i++)
            {
                var column = lstMutableColumns[i];

                SqlMetaData metadata = GetSqlMetadaFromType(column);
                metadatas[i] = metadata;
            }
            try
            {
                foreach (var dmRow in applyTable)
                {
                    SqlDataRecord record = new SqlDataRecord(metadatas);

                    int  sqlMetadataIndex = 0;
                    bool isDeleted        = false;

                    // Cancel the delete state to be able to get the row, more simplier
                    if (dmRow.RowState == DmRowState.Deleted)
                    {
                        isDeleted = true;
                        dmRow.RejectChanges();
                    }

                    for (int i = 0; i < dmRow.ItemArray.Length; i++)
                    {
                        // check if it's readonly
                        if (applyTable.Table.Columns[i].IsReadOnly)
                        {
                            continue;
                        }

                        // Get the default value
                        // Since we have the readonly values in ItemArray, get the value from original column
                        dynamic defaultValue = applyTable.Table.Columns[i].DefaultValue;
                        dynamic rowValue     = dmRow[i];
                        var     columnType   = applyTable.Table.Columns[i].DataType;

                        // metadatas don't have readonly values, so get from sqlMetadataIndex
                        var sqlMetadataType = metadatas[sqlMetadataIndex].SqlDbType;
                        if (rowValue != null)
                        {
                            switch (sqlMetadataType)
                            {
                            case SqlDbType.BigInt:
                                if (columnType != typeof(long))
                                {
                                    if (Int64.TryParse(rowValue.ToString(), out Int64 v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Int64");
                                    }
                                }
                                break;

                            case SqlDbType.Bit:
                                if (columnType != typeof(bool))
                                {
                                    if (Boolean.TryParse(rowValue.ToString(), out Boolean v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Boolean");
                                    }
                                }
                                break;

                            case SqlDbType.Date:
                            case SqlDbType.DateTime:
                            case SqlDbType.DateTime2:
                            case SqlDbType.SmallDateTime:
                                if (columnType != typeof(DateTime))
                                {
                                    if (DateTime.TryParse(rowValue.ToString(), out DateTime v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to DateTime");
                                    }
                                }
                                break;

                            case SqlDbType.DateTimeOffset:
                                if (columnType != typeof(DateTimeOffset))
                                {
                                    if (DateTimeOffset.TryParse(rowValue.ToString(), out DateTimeOffset dt))
                                    {
                                        rowValue = dt;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to DateTimeOffset");
                                    }
                                }
                                break;

                            case SqlDbType.Decimal:
                                if (columnType != typeof(Decimal))
                                {
                                    if (Decimal.TryParse(rowValue.ToString(), out decimal v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Decimal");
                                    }
                                }
                                break;

                            case SqlDbType.Float:
                                if (columnType != typeof(Double))
                                {
                                    if (Double.TryParse(rowValue.ToString(), out Double v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Double");
                                    }
                                }
                                break;

                            case SqlDbType.Real:
                                if (columnType != typeof(float))
                                {
                                    if (float.TryParse(rowValue.ToString(), out float v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Double");
                                    }
                                }
                                break;

                            case SqlDbType.Image:
                            case SqlDbType.Binary:
                            case SqlDbType.VarBinary:
                                if (columnType != typeof(Byte[]))
                                {
                                    rowValue = BitConverter.GetBytes(rowValue);
                                }
                                break;

                            case SqlDbType.Variant:
                                break;

                            case SqlDbType.Int:
                                if (columnType != typeof(Int32))
                                {
                                    if (Int32.TryParse(rowValue.ToString(), out int v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Int32");
                                    }
                                }
                                break;

                            case SqlDbType.Money:
                            case SqlDbType.SmallMoney:
                                if (columnType != typeof(Decimal))
                                {
                                    if (Decimal.TryParse(rowValue.ToString(), out Decimal v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Decimal");
                                    }
                                }
                                break;

                            case SqlDbType.NChar:
                            case SqlDbType.NText:
                            case SqlDbType.VarChar:
                            case SqlDbType.Xml:
                            case SqlDbType.NVarChar:
                            case SqlDbType.Text:
                            case SqlDbType.Char:
                                if (columnType != typeof(string))
                                {
                                    rowValue = rowValue.ToString();
                                }
                                break;

                            case SqlDbType.SmallInt:
                                if (columnType != typeof(Int16))
                                {
                                    if (Int16.TryParse(rowValue.ToString(), out Int16 v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Int16");
                                    }
                                }
                                break;

                            case SqlDbType.Time:
                                if (columnType != typeof(TimeSpan))
                                {
                                    if (TimeSpan.TryParse(rowValue.ToString(), out TimeSpan v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to TimeSpan");
                                    }
                                }
                                break;

                            case SqlDbType.Timestamp:
                                break;

                            case SqlDbType.TinyInt:
                                if (columnType != typeof(Byte))
                                {
                                    if (Byte.TryParse(rowValue.ToString(), out byte v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Byte");
                                    }
                                }
                                break;

                            case SqlDbType.Udt:
                                throw new ArgumentException($"Can't use UDT as SQL Type");

                            case SqlDbType.UniqueIdentifier:
                                if (columnType != typeof(Guid))
                                {
                                    if (Guid.TryParse(rowValue.ToString(), out Guid v))
                                    {
                                        rowValue = v;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException($"Can't convert value {rowValue} to Guid");
                                    }
                                }
                                break;
                            }
                        }

                        if (applyTable.Table.Columns[i].AllowDBNull && rowValue == null)
                        {
                            rowValue = DBNull.Value;
                        }
                        else if (rowValue == null)
                        {
                            rowValue = defaultValue;
                        }

                        record.SetValue(sqlMetadataIndex, rowValue);
                        sqlMetadataIndex++;
                    }
                    records.Add(record);

                    // Apply the delete
                    // is it mandatory ?
                    if (isDeleted)
                    {
                        dmRow.Delete();
                    }
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException($"Can't create a SqlRecord based on the rows we have: {ex.Message}");
            }

            ((SqlParameterCollection)cmd.Parameters)["@changeTable"].TypeName     = string.Empty;
            ((SqlParameterCollection)cmd.Parameters)["@changeTable"].Value        = records;
            ((SqlParameterCollection)cmd.Parameters)["@sync_scope_id"].Value      = scope.Id;
            ((SqlParameterCollection)cmd.Parameters)["@sync_min_timestamp"].Value = scope.Timestamp;

            bool alreadyOpened = this.connection.State == ConnectionState.Open;

            try
            {
                if (!alreadyOpened)
                {
                    this.connection.Open();
                }

                if (this.transaction != null)
                {
                    cmd.Transaction = this.transaction;
                }


                using (DbDataReader dataReader = cmd.ExecuteReader())
                {
                    failedRows.Fill(dataReader);
                }
            }
            catch (DbException ex)
            {
                Debug.WriteLine(ex.Message);
                //DbException dbException = dbException1;
                //Error = CheckZombieTransaction(tvpCommandNameForApplyType, Adapter.TableName, dbException);
                //this.AddFailedRowsAfterRIFailure(applyTable, failedRows);
                throw;
            }
            finally
            {
                records.Clear();
                records = null;

                if (!alreadyOpened && this.connection.State != ConnectionState.Closed)
                {
                    this.connection.Close();
                }
            }
        }
示例#20
0
        public void BuilderTable_CreateTrackingTable()
        {
            var provider = new SqlSyncProvider(clientConnectionString);

            using (var connection = provider.CreateConnection())
            {
                var options = DbBuilderOption.CreateOrUseExistingSchema;
                var builder = provider.GetDatabaseBuilder(set.Tables["Products"], options);

                var tableBuilder = builder.CreateTrackingTableBuilder(connection);
                tableBuilder.TableDescription = builder.TableDescription;

                connection.Open();

                // Check if we need to create the tables
                tableBuilder.CreateTable();
                tableBuilder.CreatePk();
                tableBuilder.CreateIndex();

                connection.Close();
            }

            // Check result
            using (var connection = new SqlConnection(clientConnectionString))
            {
                var table = set.Tables["Products"];

                // Check Columns
                var commandColumn = $"Select col.name as name, col.column_id, typ.name as [type], col.max_length, col.precision, col.scale, col.is_nullable, col.is_identity from sys.columns as col " +
                                    $"Inner join sys.tables as tbl on tbl.object_id = col.object_id " +
                                    $"Inner Join sys.systypes typ on typ.xusertype = col.system_type_id " +
                                    $"Where tbl.name = @tableName " +
                                    $"Order by col.column_id";

                ObjectNameParser tableNameParser = new ObjectNameParser(table.TableName + "_tracking");
                DmTable          dmTable         = new DmTable(tableNameParser.UnquotedStringWithUnderScore);
                using (SqlCommand sqlCommand = new SqlCommand(commandColumn, connection))
                {
                    sqlCommand.Parameters.AddWithValue("@tableName", tableNameParser.ObjectName);

                    connection.Open();
                    using (var reader = sqlCommand.ExecuteReader())
                    {
                        dmTable.Fill(reader);
                    }
                    connection.Close();
                }

                // Check columns number
                Assert.Equal(10, dmTable.Rows.Count);
                var rows = dmTable.Rows.OrderBy(r => (int)r["column_id"]).ToList();

                var c    = rows[0];
                var name = c["name"].ToString();
                Assert.Equal("Id", name);
                c    = rows[1];
                name = c["name"].ToString();
                Assert.Equal("name", name);
                c    = rows[2];
                name = c["name"].ToString();
                Assert.Equal("salary", name);
                c    = rows[3];
                name = c["name"].ToString();
                Assert.Equal("create_scope_id", name);
                c    = rows[4];
                name = c["name"].ToString();
                Assert.Equal("update_scope_id", name);
                c    = rows[5];
                name = c["name"].ToString();
                Assert.Equal("create_timestamp", name);
                c    = rows[6];
                name = c["name"].ToString();
                Assert.Equal("update_timestamp", name);
                c    = rows[7];
                name = c["name"].ToString();
                Assert.Equal("timestamp", name);
                c    = rows[8];
                name = c["name"].ToString();
                Assert.Equal("sync_row_is_tombstone", name);
                c    = rows[9];
                name = c["name"].ToString();
                Assert.Equal("last_change_datetime", name);
            }
        }