True DBGrid for WinForms | ComponentOne
In This Topic
    DataSource
    In This Topic
        public static class DataSource
        {
    
            private static readonly string _databaseFileName = @"\C1NWind.db";
            private static readonly List<KeyValuePair<int, string>> paths = new()
                {
                    new KeyValuePair<int, string>(1, Environment.CurrentDirectory),
                    new KeyValuePair<int, string>(2, Environment.GetFolderPath(Environment.SpecialFolder.Personal) + @"\ComponentOne Samples\Common")
                };
            public static string GetPathDb()
            {
                var existsDb = paths.Select(x => new
                {
                    Priority = x.Key,
                    Path = x.Value + _databaseFileName,
                    Exists = File.Exists(x.Value + _databaseFileName)
                }).Where(x => x.Exists)
                  .OrderBy(x => x.Priority)
                  .FirstOrDefault()?.Path ?? "";
    
                return existsDb;
            }
            private static bool CheckDatabase()
            {
                var existsPathDb = GetPathDb();
                if (string.IsNullOrEmpty(existsPathDb))
                {
                    var message = $"File {_databaseFileName} not found! {Environment.NewLine}" +
                        $"{string.Join(Environment.NewLine, paths.Select(x => x.Value).ToArray())}";
                    MessageBox.Show(message, "Error");
    
                    return false;
                }
    
                return true;
            }
            private static IEnumerable<DataColumn> CreateColumns(SqliteDataReader reader, IEnumerable<string> imageColumns = null)
            {
                var columns = new List<DataColumn>();
                var dateColumnNames = new List<string>()
                { "datetime", "date"};
    
                if(reader.HasRows )
                {
                    // Create base columns 
                    var schemaTable = reader.GetSchemaTable();
                    columns = (from s in schemaTable.Rows.Cast<DataRow>() select s)
                        .Select(x => new
                        {
                            // Name field
                            ColumnName = x["ColumnName"].ToString(),
                            // Database type
                            DataTypeName = x["DataTypeName"].ToString().ToLower(),
                            // System type
                            SystemType = Type.GetType(x["DataType"].ToString())
                        })
                        .Select(x => new DataColumn()
                        {
                            ColumnName = x.ColumnName,
                            DataType =  
                                        // Check type as date
                                        dateColumnNames.Any(y => y == x.DataTypeName) ? typeof(DateTime) :
                                        imageColumns != null ? 
                                            // Check type as image
                                            imageColumns.Any(y => y == x.ColumnName) ? typeof(Image) : x.SystemType
                                        : x.SystemType
                        }).ToList();
                }
    
                return columns;
            }
            private static Image Base64ToImage(string base64String)
            {
                // Convert base 64 string to byte[]
                byte[] imageBytes = Convert.FromBase64String(base64String);
                // Convert byte[] to Image
                using var ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
                Image image = Image.FromStream(ms, true);
                return image;
            }
           
    
            public static DataTable GetRows(string queryString, 
                string tableName = "Result", IEnumerable<string> imageColumns = null)
            {
                var table = new DataTable(tableName);
                var existsPathDb = GetPathDb();
                if (!CheckDatabase())
                    return null;
    
                var connectionString = string.Format("Data Source={0}", existsPathDb);
                using (SqliteConnection connection = new(connectionString))
                {
                    using SqliteCommand command = new(queryString, connection);
                    // Open SQLite database
                    connection.Open();
                    var reader = command.ExecuteReader();
                    var columns = CreateColumns(reader, imageColumns);
                    table.Columns.AddRange(columns.ToArray());
    
                    if (columns.Any())
                    {
                        while (reader.Read())
                        {
                            // Fill table
                            var row = table.NewRow();
                            var arrayColumns = columns.ToArray();
                            Enumerable.Range(0, reader.FieldCount)
                                .ToList()
                                .ForEach(x =>
                                {
                                    var currentColumns = arrayColumns[x];
                                    bool IsImageColumn = imageColumns != null && (imageColumns.Any(y => y == currentColumns.ColumnName));
    
                                    if (IsImageColumn)
                                        row[x] = Base64ToImage(reader[x].ToString());
                                    else
                                        row[x] = reader[x];
                                });
    
                            table.Rows.Add(row);
                        }
    
                        return table;
                    }
                }
    
                return null;
            }
         }