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);
                    }
                }
            }
Example #2
0
		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);
										}
									}
								});
						});
				});
		}