Skip to content

Commit 8a0862d

Browse files
2881028810
authored andcommitted
- 增加 IAdo.CommandFluent(sql) 方法执行 SQL 命令;
- 修复 SqlServer SqlBulkCopy IgnoreColumns 无效的 bug;
1 parent 9b93200 commit 8a0862d

File tree

25 files changed

+225
-44
lines changed

25 files changed

+225
-44
lines changed

Extensions/FreeSql.Generator/FreeSql.Generator.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<Description>使用 FreeSql 快速生成数据库的实体类,安装:dotnet tool install -g FreeSql.Generator</Description>
1313
<PackageProjectUrl>https://github.com/2881099/FreeSql</PackageProjectUrl>
1414
<RepositoryUrl>https://github.com/2881099/FreeSql</RepositoryUrl>
15-
<Version>1.8.1.330</Version>
15+
<Version>1.9.0-preview0920</Version>
1616
<PackageTags>FreeSql DbFirst 实体生成器</PackageTags>
1717
</PropertyGroup>
1818

FreeSql.DbContext/FreeSql.DbContext.xml

Lines changed: 0 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerInsertTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ public void ExecuteSqlBulkCopy()
171171
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
172172

173173
insert.AppendData(items).InsertIdentity().ExecuteSqlBulkCopy();
174+
insert.AppendData(items).IgnoreColumns(a => new { a.CreateTime, a.Clicks }).ExecuteSqlBulkCopy();
174175
// System.NotSupportedException:“DataSet does not support System.Nullable<>.”
175176
}
176177

FreeSql/FreeSql.xml

Lines changed: 52 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql/Interface/IAdo.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,21 @@ public partial interface IAdo
6262
/// <returns></returns>
6363
DbParameter[] GetDbParamtersByObject(object obj);
6464

65+
/// <summary>
66+
/// SQL 命令执行类,fsql.Ado.CommandFluent("select * from user where age > ?age", new { age = 25 })<para></para>
67+
/// .WithConnection(connection)<para></para>
68+
/// .WithTransaction(transaction)<para></para>
69+
/// .WithParameter("age", 25)<para></para>
70+
/// .WithParameter("id", 11)<para></para>
71+
/// .CommandType(CommandType.Text)<para></para>
72+
/// .CommandTimeout(60)<para></para>
73+
/// .Query&lt;T&gt;(); 或者 ExecuteNonQuery/ExecuteScalar/ExecuteDataTable/ExecuteDataSet/ExecuteArray
74+
/// </summary>
75+
/// <param name="cmdText"></param>
76+
/// <param name="parms"></param>
77+
/// <returns></returns>
78+
AdoCommandFluent CommandFluent(string cmdText, object parms = null);
79+
6580
/// <summary>
6681
/// 测试数据库是否连接正确,本方法执行如下命令:<para></para>
6782
/// MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1<para></para>

FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ public abstract partial class AdoProvider : IAdo, IDisposable
1616
{
1717

1818
protected abstract void ReturnConnection(IObjectPool<DbConnection> pool, Object<DbConnection> conn, Exception ex);
19-
protected abstract DbCommand CreateCommand();
20-
protected abstract DbParameter[] GetDbParamtersByObject(string sql, object obj);
19+
public abstract DbCommand CreateCommand();
20+
public abstract DbParameter[] GetDbParamtersByObject(string sql, object obj);
2121
public DbParameter[] GetDbParamtersByObject(object obj) => GetDbParamtersByObject("*", obj);
2222

2323
protected bool IsTracePerformance => _util?._orm?.Aop.CommandAfterHandler != null;
@@ -28,6 +28,7 @@ public abstract partial class AdoProvider : IAdo, IDisposable
2828
public string ConnectionString { get; }
2929
public string[] SlaveConnectionStrings { get; }
3030
public Guid Identifier { get; }
31+
3132
protected CommonUtils _util { get; set; }
3233
protected int slaveUnavailables = 0;
3334
private object slaveLock = new object();
@@ -97,6 +98,8 @@ internal Dictionary<string, PropertyInfo> GetQueryTypeProperties(Type type)
9798
//return props;
9899
}
99100

101+
public AdoCommandFluent CommandFluent(string cmdText, object parms = null) => new AdoCommandFluent(this, cmdText, parms);
102+
100103
public bool ExecuteConnectTest(int commandTimeout = 0)
101104
{
102105
try
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
using FreeSql.Internal.CommonProvider;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Data;
5+
using System.Data.Common;
6+
using System.Linq;
7+
using System.Text;
8+
using System.Threading.Tasks;
9+
10+
namespace FreeSql.Internal.Model
11+
{
12+
public class AdoCommandFluent
13+
{
14+
internal protected AdoProvider Ado { get; protected set; }
15+
internal protected DbConnection Connection { get; protected set; }
16+
internal protected DbTransaction Transaction { get; protected set; }
17+
internal protected CommandType CmdType { get; protected set; } = System.Data.CommandType.Text;
18+
internal protected string CmdText { get; protected set; }
19+
internal protected int CmdTimeout { get; protected set; }
20+
internal protected List<DbParameter> CmdParameters { get; } = new List<DbParameter>();
21+
22+
public AdoCommandFluent(AdoProvider ado, string commandText, object parms)
23+
{
24+
this.Ado = ado;
25+
this.CmdText = commandText;
26+
this.CmdParameters.AddRange(this.Ado.GetDbParamtersByObject(parms));
27+
}
28+
29+
/// <summary>
30+
/// 使用指定 DbConnection 连接执行
31+
/// </summary>
32+
/// <param name="conn"></param>
33+
/// <returns></returns>
34+
public AdoCommandFluent WithConnection(DbConnection conn)
35+
{
36+
this.Transaction = null;
37+
this.Connection = conn;
38+
return this;
39+
}
40+
/// <summary>
41+
/// 使用指定 DbTransaction 事务执行
42+
/// </summary>
43+
/// <param name="tran"></param>
44+
/// <returns></returns>
45+
public AdoCommandFluent WithTransaction(DbTransaction tran)
46+
{
47+
this.Transaction = tran;
48+
if (tran != null) this.Connection = tran.Connection;
49+
return this;
50+
}
51+
52+
/// <summary>
53+
/// 增加参数化对象
54+
/// </summary>
55+
/// <param name="parameterName">参数名</param>
56+
/// <param name="value">参数值</param>
57+
/// <param name="modify">修改本次创建好的参数化对象,比如将 parameterName 参数修改为 Output 类型</param>
58+
/// <returns></returns>
59+
public AdoCommandFluent WithParameter(string parameterName, object value, Action<DbParameter> modify = null)
60+
{
61+
var param = this.Ado.GetDbParamtersByObject(new Dictionary<string, object> { [parameterName] = value }).FirstOrDefault();
62+
modify?.Invoke(param);
63+
this.CmdParameters.Add(param);
64+
return this;
65+
}
66+
67+
/// <summary>
68+
/// 设置执行的命令类型,SQL文本、或存储过程
69+
/// </summary>
70+
/// <param name="commandType"></param>
71+
/// <returns></returns>
72+
public AdoCommandFluent CommandType(CommandType commandType)
73+
{
74+
this.CmdType = commandType;
75+
return this;
76+
}
77+
/// <summary>
78+
/// 设置命令执行超时(秒)
79+
/// </summary>
80+
/// <param name="commandTimeout"></param>
81+
/// <returns></returns>
82+
public AdoCommandFluent CommandTimeout(int commandTimeout)
83+
{
84+
this.CmdTimeout = commandTimeout;
85+
return this;
86+
}
87+
88+
public int ExecuteNonQuery() => this.Ado.ExecuteNonQuery(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
89+
public object ExecuteScalar() => this.Ado.ExecuteScalar(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
90+
public DataTable ExecuteDataTable() => this.Ado.ExecuteDataTable(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
91+
public DataSet ExecuteDataSet() => this.Ado.ExecuteDataSet(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
92+
public object[][] ExecuteArray() => this.Ado.ExecuteArray(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
93+
public List<T> Query<T>() => this.Ado.Query<T>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
94+
public NativeTuple<List<T1>, List<T2>> Query<T1, T2>() => this.Ado.Query<T1, T2>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
95+
public NativeTuple<List<T1>, List<T2>, List<T3>> Query<T1, T2, T3>() => this.Ado.Query<T1, T2, T3>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
96+
public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>> Query<T1, T2, T3, T4>() => this.Ado.Query<T1, T2, T3, T4>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
97+
public NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>> Query<T1, T2, T3, T4, T5>() => this.Ado.Query<T1, T2, T3, T4, T5>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
98+
99+
#if net40
100+
#else
101+
public Task<int> ExecuteNonQueryAsync() => this.Ado.ExecuteNonQueryAsync(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
102+
public Task<object> ExecuteScalarAsync() => this.Ado.ExecuteScalarAsync(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
103+
public Task<DataTable> ExecuteDataTableAsync() => this.Ado.ExecuteDataTableAsync(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
104+
public Task<DataSet> ExecuteDataSetAsync() => this.Ado.ExecuteDataSetAsync(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
105+
public Task<object[][]> ExecuteArrayAsync() => this.Ado.ExecuteArrayAsync(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
106+
public Task<List<T>> QueryAsync<T>() => this.Ado.QueryAsync<T>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
107+
public Task<NativeTuple<List<T1>, List<T2>>> QueryAsync<T1, T2>() => this.Ado.QueryAsync<T1, T2>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
108+
public Task<NativeTuple<List<T1>, List<T2>, List<T3>>> QueryAsync<T1, T2, T3>() => this.Ado.QueryAsync<T1, T2, T3>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
109+
public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>>> QueryAsync<T1, T2, T3, T4>() => this.Ado.QueryAsync<T1, T2, T3, T4>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
110+
public Task<NativeTuple<List<T1>, List<T2>, List<T3>, List<T4>, List<T5>>> QueryAsync<T1, T2, T3, T4, T5>() => this.Ado.QueryAsync<T1, T2, T3, T4, T5>(this.Connection, this.Transaction, this.CmdType, this.CmdText, this.CmdTimeout, this.CmdParameters.ToArray());
111+
#endif
112+
}
113+
}

Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
6060
//if (param is string) return string.Concat('N', nparms[a]);
6161
}
6262

63-
protected override DbCommand CreateCommand()
63+
public override DbCommand CreateCommand()
6464
{
6565
return new DmCommand();
6666
}
@@ -72,6 +72,6 @@ protected override void ReturnConnection(IObjectPool<DbConnection> pool, Object<
7272
else pool.Return(conn);
7373
}
7474

75-
protected override DbParameter[] GetDbParamtersByObject(string sql, object obj) => _util.GetDbParamtersByObject(sql, obj);
75+
public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => _util.GetDbParamtersByObject(sql, obj);
7676
}
7777
}

Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
6262
}
6363

6464
DbConnection _CreateCommandConnection;
65-
protected override DbCommand CreateCommand()
65+
public override DbCommand CreateCommand()
6666
{
6767
if (_CreateCommandConnection != null)
6868
{
@@ -80,6 +80,6 @@ protected override void ReturnConnection(IObjectPool<DbConnection> pool, Object<
8080
else pool.Return(conn);
8181
}
8282

83-
protected override DbParameter[] GetDbParamtersByObject(string sql, object obj) => _util.GetDbParamtersByObject(sql, obj);
83+
public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => _util.GetDbParamtersByObject(sql, obj);
8484
}
8585
}

Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
6161
return string.Concat("'", param.ToString().Replace("'", "''"), "'");
6262
}
6363

64-
protected override DbCommand CreateCommand()
64+
public override DbCommand CreateCommand()
6565
{
6666
return new KdbndpCommand();
6767
}
@@ -73,6 +73,6 @@ protected override void ReturnConnection(IObjectPool<DbConnection> pool, Object<
7373
else pool.Return(conn);
7474
}
7575

76-
protected override DbParameter[] GetDbParamtersByObject(string sql, object obj) => _util.GetDbParamtersByObject(sql, obj);
76+
public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => _util.GetDbParamtersByObject(sql, obj);
7777
}
7878
}

0 commit comments

Comments
 (0)