public void SetTable(DataTable table) { if (!GetTables().Contains(table.TableName)) return; using (var tx = connect.BeginTransaction()) { try { CreateCommand("delete from " + Quote(table.TableName) + GetWhere(table.TableName)).ExecuteNonQuery(); var sql = new StringBuilder("insert into " + Quote(table.TableName) + "("); var columns = GetColumns(table.TableName); var newColumns = table.Columns.Cast<DataColumn>().Select(c => c.ColumnName); columns = columns.Intersect(newColumns).ToList(); columns.ForEach(column => sql.AppendFormat("{0}, ", Quote(column))); sql.Replace(", ", ") values (", sql.Length - 2, 2); var insert = connect.CreateCommand(); columns.ForEach(column => { sql.AppendFormat("@{0}, ", column); var p = insert.CreateParameter(); p.ParameterName = p.SourceColumn = column; insert.Parameters.Add(p); }); sql.Replace(", ", ")", sql.Length - 2, 2); insert.CommandText = sql.ToString(); foreach (var r in table.Rows.Cast<DataRow>()) { foreach (var c in columns) { ((IDbDataParameter)insert.Parameters[c]).Value = r[c]; } insert.ExecuteNonQuery(); } tx.Commit(); } catch (Exception e) { log.ErrorFormat("Table {0}: {1}", table, e); } } }
protected void Emit(string protocol, DataTable data, string url) { data.ForEach(row => { CreateCarrierIfReceiver(protocol, signal => { signal.URL.Value = url; // .Value because this is a semantic element and Value drills into the implementing native type. // Use the protocol as the driver of the fields we want to emit. ISemanticTypeStruct st = rsys.SemanticTypeSystem.GetSemanticTypeStruct(protocol); st.AllTypes.ForEach(se => { // Sometimes a column will be missing. if (data.Columns.Contains(se.Name)) { object val = row[se.Name]; if (val != null && val != DBNull.Value) { se.SetValue(rsys.SemanticTypeSystem, signal, val); } } }); }); }); }