コード例 #1
0
        /// <summary>
        /// 通用主键查询操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="id"></param>
        /// <returns></returns>
        public T Find <T>(int id) where T : BaseModel, new()
        {
            Type type = typeof(T);
            //string columnsString = string.Join(",", type.GetProperties().Select(p => $"[{p.GetMappingName()}]"));
            //string sql = $"SELECT {columnsString} FROM [{type.GetMappingName()}] WHERE ID={id} ";
            string sql        = $"{SqlBuilder<T>.GetFindSql()}{id}";
            string connString = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Read);

            Console.WriteLine($"当前查询的字符串为{connString}");
            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand command = new SqlCommand(sql, conn);
                conn.Open();
                var reader = command.ExecuteReader();
                if (reader.Read())
                {
                    T t = new T();
                    foreach (var prop in type.GetProperties())
                    {
                        string propName = prop.GetMappingName();                                //查询时as一下,可以省下一轮
                        prop.SetValue(t, reader[propName] is DBNull ? null : reader[propName]); //可空类型  设置成null而不是数据库查询的值
                    }
                    return(t);
                }
                else
                {
                    return(default(T));
                }
            }
        }
コード例 #2
0
ファイル: SqlBase.cs プロジェクト: jacklqy/LC_MyQuartzNet
        /// <summary>
        /// 通用主键查询操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="id"></param>
        /// <returns></returns>
        public static T Find <T>(int id) where T : BaseModel //增加约束
        {
            Type   type          = typeof(T);
            string sql           = $"{SqlBuilder<T>.GetFindSql()}{id}";
            string connectionStr = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Read);

            using (SqlConnection connection = new SqlConnection(connectionStr))
            {
                SqlCommand command = new SqlCommand(sql, connection);
                connection.Open();
                var reader = command.ExecuteReader();
                if (reader.Read())
                {
                    T t = (T)Activator.CreateInstance(type);
                    foreach (var prop in type.GetProperties())
                    {
                        var propName = prop.GetMappingName();                                   //优化想法,查询时as一下,可以省下一轮
                        prop.SetValue(t, reader[propName] is DBNull ? null : reader[propName]); //可控类型  设置成null而不是数据库查询的值
                    }
                    return(t);
                }
                else
                {
                    return(default(T));
                }
            }
        }
コード例 #3
0
        public void SaveChange()
        {
            string connString = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            if (this._SqlCommandList.Count > 0)
            {
                using (SqlConnection conn = new SqlConnection(connString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        try
                        {
                            foreach (var command in this._SqlCommandList)
                            {
                                command.Connection  = conn;
                                command.Transaction = trans;
                                command.ExecuteNonQuery();
                            }
                            trans.Commit();
                        }
                        catch (Exception)
                        {
                            trans.Rollback();
                            throw;
                        }
                        finally
                        {
                            this._SqlCommandList?.Clear();
                        }
                    }
                }
            }
        }
コード例 #4
0
ファイル: SqlHelper.cs プロジェクト: jacklqy/LC_MyQuartzNet
        public static void BatchInsert(DataTable dataTable, string destinationTableName, int batchSize = 0)
        {
            string connectionStr = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            using (SqlConnection connection = new SqlConnection(connectionStr))
            {
                if (connection.State != ConnectionState.Open)
                {
                    connection.Open();
                }
                using (SqlTransaction transaction = connection.BeginTransaction())
                {
                    //SqlBulkCopy 要求 DataTable 的列必须和表列顺序一致,并且不能多也不能少,所以实体类的字段顺序要和数据库表字段顺序和类型一致...
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
                    {
                        bulkCopy.BatchSize            = batchSize;
                        bulkCopy.DestinationTableName = destinationTableName;
                        try
                        {
                            bulkCopy.WriteToServer(dataTable);
                            transaction.Commit();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                            transaction.Rollback();
                        }
                    }
                }
            }
        }
コード例 #5
0
        /// <summary>
        /// 根据条件lambda式进行查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="func"></param>
        /// <returns></returns>
        public IList <T> FindCondition <T>(Expression <Func <T, bool> > func) where T : BaseModel, new()
        {
            Type   type          = typeof(T);
            string columnsString = string.Join(",", type.GetProperties().Select(p => $"[{p.GetMappingName()}]"));

            string where = func.ToWhere <T>(out List <SqlParameter> parameters);
            string sql        = $"SELECT {columnsString} FROM [{type.GetMappingName()}] WHERE {where}";
            string connString = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Read);

            Console.WriteLine($"当前查询的字符串为{sql}");
            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand command = new SqlCommand(sql, conn);
                command.Parameters.AddRange(parameters.ToArray());
                conn.Open();
                var       reader = command.ExecuteReader();
                IList <T> result = new List <T>();
                while (reader.Read())
                {
                    T t = new T();
                    foreach (var prop in type.GetProperties())
                    {
                        string propName = prop.GetMappingName();
                        prop.SetValue(t, reader[propName] is DBNull ? null : reader[propName]);
                    }
                    result.Add(t);
                }
                return(result);
            }
        }
コード例 #6
0
ファイル: SqlBase.cs プロジェクト: jacklqy/LC_MyQuartzNet
        /// <summary>
        /// 通用实体更新操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public static bool Update <T>(T t) where T : BaseModel
        {
            Type   type          = t.GetType();
            string sql           = $"{SqlBuilder<T>.GetUpdateSql()}";
            var    paraArray     = type.GetProperties().Select(p => new SqlParameter($"@{p.GetMappingName()}", p.GetValue(t) ?? DBNull.Value)).ToArray();
            string connectionStr = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            using (SqlConnection connection = new SqlConnection(connectionStr))
            {
                SqlCommand command = new SqlCommand(sql, connection);
                command.Parameters.AddRange(paraArray);
                connection.Open();
                return(command.ExecuteNonQuery() > 0);
            }
        }
コード例 #7
0
ファイル: SqlBase.cs プロジェクト: jacklqy/LC_MyQuartzNet
        /// <summary>
        /// 通用主键删除操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="id"></param>
        /// <returns></returns>
        public static bool Delete <T>(int id) where T : BaseModel
        {
            Type   type          = typeof(T);
            string sql           = $"{SqlBuilder<T>.GetDeleteSql()}";
            string connectionStr = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            using (SqlConnection connection = new SqlConnection(connectionStr))
            {
                SqlCommand   command   = new SqlCommand(sql, connection);
                SqlParameter parameter = new SqlParameter("@id", id);
                command.Parameters.Add(parameter);
                connection.Open();
                return(command.ExecuteNonQuery() > 0);
            }
        }
コード例 #8
0
ファイル: SqlBase.cs プロジェクト: jacklqy/LC_MyQuartzNet
        /// <summary>
        /// 通用实体新增操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public static int Insert <T>(T t) where T : BaseModel //增加约束
        {
            Type   type      = t.GetType();
            string sql       = $"{SqlBuilder<T>.GetInsertSql()}";
            var    paraArray = type.GetPropertiesWithoutKey().Select(p => new SqlParameter($"@{p.GetMappingName()}", p.GetValue(t) ?? DBNull.Value)).ToArray();

            string connectionStr = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            using (SqlConnection connection = new SqlConnection(connectionStr))
            {
                SqlCommand command = new SqlCommand(sql, connection);
                command.Parameters.AddRange(paraArray);
                connection.Open();
                object oId = command.ExecuteScalar();
                return(int.TryParse(oId?.ToString(), out int iId) ? iId : -1);
            }
        }
コード例 #9
0
        /// <summary>
        /// 按条件删除
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="func"></param>
        /// <param name="paraArray">属性-值  属性-值</param>
        public bool DeleteCondition <T>(Expression <Func <T, bool> > func, params object[] paraArray) where T : BaseModel, new()
        {
            Type   type      = typeof(T);
            string stringSet = string.Join(",", type.GetPropertiesWithoutKey().Select(p => $"{p.GetMappingName()}=@{p.Name}"));

            string where = func.ToWhere <T>(out List <SqlParameter> parameters);
            string sql        = $"DELETE FROM [{type.GetMappingName()}] WHERE {where};";
            string connString = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            Console.WriteLine($"当前删除的字符串为{sql}");
            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand command = new SqlCommand(sql, conn);
                command.Parameters.AddRange(paraArray);
                conn.Open();
                return(command.ExecuteNonQuery() > 0);
            }
        }
コード例 #10
0
        //按需更新--界面上只修改了几个字段--大家有什么思路,可以自己动手,然后show出来
        //1 传递一个列表---实体三个属性  字段名称--操作符--值
        //2 改造成json---{"Name":"zzzz","Password":"******"}
        public int Update <T>(string json, int id) where T : BaseModel, new()
        {
            Type   type      = typeof(T);
            T      t         = Newtonsoft.Json.JsonConvert.DeserializeObject <T>(json);//JObject
            string stringSet = string.Join(",", type.GetPropertiesInJson(json).Select(p => $"{p.GetMappingName()}=@{p.Name}"));
            string sql       = $"UPDATE {type.GetMappingName()} SET {stringSet} WHERE Id=@Id;";

            var paraArray = type.GetPropertiesInJson(json).Select(p => new SqlParameter($"@{p.Name}", p.GetValue(t) ?? DBNull.Value)).Append(new SqlParameter("@Id", id)).ToArray();

            string connString = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand command = new SqlCommand(sql, conn);
                command.Parameters.AddRange(paraArray);
                conn.Open();
                return(command.ExecuteNonQuery());
            }
        }
コード例 #11
0
        /// <summary>
        /// 根据实体主键删除
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public bool Delete <T>(T t) where T : BaseModel, new()
        {
            Type   type      = t.GetType();
            string sql       = $"DELETE FROM [{type.GetMappingName()}] WHERE Id=@Id;";
            var    paraArray = new SqlParameter[] { new SqlParameter("@Id", t.Id) };

            string connString = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand command = new SqlCommand(sql, conn);
                command.Parameters.AddRange(paraArray);
                conn.Open();
                //var trans = conn.BeginTransaction();
                //trans.Commit();
                //trans.Rollback();
                return(1 == command.ExecuteNonQuery());
            }
        }
コード例 #12
0
ファイル: SqlHelper.cs プロジェクト: jacklqy/LC_MyQuartzNet
        /// <summary>
        /// 执行sql命名返回一个影响行数,针对于增删改操作
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="isProcedure">是否是过程</param>
        /// <param name="pms">sql语句所需要的参数</param>
        /// <returns></returns>
        public static int ExecuteNonQuery(string sql, bool isProcedure, params SqlParameter[] pms)
        {
            string connectionStr = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            using (SqlConnection conn = new SqlConnection(connectionStr))
            {
                SqlCommand cmd = new SqlCommand(sql, conn);
                if (isProcedure == true)
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                }
                if (pms != null)
                {
                    cmd.Parameters.AddRange(pms);
                }
                conn.Open();
                return(cmd.ExecuteNonQuery());
            }
        }
コード例 #13
0
        public int Insert <T>(T t) where T : BaseModel, new()
        {
            Type type = t.GetType();
            //string columnsString = string.Join(",", type.GetPropertiesWithoutKey().Select(p => $"[{p.GetMappingName()}]"));
            //string valuesString = string.Join(",", type.GetPropertiesWithoutKey().Select(p => $"@{p.GetMappingName()}"));
            //string sql = $"INSERT INTO [{type.GetMappingName()}] ({columnsString}) VALUES({valuesString});";//不能直接拼装值---Sql注入问题
            string sql = SqlBuilder <T> .GetInsertSql();

            var paraArray = type.GetProperties().Select(p => new SqlParameter($"@{p.GetMappingName()}", p.GetValue(t) ?? DBNull.Value)).ToArray();

            string connString = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand command = new SqlCommand(sql, conn);
                command.Parameters.AddRange(paraArray);
                conn.Open();
                object oId = command.ExecuteScalar();

                return(int.TryParse(oId?.ToString(), out int iId) ? iId : -1);
            }
        }
コード例 #14
0
ファイル: SqlHelper.cs プロジェクト: jacklqy/LC_MyQuartzNet
        /// <summary>
        /// 执行命令得到一个SqlDataReader对象,你可以用这个对象的Reader对象读取数据----使用后需要Close()释放
        /// </summary>
        /// <param name="sql">sql语句或过程名</param>
        /// <param name="isProcedure">是否是过程</param>
        /// <param name="pms">执行所要的参数</param>
        /// <returns></returns>
        public static SqlDataReader GetReader(string sql, bool isProcedure, params SqlParameter[] pms)
        {
            string        connectionStr = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Read);
            SqlConnection conn          = new SqlConnection(connectionStr);
            SqlCommand    cmd           = new SqlCommand(sql, conn);

            if (isProcedure == true)
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (pms != null)
            {
                cmd.Parameters.AddRange(pms);
            }
            conn.Open();
            //***CommandBehavior.CloseConnection 在sdr执行命令完毕后的行为是自动关闭连接,也就意味着手动调用sdr.Close()方法时,conn也close()***
            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            //bool b = sdr.Read();
            //conn.Close();
            return(sdr);
        }
コード例 #15
0
        public int Update <T>(T t) where T : BaseModel, new()
        {
            if (!t.Validate <T>())
            {
                throw new Exception("数据校验没有通过");//大家可以再返回点提示信息
            }

            Type   type      = t.GetType();
            string stringSet = string.Join(",", type.GetPropertiesWithoutKey().Select(p => $"{p.GetMappingName()}=@{p.Name}"));
            string sql       = $"UPDATE [{type.GetMappingName()}] SET {stringSet} WHERE Id=@Id;";
            //string sql = SqlBuilder<T>.GetInsertSql();
            var paraArray = type.GetProperties().Select(p => new SqlParameter($"@{p.Name}", p.GetValue(t) ?? DBNull.Value)).ToArray();

            string connString = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Write);

            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand command = new SqlCommand(sql, conn);
                command.Parameters.AddRange(paraArray);
                conn.Open();
                return(command.ExecuteNonQuery());
            }
        }
コード例 #16
0
ファイル: SqlHelper.cs プロジェクト: jacklqy/LC_MyQuartzNet
        /// <summary>
        /// 执行sql语句或存储过程返回一个表
        /// sql=select * from student where sex=@a
        /// sql2=select * from grade where score >@x and stuid>@n
        /// </summary>
        /// <param name="sql">sql语句或过程名</param>
        /// <param name="isProcedure">是否是过程</param>
        /// <param name="pms">执行所要的参数</param>
        /// <returns></returns>
        public static DataTable GetTable(string sql, bool isProcedure, params SqlParameter[] pms)
        {
            string connectionStr = SqlConnectionPool.GetConnectionString(SqlConnectionPool.SqlConnectionType.Read);

            using (SqlConnection conn = new SqlConnection(connectionStr)) //using创建的对象,自动释放资源
            {
                SqlCommand cmd = new SqlCommand(sql, conn);
                if (isProcedure == true)
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                }
                if (pms != null)
                {
                    cmd.Parameters.AddRange(pms);
                }
                conn.Open();
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                DataSet        ds  = new DataSet();
                sda.Fill(ds, "aa");
                DataTable dt = ds.Tables["aa"];
                return(dt);
            }
        }