SQLite表结构转换为MySql表(C#SqlSuga)

文章目录

  • [1 操作示例](#1 操作示例)
    • [1.1 操作数据库扩展类](#1.1 操作数据库扩展类)
    • [1.2 自定义字段结构](#1.2 自定义字段结构)

1 操作示例

csharp 复制代码
string datasource = "E:\\SQLite\\datasource.db";
var sqliteDb = datasource.GetSqlSugarClient_SQLite();

string database = "test";
string uid = "root";
string pwd = "123456";
var mysqlDb = database.GetSqlSugarClient_MySql(uid, pwd);
sqliteDb.Table_SQLite_To_MySql(mysqlDb);

1.1 操作数据库扩展类

csharp 复制代码
    /// <summary>
    /// 操作数据库扩展类
    /// </summary>
    public static class ExtensionTableStruct
    {
        /// <summary>
        /// 获取SQLite操作数据库对象
        /// </summary>
        public static SqlSugarClient GetSqlSugarClient_SQLite(this string datasource)
        {
            string connStr = $"Data Source={datasource};";
            var db = new SqlSugarClient(new ConnectionConfig()
            {
                DbType = DbType.Sqlite,
                ConnectionString = connStr, // SQLite 文件路径
                IsAutoCloseConnection = true
            });
            return db;
        }

        /// <summary>
        /// 获取MySql操作数据库对象
        /// </summary>
        public static SqlSugarClient GetSqlSugarClient_MySql(this string database, string uid, string pwd)
        {
            var connectionString = $"server=localhost;database={database};user id={uid};password={pwd};port=3306;CharSet=utf8mb4;SslMode=None;";
            var db = new SqlSugarClient(new ConnectionConfig()
            {
                DbType = DbType.MySql,
                ConnectionString = connectionString,
                IsAutoCloseConnection = true
            });
            return db;
        }

        /// <summary>
        /// SQLite表结构转换为MySql表结构
        /// </summary>
        /// <param name="sqliteDb"></param>
        /// <param name="mysqlDb"></param>
        public static void Table_SQLite_To_MySql(this SqlSugarClient sqliteDb, SqlSugarClient mysqlDb)
        {
            var tableNames = sqliteDb.GetSQLiteTableNames();
            foreach (var tableName in tableNames)
            {
                var columns = sqliteDb.GetSQLileTableStruct(tableName);
                mysqlDb.CreateMySqlTable(tableName, columns);
            }
        }

        /// <summary>
        /// 获取SQLite所有表名称
        /// </summary>
        private static List<string> GetSQLiteTableNames(this SqlSugarClient db)
        {
            string sql = "SELECT name FROM sqlite_master " +
                         "WHERE type='table' AND name NOT LIKE 'sqlite_%'";
            var tableDt = db.Ado.GetDataTable(sql);
            var list = new List<string>();
            foreach (DataRow row in tableDt.Rows)
            {
                list.Add(row[0].ToString());
            }
            return list;
        }

        /// <summary>
        /// 创建MySql表结构
        /// </summary>
        private static void CreateMySqlTable(this SqlSugarClient mysqlDb, string tableName, List<MyColumnInfo> columns)
        {
            List<string> fieldLines = new List<string>();
            List<string> keyLines = new List<string>();

            foreach (MyColumnInfo col in columns)
            {
                string mysqlType = "";
                if (col.Type == "integer")
                {
                    mysqlType = "INT";
                }
                else if (col.Type == "int")
                {
                    mysqlType = "INT";
                }
                else if (col.Type == "real")
                {
                    mysqlType = "DOUBLE";
                }
                else if (col.Type == "text")
                {
                    mysqlType = "LONGTEXT";
                }
                else if (col.Type == "blob")
                {
                    mysqlType = "LONGBLOB";
                }
                else if (col.Type == "datetime")
                {
                    mysqlType = "DATETIME";
                }
                else
                {
                    mysqlType = "VARCHAR(255)";
                }

                // 字段名 + 类型
                string line = "`" + col.Name + "` " + mysqlType;

                // 非空
                if (!col.IsNullable)
                {
                    line += " NOT NULL";
                }

                // 自增
                if (col.IsIdentity)
                {
                    line += " AUTO_INCREMENT";
                }

                fieldLines.Add(line);

                // 主键
                if (col.IsPrimaryKey)
                {
                    keyLines.Add("PRIMARY KEY (`" + col.Name + "`)");
                }
            }

            // 拼接所有语句
            List<string> allLines = new List<string>();
            allLines.AddRange(fieldLines);
            allLines.AddRange(keyLines);

            string sql = "CREATE TABLE IF NOT EXISTS `" + tableName + "` (\n  "
                         + string.Join(",\n  ", allLines)
                         + "\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";

            // 执行建表
            mysqlDb.Ado.ExecuteCommand(sql);
        }

        /// <summary>
        /// 获取SQLite表结构
        /// </summary>
        private static List<MyColumnInfo> GetSQLileTableStruct(this SqlSugarClient db, string tableName)
        {
            var list = new List<MyColumnInfo>();

            var dt = db.Ado.GetDataTable($"PRAGMA table_info([{tableName}])");

            foreach (DataRow row in dt.Rows)
            {
                var col = new MyColumnInfo
                {
                    Name = row["name"].ToString(),
                    Type = row["type"].ToString().ToLower(),
                    IsPrimaryKey = row["pk"].ToString() == "1",
                    IsNullable = row["notnull"].ToString() == "0",
                };

                // SQLite 只有 INTEGER 主键才是自增
                col.IsIdentity = col.IsPrimaryKey && col.Type == "integer";

                list.Add(col);
            }
            return list;
        }
    }

1.2 自定义字段结构

csharp 复制代码
/// <summary>
/// 自定义字段结构
/// </summary>
public class MyColumnInfo
{
    public string Name { get; set; }    // 字段名
    public string Type { get; set; }    // 字段类型
    public bool IsPrimaryKey { get; set; } // 是否主键
    public bool IsNullable { get; set; }   // 是否可空
    public bool IsIdentity { get; set; }   // 是否自增
}
相关推荐
hez201017 小时前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
唐青枫3 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
小满8783 天前
5.Mysql事务隔离级别与锁机制
mysql
元Y亨H4 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
这个DBA有点耶5 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵5 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
SamDeepThinking5 天前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员
雨落倾城夏未凉6 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
李白客7 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
唐青枫7 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net