添加项目文件。
This commit is contained in:
21
Mssql2Sqlite/Mssql2Sqlite.csproj
Normal file
21
Mssql2Sqlite/Mssql2Sqlite.csproj
Normal file
@@ -0,0 +1,21 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'">
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Dapper" Version="2.1.35" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.2" />
|
||||
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.1" />
|
||||
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.1.10" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
114
Mssql2Sqlite/Program.cs
Normal file
114
Mssql2Sqlite/Program.cs
Normal file
@@ -0,0 +1,114 @@
|
||||
using Dapper;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using Microsoft.Data.Sqlite;
|
||||
|
||||
namespace Mssql2Sqlite
|
||||
{
|
||||
internal class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
if (args.Length != 4 && args.Length != 6)
|
||||
{
|
||||
Console.WriteLine("Usage for SQL Server integrated security:");
|
||||
Console.WriteLine("Mssql2Sqlite.exe <sqliteFile> <userGuid> <sqlServer> <sqlDatabase>");
|
||||
|
||||
Console.WriteLine("");
|
||||
Console.WriteLine("Usage for SQL Server user security:");
|
||||
Console.WriteLine("Mssql2Sqlite.exe <sqliteFile> <userGuid> <sqlServer> <sqlDatabase> <SQLServerUser> <SQLServerPassword>");
|
||||
|
||||
Console.WriteLine("sqliteFile: The SQLite file to import the data into, must already exist with proper schema. Existing data will be deleted.");
|
||||
Console.WriteLine("userGuid: The UserId from the SQLite users.db that you want to associate with the import. Use: 963f0b81-f2ac-488b-9b21-521852641ec4 for admin@tightwiki.com");
|
||||
|
||||
Console.WriteLine("sqlServer: The SQL Server name to export the data from.");
|
||||
Console.WriteLine("SQLServerUser: Optional, is the username to use for connecting to SQL Server.");
|
||||
Console.WriteLine("SQLServerPassword: Optional, is the password to use for connecting to SQL Server.");
|
||||
return;
|
||||
}
|
||||
|
||||
string sqliteFile = args[0];
|
||||
string userId = args[1];
|
||||
|
||||
var builder = new SqlConnectionStringBuilder
|
||||
{
|
||||
DataSource = args[2],
|
||||
InitialCatalog = args[3],
|
||||
Encrypt = SqlConnectionEncryptOption.Optional,
|
||||
TrustServerCertificate = true
|
||||
};
|
||||
|
||||
if (args.Length == 4)
|
||||
{
|
||||
builder.IntegratedSecurity = true;
|
||||
}
|
||||
else if (args.Length == 6)
|
||||
{
|
||||
builder.IntegratedSecurity = false;
|
||||
builder.UserID = args[3];
|
||||
builder.Password = args[4];
|
||||
}
|
||||
|
||||
MigrateTable("Page", sqliteFile, builder.ToString(), userId);
|
||||
MigrateTable("PageFile", sqliteFile, builder.ToString(), userId);
|
||||
MigrateTable("PageRevision", sqliteFile, builder.ToString(), userId);
|
||||
MigrateTable("PageFileRevision", sqliteFile, builder.ToString(), userId);
|
||||
MigrateTable("PageRevisionAttachment", sqliteFile, builder.ToString(), userId);
|
||||
}
|
||||
|
||||
static void MigrateTable(string tableName, string sqliteFile, string sqlServerConnectionString, string userId)
|
||||
{
|
||||
using var sqlServerConnection = new SqlConnection(sqlServerConnectionString);
|
||||
var data = sqlServerConnection.Query<dynamic>($"SELECT * FROM [{tableName}]").ToList();
|
||||
var insertColumns = sqlServerConnection.Query<string>($"SELECT name from sys.columns where object_id = object_id('{tableName}')").ToList();
|
||||
|
||||
using (var sqliteConnection = new SqliteConnection($"Data Source={sqliteFile}"))
|
||||
{
|
||||
sqliteConnection.Open();
|
||||
|
||||
// Enable writing of identity columns in SQLite
|
||||
sqliteConnection.Execute("PRAGMA foreign_keys=OFF;");
|
||||
sqliteConnection.Execute("BEGIN TRANSACTION;");
|
||||
sqliteConnection.Execute("PRAGMA defer_foreign_keys=ON;");
|
||||
|
||||
var selectColumns = new List<string>();
|
||||
|
||||
foreach (var column in insertColumns)
|
||||
{
|
||||
switch (column)
|
||||
{
|
||||
case "Namespace":
|
||||
selectColumns.Add("Coalesce(@Namespace, '')");
|
||||
break;
|
||||
case "CreatedByUserId":
|
||||
case "ModifiedByUserId":
|
||||
selectColumns.Add($"'{userId}'");
|
||||
break;
|
||||
default:
|
||||
selectColumns.Add($"@{column}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (tableName == "PageFileRevision")
|
||||
{
|
||||
insertColumns.Add("CreatedByUserId");
|
||||
selectColumns.Add("(SELECT P.ModifiedByUserId FROM PageFile as PF INNER JOIN Page as P ON P.Id = PF.PageId WHERE PF.Id = @PageFileId)");
|
||||
}
|
||||
|
||||
sqliteConnection.Execute($"DELETE FROM {tableName}");
|
||||
|
||||
foreach (var item in data)
|
||||
{
|
||||
var insertQuery = $"INSERT INTO {tableName} ({string.Join(",", insertColumns)}) SELECT {string.Join(",", selectColumns)}";
|
||||
sqliteConnection.Execute(insertQuery, (object?)item);
|
||||
}
|
||||
|
||||
sqliteConnection.Execute("COMMIT;");
|
||||
sqliteConnection.Execute("PRAGMA defer_foreign_keys=OFF;");
|
||||
sqliteConnection.Execute("PRAGMA foreign_keys=ON;");
|
||||
}
|
||||
|
||||
Console.WriteLine("Data import complete.");
|
||||
}
|
||||
}
|
||||
}
|
||||
8
Mssql2Sqlite/Properties/launchSettings.json
Normal file
8
Mssql2Sqlite/Properties/launchSettings.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"profiles": {
|
||||
"Mssql2Sqlite": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "C:\\DropZone\\pages.db 963f0b81-f2ac-488b-9b21-521852641ec4 localhost TightWiki_Katzebase"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user