public override void FillTableSchema(DataTable table, string selectCommand, CommandParameterCollection parameters) { ClickHouseConnection clickHouseConnection = GetConnection() as ClickHouseConnection; try { OpenConnection(clickHouseConnection); selectCommand = PrepareSelectCommand(selectCommand, table.TableName, clickHouseConnection); /*To reduce size of traffic and size of answer from ClickHouse server. * Because FillSchema doesn't work in this ADO.NET library. * LIMIT 0 gets an empy set, but we still have list of desired columns * Prorably can be a better way. */ selectCommand += " LIMIT 0"; ClickHouseCommand clickHouseCommand = clickHouseConnection.CreateCommand(); foreach (CommandParameter p in parameters) { selectCommand = selectCommand.Replace($"@{p.Name}", $"{{{p.Name}:{(ClickHouseTypeCode)p.DataType}}}"); clickHouseCommand.AddParameter(p.Name, ((ClickHouseTypeCode)p.DataType).ToString(), p.Value); } clickHouseCommand.CommandText = selectCommand; using (ClickHouseDataReader reader = clickHouseCommand.ExecuteReader() as ClickHouseDataReader) { var clms = GetColumns(reader); table.Columns.AddRange(clms.ToArray()); } } finally { DisposeConnection(clickHouseConnection); } }
private IEnumerable <DataColumn> GetColumns(ClickHouseDataReader reader) { for (int i = 0; i < reader.FieldCount; i++) { var columnType = reader.GetFieldType(i); yield return(new DataColumn(reader.GetName(i), columnType)); } }
internal static ClickHouseType[] GetClickHouseColumnTypes(this ClickHouseDataReader reader) { var count = reader.FieldCount; var names = new ClickHouseType[count]; for (int i = 0; i < count; i++) { names[i] = reader.GetClickHouseType(i); } return(names); }
public static DataTable DescribeSchema(this ClickHouseDataReader reader) { var result = new DataTable(); foreach (var columnName in Columns) { result.Columns.Add(columnName); } for (int i = 0; i < reader.FieldCount; i++) { result.Rows.Add(reader.DescribeColumn(i)); } return(result); }
private static List <T> Scan <T>(IDbCommand cmd, Func <ClickHouseDataReader, T> read) { List <T> result = new List <T>(); using ClickHouseDataReader reader = (ClickHouseDataReader)cmd.ExecuteReader(); do { while (reader.Read()) { result.Add(read.Invoke(reader)); } } while (reader.NextResult()); return(result); }
private static object[] DescribeColumn(this ClickHouseDataReader reader, int ordinal) { var chType = reader.GetClickHouseType(ordinal); var result = new object[Columns.Length]; result[0] = reader.GetName(ordinal); // ColumnName result[1] = ordinal; // ColumnOrdinal result[2] = null; // ColumnSize result[3] = null; // NumericPrecision result[4] = null; // NumericScale result[5] = chType.FrameworkType; // DataType result[6] = chType.ToString(); // ProviderType result[7] = chType.TypeCode == ClickHouseTypeCode.String; // IsLong result[8] = chType.TypeCode == ClickHouseTypeCode.Nullable; // AllowDBNull result[9] = true; // IsReadOnly result[10] = false; // IsRowVersion result[11] = false; // IsUnique result[12] = false; // IsKey result[13] = false; // IsAutoIncrement result[14] = null; // BaseCatalogName result[15] = null; // BaseSchemaName result[16] = null; // BaseTableName result[17] = reader.GetName(ordinal); // BaseColumnName result[18] = null; // AutoIncrementSeed result[19] = null; // AutoIncrementStep result[20] = null; // DefaultValue result[21] = null; // Expression result[22] = MappingType.Element; // ColumnMapping result[23] = null; // BaseTableNamespace result[24] = null; // BaseColumnNamespace if (chType is DecimalType dt) { result[2] = dt.Size; result[3] = dt.Precision; result[4] = dt.Scale; } return(result); }