diff --git a/FreeSql.sln b/FreeSql.sln
index 6a97cec2..7cd4792c 100644
--- a/FreeSql.sln
+++ b/FreeSql.sln
@@ -107,6 +107,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.GBase", "P
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.GBase", "FreeSql.Tests\FreeSql.Tests.Provider.GBase\FreeSql.Tests.Provider.GBase.csproj", "{B887C0DA-01BE-4537-ADC1-92545AC85684}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Sqlite.Data", "Providers\FreeSql.Provider.Sqlite.Data\FreeSql.Provider.Sqlite.Data.csproj", "{5B4D16A3-7380-47E6-9247-560EB4DD36B0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Sqlite.Data.Core", "Providers\FreeSql.Provider.Sqlite.Data.Core\FreeSql.Provider.Sqlite.Data.Core.csproj", "{21D41ACD-46B6-4716-B390-065725DD72DD}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -621,6 +625,30 @@ Global
{B887C0DA-01BE-4537-ADC1-92545AC85684}.Release|x64.Build.0 = Release|Any CPU
{B887C0DA-01BE-4537-ADC1-92545AC85684}.Release|x86.ActiveCfg = Release|Any CPU
{B887C0DA-01BE-4537-ADC1-92545AC85684}.Release|x86.Build.0 = Release|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Debug|x64.Build.0 = Debug|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Debug|x86.Build.0 = Debug|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Release|x64.ActiveCfg = Release|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Release|x64.Build.0 = Release|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Release|x86.ActiveCfg = Release|Any CPU
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0}.Release|x86.Build.0 = Release|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Debug|x64.Build.0 = Debug|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Debug|x86.Build.0 = Debug|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Release|x64.ActiveCfg = Release|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Release|x64.Build.0 = Release|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Release|x86.ActiveCfg = Release|Any CPU
+ {21D41ACD-46B6-4716-B390-065725DD72DD}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -656,6 +684,8 @@ Global
{0DBAA21C-39B2-4AAD-A43D-88E67ED239D1} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
{86C56235-5D37-4422-807B-B31681C7D01C} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
{BDE8EDC6-2646-45E0-A921-39CD1538A8C5} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
+ {5B4D16A3-7380-47E6-9247-560EB4DD36B0} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
+ {21D41ACD-46B6-4716-B390-065725DD72DD} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98}
diff --git a/FreeSql/FreeSqlBuilder.cs b/FreeSql/FreeSqlBuilder.cs
index 79b27190..f0b40d7c 100644
--- a/FreeSql/FreeSqlBuilder.cs
+++ b/FreeSql/FreeSqlBuilder.cs
@@ -201,6 +201,7 @@ namespace FreeSql
break;
case DataType.Sqlite:
type = Type.GetType("FreeSql.Sqlite.SqliteProvider`1,FreeSql.Provider.Sqlite")?.MakeGenericType(typeof(TMark));
+ if (type == null) type = Type.GetType("FreeSql.Sqlite.SqliteProvider`1,FreeSql.Provider.Sqlite.Data.Core")?.MakeGenericType(typeof(TMark)); //FreeSql.Provider.Sqlite.Data.dll
if (type == null) throwNotFind("FreeSql.Provider.Sqlite.dll", "FreeSql.Sqlite.SqliteProvider<>");
break;
diff --git a/Providers/FreeSql.Provider.Sqlite.Data.Core/FreeSql.Provider.Sqlite.Data.Core.csproj b/Providers/FreeSql.Provider.Sqlite.Data.Core/FreeSql.Provider.Sqlite.Data.Core.csproj
new file mode 100644
index 00000000..38d7751b
--- /dev/null
+++ b/Providers/FreeSql.Provider.Sqlite.Data.Core/FreeSql.Provider.Sqlite.Data.Core.csproj
@@ -0,0 +1,42 @@
+
+
+
+ netstandard2.0;net6.0
+ 2.6.100
+ true
+ FreeSql;ncc;YeXiangQin
+ FreeSql 数据库实现,基于 Microsoft.Data.Sqlite.Core、Sqlite 3.0,支持 .netstandard2.0、.net6.0
+ https://github.com/2881099/FreeSql
+ https://github.com/2881099/FreeSql
+ git
+ MIT
+ FreeSql;ORM;sqlite
+ $(AssemblyName)
+ logo.png
+ $(AssemblyName)
+ true
+ true
+ true
+ key.snk
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MicrosoftData
+
+
\ No newline at end of file
diff --git a/Providers/FreeSql.Provider.Sqlite.Data.Core/key.snk b/Providers/FreeSql.Provider.Sqlite.Data.Core/key.snk
new file mode 100644
index 00000000..53501ad1
Binary files /dev/null and b/Providers/FreeSql.Provider.Sqlite.Data.Core/key.snk differ
diff --git a/Providers/FreeSql.Provider.Sqlite.Data/FreeSql.Provider.Sqlite.Data.csproj b/Providers/FreeSql.Provider.Sqlite.Data/FreeSql.Provider.Sqlite.Data.csproj
new file mode 100644
index 00000000..88169359
--- /dev/null
+++ b/Providers/FreeSql.Provider.Sqlite.Data/FreeSql.Provider.Sqlite.Data.csproj
@@ -0,0 +1,39 @@
+
+
+
+ netstandard2.0;
+ 2.6.100
+ true
+ FreeSql;ncc;YeXiangQin
+ FreeSql 数据库实现,基于Microsoft.Data.Sqlite、 Sqlite 3.0,支持 .netstandard2.0
+ https://github.com/2881099/FreeSql
+ https://github.com/2881099/FreeSql
+ git
+ MIT
+ FreeSql;ORM;sqlite
+ $(AssemblyName)
+ logo.png
+ $(AssemblyName)
+ true
+ true
+ true
+ key.snk
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MicrosoftData
+
+
\ No newline at end of file
diff --git a/Providers/FreeSql.Provider.Sqlite.Data/key.snk b/Providers/FreeSql.Provider.Sqlite.Data/key.snk
new file mode 100644
index 00000000..ab35320e
Binary files /dev/null and b/Providers/FreeSql.Provider.Sqlite.Data/key.snk differ
diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs
index a573432f..f3294901 100644
--- a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs
+++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs
@@ -5,7 +5,11 @@ using System;
using System.Collections;
using System.Data;
using System.Data.Common;
+#if MicrosoftData
+using Microsoft.Data.Sqlite;
+#else
using System.Data.SQLite;
+#endif
using System.Text;
using System.Threading;
@@ -72,7 +76,12 @@ namespace FreeSql.Sqlite
cmd.Connection = null;
return cmd;
}
- return new SQLiteCommand();
+#if MicrosoftData
+ return new SqliteCommand();
+#else
+ return new SQLiteCommand();
+#endif
+
}
public override void ReturnConnection(IObjectPool pool, Object conn, Exception ex)
diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs
index 2ed75b19..9185c56e 100644
--- a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs
+++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs
@@ -4,7 +4,11 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
+#if MicrosoftData
+using Microsoft.Data.Sqlite;
+#else
using System.Data.SQLite;
+#endif
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
@@ -34,7 +38,11 @@ namespace FreeSql.Sqlite
public void Return(Object obj, Exception exception, bool isRecreate = false)
{
+#if MicrosoftData
+ if (exception != null && exception is SqliteException)
+#else
if (exception != null && exception is SQLiteException)
+#endif
{
try { if (obj.Value.Ping() == false) obj.Value.OpenAndAttach(policy.Attaches); } catch { base.SetUnavailable(exception); }
}
@@ -128,7 +136,11 @@ namespace FreeSql.Sqlite
public DbConnection OnCreate()
{
+#if MicrosoftData
+ var conn = new SqliteConnection(_connectionString);
+#else
var conn = new SQLiteConnection(_connectionString);
+#endif
return conn;
}
diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs
index adbe381a..9e6b572a 100644
--- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs
+++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs
@@ -366,8 +366,21 @@ namespace FreeSql.Sqlite
{
case "Abs": return $"abs({getExp(exp.Arguments[0])})";
case "Sign": return $"sign({getExp(exp.Arguments[0])})";
+#if MicrosoftData
+ case "Floor":
+ {
+ var funExp = getExp(exp.Arguments[0]);
+ return $"cast({funExp} as int) - ({funExp} < cast({funExp} as int))";
+ };
+ case "Ceiling":
+ {
+ var funExp = getExp(exp.Arguments[0]);
+ return $"cast ({funExp} as int ) + ({funExp} > cast ({funExp} as int ))";
+ };
+#else
case "Floor": return $"floor({getExp(exp.Arguments[0])})";
case "Ceiling": return $"ceiling({getExp(exp.Arguments[0])})";
+#endif
case "Round":
if (exp.Arguments.Count > 1 && exp.Arguments[1].Type.FullName == "System.Int32") return $"round({getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})";
return $"round({getExp(exp.Arguments[0])})";
diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs
index cf01e04e..522f841c 100644
--- a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs
+++ b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs
@@ -4,7 +4,11 @@ using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
+#if MicrosoftData
+using Microsoft.Data.Sqlite;
+#else
using System.Data.SQLite;
+#endif
using System.Globalization;
namespace FreeSql.Sqlite
@@ -33,7 +37,11 @@ namespace FreeSql.Sqlite
dbtype = DbType.Int64;
break;
}
+#if MicrosoftData
+ var ret = new SqliteParameter();
+#else
var ret = new SQLiteParameter();
+#endif
ret.ParameterName = QuoteParamterName(parameterName);
ret.DbType = dbtype;
ret.Value = value;
@@ -62,7 +70,11 @@ namespace FreeSql.Sqlite
break;
}
}
+#if MicrosoftData
+ var ret = new SqliteParameter();
+#else
var ret = new SQLiteParameter();
+#endif
ret.ParameterName = $"@{name}";
if (dbtype != null) ret.DbType = dbtype.Value;
ret.Value = value;