diff --git a/OrmTest/OrmTest.csproj b/OrmTest/OrmTest.csproj index 015d645df..203588ab5 100644 --- a/OrmTest/OrmTest.csproj +++ b/OrmTest/OrmTest.csproj @@ -62,6 +62,7 @@ + diff --git a/OrmTest/Program.cs b/OrmTest/Program.cs index a42594b06..9243e183f 100644 --- a/OrmTest/Program.cs +++ b/OrmTest/Program.cs @@ -18,13 +18,13 @@ namespace OrmTest static void Main(string[] args) { //Unit Test - //new Field(1).Init(); - //new Where(1).Init(); - //new Method(1).Init(); - //new JoinQuery(1).Init(); - //new SingleQuery(1).Init(); - //new SelectQuery(1).Init(); - //new AutoClose(200).Init(); + new Field(1).Init(); + new Where(1).Init(); + new Method(1).Init(); + new JoinQuery(1).Init(); + new SingleQuery(1).Init(); + new SelectQuery(1).Init(); + new AutoClose(1).Init(); //Performance Test //new SqlSugarPerformance(100).Select(); diff --git a/OrmTest/UnitTest/Insert.cs b/OrmTest/UnitTest/Insert.cs new file mode 100644 index 000000000..03f1b7664 --- /dev/null +++ b/OrmTest/UnitTest/Insert.cs @@ -0,0 +1,52 @@ +using OrmTest.Models; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OrmTest.UnitTest +{ + public class Insert : ExpTestBase + { + private Insert() { } + public Insert(int eachCount) + { + this.Count = eachCount; + } + + public void Init() { + var db = GetInstance(); + var insertObj = new Student() { Name="jack",CreateTime=DateTime.Now }; + var insertObjs = new List() { insertObj }.ToArray(); + + //Insert reutrn identity + db.Insertable(insertObj).ExecuteReutrnIdentity(); + + //Insert reutrn Command Count + db.Insertable(insertObj).ExecuteCommand(); + + //Only insert Name + db.Insertable(insertObj).InsertColumns(it => new object[] { it.Name}).ExecuteReutrnIdentity(); + + //Ignore Name and TestId + db.Insertable(insertObj).IgnoreColumns(it => new object[] { it.Name,it.TestId }).ExecuteReutrnIdentity(); + + //Use Lock + db.Insertable(insertObj).With(SqlWith.UpdLock).ExecuteCommand(); + + //ToSql + db.Insertable(insertObj).With(SqlWith.UpdLock).InsertColumns(it => new object[] { it.Name }).ToSql(); + + //Insert List + db.Insertable(insertObjs).With(SqlWith.UpdLock).ExecuteCommand(); + } + + public SqlSugarClient GetInstance() + { + SqlSugarClient db = new SqlSugarClient(new SystemTablesConfig() { ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection=true }); + return db; + } + } +} diff --git a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/DeleteBuilder.cs b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/DeleteBuilder.cs index 15f18a2ea..9d15fe4f1 100644 --- a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/DeleteBuilder.cs +++ b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/DeleteBuilder.cs @@ -19,6 +19,19 @@ namespace SqlSugar } } + public List Parameters + { + get + { + throw new NotImplementedException(); + } + + set + { + throw new NotImplementedException(); + } + } + public StringBuilder sql { get diff --git a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/InsertBuilder.cs b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/InsertBuilder.cs index 96d0f8227..71f38c048 100644 --- a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/InsertBuilder.cs +++ b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/InsertBuilder.cs @@ -1,52 +1,57 @@ using System; +using System.Collections.Generic; using System.Text; - +using System.Linq; namespace SqlSugar { public class InsertBuilder : IDMLBuilder { - public SqlSugarClient Context - { - get - { - throw new NotImplementedException(); - } - - set - { - throw new NotImplementedException(); - } + public InsertBuilder() { + this.sql = new StringBuilder(); } + public SqlSugarClient Context { get; set; } + public ILambdaExpressions LambdaExpressions { get; set; } + public ISqlBuilder Builder { get; set; } + public StringBuilder sql { get; set; } + public List Parameters { get; set; } + public string EntityName { get; set; } + public string TableWithString { get; set; } + public List ColumNames{ get; set; } - public StringBuilder sql + public virtual string SqlTemplate { get { - throw new NotImplementedException(); - } - - set - { - throw new NotImplementedException(); - } - } - - public string SqlTemplate - { - get - { - throw new NotImplementedException(); + return @"INSERT INTO {0} + ({1}) + VALUES + ({2})"; } } public void Clear() { - throw new NotImplementedException(); + + } + public virtual string GetTableNameString + { + get + { + var result = Builder.GetTranslationTableName(EntityName); + result += PubConst.Space; + if (this.TableWithString.IsValuable()) + { + result += TableWithString + PubConst.Space; + } + return result; + } } public string ToSqlString() { - throw new NotImplementedException(); + string columnsString =string.Join("," ,this.ColumNames.Select(it => Builder.GetTranslationColumnName(it))); + string columnParametersString = string.Join(",", this.ColumNames.Select(it =>Builder.SqlParameterKeyWord+it)); + return string.Format(this.sql.ToString(),columnsString, columnParametersString); } } } diff --git a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/QueryBuilder.cs b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/QueryBuilder.cs index 6a01db90b..11cce1d07 100644 --- a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/QueryBuilder.cs +++ b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/QueryBuilder.cs @@ -13,7 +13,7 @@ namespace SqlSugar public QueryBuilder() { - this.QueryPars = new List(); + this.Parameters = new List(); } #region Private Fileds @@ -42,7 +42,7 @@ namespace SqlSugar public string GroupByValue { get; set; } public int WhereIndex { get; set; } public int JoinIndex { get; set; } - public virtual List QueryPars { get; set; } + public virtual List Parameters { get; set; } public virtual List JoinQueryInfos { get @@ -191,8 +191,8 @@ namespace SqlSugar resolveExpress.MappingTables = Context.MappingTables; resolveExpress.IgnoreComumnList = Context.IgnoreComumns; resolveExpress.Resolve(expression, resolveType); - this.QueryPars = new List(); - this.QueryPars.AddRange(resolveExpress.Parameters); + this.Parameters = new List(); + this.Parameters.AddRange(resolveExpress.Parameters); var reval = resolveExpress.Result; return reval; } @@ -234,7 +234,7 @@ namespace SqlSugar this.Take = 0; this.sql = null; this.WhereIndex = 0; - this.QueryPars = null; + this.Parameters = null; this.GroupByValue = null; this._TableNameString = null; this.WhereInfos = null; diff --git a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/SqlQueryBuilder.cs b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/SqlQueryBuilder.cs index d1aab3990..c414fbeaa 100644 --- a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/SqlQueryBuilder.cs +++ b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/SqlQueryBuilder.cs @@ -51,6 +51,19 @@ namespace SqlSugar } } + public List Parameters + { + get + { + throw new NotImplementedException(); + } + + set + { + throw new NotImplementedException(); + } + } + public string ToSqlString() { throw new NotImplementedException(); diff --git a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/UpdateBuilder.cs b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/UpdateBuilder.cs index ebed4e370..2edf9b3ee 100644 --- a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/UpdateBuilder.cs +++ b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/UpdateBuilder.cs @@ -20,6 +20,19 @@ namespace SqlSugar } } + public List Parameters + { + get + { + throw new NotImplementedException(); + } + + set + { + throw new NotImplementedException(); + } + } + public StringBuilder sql { get diff --git a/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs b/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs new file mode 100644 index 000000000..d7aedd3a2 --- /dev/null +++ b/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class InsertableProvider : IInsertable where T : class, new() + { + public SqlSugarClient Context { get; set; } + public IDb Db { get { return Context.Database; } } + public IDbBind Bind { get { return this.Db.DbBind; } } + public ISqlBuilder SqlBuilder { get; set; } + public InsertBuilder InsertBuilder + { + get + { + return this.SqlBuilder.InsertBuilder; + } + } + public int ExecuteCommand() + { + return Db.ExecuteCommand(InsertBuilder.ToSqlString(), InsertBuilder.Parameters); + } + public KeyValuePair> ToSql() + { + string sql = InsertBuilder.ToSqlString(); + return new KeyValuePair>(sql, InsertBuilder.Parameters); + } + + public int ExecuteReutrnIdentity() + { + return Db.GetInt(InsertBuilder.ToSqlString(), InsertBuilder.Parameters); + } + + public IInsertable IgnoreColumns(Expression> columns) + { + throw new NotImplementedException(); + } + + public IInsertable Insert(T InsertObj) + { + throw new NotImplementedException(); + } + + public IInsertable InsertColumns(Expression> columns) + { + throw new NotImplementedException(); + } + + public IInsertable InsertRange(List InsertObjs) + { + throw new NotImplementedException(); + } + + public IInsertable With(string lockString) + { + throw new NotImplementedException(); + } + } +} diff --git a/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 167e7f15a..552582436 100644 --- a/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -31,12 +31,12 @@ namespace SqlSugar public ISugarQueryable AddParameters(object whereObj) { if (whereObj != null) - QueryBuilder.QueryPars.AddRange(Context.Database.GetParameters(whereObj)); + QueryBuilder.Parameters.AddRange(Context.Database.GetParameters(whereObj)); return this; } public ISugarQueryable AddParameters(SugarParameter[] pars) { - QueryBuilder.QueryPars.AddRange(pars); + QueryBuilder.Parameters.AddRange(pars); return this; } @@ -71,7 +71,7 @@ namespace SqlSugar var whereValue = QueryBuilder.WhereInfos; whereValue.Add(SqlBuilder.AppendWhereOrAnd(whereValue.Count == 0, whereString)); if (whereObj != null) - QueryBuilder.QueryPars.AddRange(Context.Database.GetParameters(whereObj)); + QueryBuilder.Parameters.AddRange(Context.Database.GetParameters(whereObj)); return this; } public ISugarQueryable Where(Expression> expression) @@ -109,7 +109,7 @@ namespace SqlSugar QueryBuilder.HavingInfos = SqlBuilder.AppendHaving(whereString); if (whereObj != null) - QueryBuilder.QueryPars.AddRange(Context.Database.GetParameters(whereObj)); + QueryBuilder.Parameters.AddRange(Context.Database.GetParameters(whereObj)); return this; } public ISugarQueryable Having(Expression> expression) @@ -420,7 +420,7 @@ namespace SqlSugar { QueryBuilder.IsCount = true; var sql = QueryBuilder.ToSqlString(); - var reval = Context.Database.GetInt(sql, QueryBuilder.QueryPars.ToArray()); + var reval = Context.Database.GetInt(sql, QueryBuilder.Parameters.ToArray()); QueryBuilder.IsCount = false; return reval; } @@ -501,7 +501,7 @@ namespace SqlSugar public KeyValuePair> ToSql() { string sql = QueryBuilder.ToSqlString(); - return new KeyValuePair>(sql, QueryBuilder.QueryPars); + return new KeyValuePair>(sql, QueryBuilder.Parameters); } public ISugarQueryable With(string withString) @@ -554,7 +554,7 @@ namespace SqlSugar var reval = InstanceFactory.GetQueryable(this.Context.CurrentConnectionConfig); reval.Context = this.Context; reval.SqlBuilder = this.SqlBuilder; - reval.SqlBuilder.QueryBuilder.QueryPars = QueryBuilder.QueryPars; + reval.SqlBuilder.QueryBuilder.Parameters = QueryBuilder.Parameters; reval.SqlBuilder.QueryBuilder.SelectValue = expression; return reval; } @@ -599,7 +599,7 @@ namespace SqlSugar } else { - var reval = this.Bind.DataReaderToList(tType, dataReader, QueryBuilder.SelectCacheKey); + result = this.Bind.DataReaderToList(tType, dataReader, QueryBuilder.SelectCacheKey); } if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection) this.Context.Close(); } diff --git a/SqlSugar/Entities/SqlWith.cs b/SqlSugar/Entities/SqlWith.cs index 603169267..0560e0226 100644 --- a/SqlSugar/Entities/SqlWith.cs +++ b/SqlSugar/Entities/SqlWith.cs @@ -9,5 +9,11 @@ namespace SqlSugar public partial class SqlWith { public const string NoLock = "WITH(NOLOCK) "; + public const string HoldLock = "WITH(HOLDLOCK)"; + public const string PagLock = "WITH(PAGLOCK)"; + public const string ReadCommitted = "WITH(READCOMMITTED)"; + public const string TabLockX = "WITH(TABLOCKX)"; + public const string UpdLock = "WITH(UPDLOCK)"; + public const string RowLock = "WITH(ROWLOCK)"; } } diff --git a/SqlSugar/Interface/IDeleteable.cs b/SqlSugar/Interface/IDeleteable.cs new file mode 100644 index 000000000..c1c537e3d --- /dev/null +++ b/SqlSugar/Interface/IDeleteable.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public interface IDeleteable + { + int ExecuteCommand(); + IInsertable TableName(string name); + IInsertable With(string lockString); + IInsertable Where(T deleteObj); + IInsertable Where(Expression> expression); + IInsertable Where(List deleteObjs); + IInsertable Where(PkType primaryKeyValue); + IInsertable Where(PkType [] primaryKeyValues); + IInsertable Where(string whereString,object whereObj); + } +} diff --git a/SqlSugar/Interface/ISqlBuilder/IDMLBuilder.cs b/SqlSugar/Interface/ISqlBuilder/IDMLBuilder.cs index 8793eae54..d067f5647 100644 --- a/SqlSugar/Interface/ISqlBuilder/IDMLBuilder.cs +++ b/SqlSugar/Interface/ISqlBuilder/IDMLBuilder.cs @@ -8,6 +8,7 @@ namespace SqlSugar public partial interface IDMLBuilder { string SqlTemplate { get; } + List Parameters { get; set; } SqlSugarClient Context { get; set; } StringBuilder sql { get; set; } string ToSqlString(); diff --git a/SqlSugar/Interface/IUpdateable.cs b/SqlSugar/Interface/IUpdateable.cs new file mode 100644 index 000000000..a74a0af2d --- /dev/null +++ b/SqlSugar/Interface/IUpdateable.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public interface IUpdateable + { + int ExecuteCommand(); + IInsertable With(string lockString); + IInsertable Update(T InsertObj); + IInsertable Where(bool isUpdateNull); + IInsertable UpdateColumns(Expression> columns); + IInsertable IgnoreColumns(Expression> columns); + IInsertable UpdateRange(List InsertObjs); + } +} diff --git a/SqlSugar/Interface/Insertable.cs b/SqlSugar/Interface/Insertable.cs new file mode 100644 index 000000000..fc47a0048 --- /dev/null +++ b/SqlSugar/Interface/Insertable.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public interface IInsertable + { + int ExecuteCommand(); + int ExecuteReutrnIdentity(); + IInsertable With(string lockString); + IInsertable InsertColumns(Expression> columns); + IInsertable IgnoreColumns(Expression> columns); + KeyValuePair> ToSql(); + + } +} diff --git a/SqlSugar/SqlSugar.csproj b/SqlSugar/SqlSugar.csproj index 068ada3cf..1a9e64ecf 100644 --- a/SqlSugar/SqlSugar.csproj +++ b/SqlSugar/SqlSugar.csproj @@ -53,6 +53,7 @@ + @@ -139,11 +140,14 @@ + + + @@ -152,9 +156,8 @@ - - - + + diff --git a/SqlSugar/SqlSugarClient.cs b/SqlSugar/SqlSugarClient.cs index bb2b0f690..cdc9d2b66 100644 --- a/SqlSugar/SqlSugarClient.cs +++ b/SqlSugar/SqlSugarClient.cs @@ -128,6 +128,21 @@ namespace SqlSugar reval.SqlBuilder.QueryBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(base.CurrentConnectionConfig); return reval; } + + public virtual IInsertable Insertable(params T [] insertObj) where T : class, new() + { + var reval = new InsertableProvider(); + reval.Context = this; + var sqlBuilder = InstanceFactory.GetSqlbuilder(base.CurrentConnectionConfig); ; + reval.SqlBuilder = sqlBuilder; + reval.SqlBuilder.QueryBuilder = InstanceFactory.GetQueryBuilder(base.CurrentConnectionConfig); + reval.SqlBuilder.QueryBuilder.Builder = sqlBuilder; + reval.SqlBuilder.Context = reval.SqlBuilder.QueryBuilder.Context = this; + reval.SqlBuilder.QueryBuilder.EntityName = typeof(T).Name; + reval.SqlBuilder.QueryBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(base.CurrentConnectionConfig); + return reval; + } + /// /// Lambda Query operation ///