文章目录
- [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; } // 是否自增
}