添加项目文件。

This commit is contained in:
Zel
2025-01-22 23:31:03 +08:00
parent 1b8ba6771f
commit 2ae76476fb
894 changed files with 774558 additions and 0 deletions

View 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
View 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.");
}
}
}

View File

@@ -0,0 +1,8 @@
{
"profiles": {
"Mssql2Sqlite": {
"commandName": "Project",
"commandLineArgs": "C:\\DropZone\\pages.db 963f0b81-f2ac-488b-9b21-521852641ec4 localhost TightWiki_Katzebase"
}
}
}