SqlSugar-执行Sql语句查询实例

原文参考:https://blog.csdn.net/weixin_34041003/article/details/85833562

使用SqlSugar执行sql语句

1.简单查询

SqlSugarClient db => GetInstance();
//执行sql语句,处理
//1.执行sql,转成list
List<teacher> list1 = db.Ado.SqlQuery<teacher>("select * from teacher where tsex=@tsex", new { tsex = "女" });
Console.WriteLine(list1.ToJsonString());
//2.转成dynamic
dynamic list2 = db.Ado.SqlQueryDynamic("select * from UserInfo");
Console.WriteLine(list2.Length);
//3.转成json数据
string list3 = db.Ado.SqlQueryJson("select * from UserInfo");
Console.WriteLine(list3);
//4.返回int
int count = db.Ado.SqlQuery<int>("select count(*) from UserInfo").FirstOrDefault();
Console.WriteLine(count);

//5.返回键值对类型
Dictionary<string, string> list4 = db.Ado.SqlQuery<KeyValuePair<string, string>>("select UserID,Name from UserInfo")
    .ToDictionary(q => q.Key, q => q.Value);
Console.WriteLine(list4.ToJsonString());

//6.返回List<string[]> 集合
List<string[]> list5 = db.Ado.SqlQuery<string[]>("select  * from teacher where tsex=@tsex", new { tsex = "女" });
Console.WriteLine(list5.ToJsonString());
//返回 DataTable
DataTable dataTable =  db.Ado.GetDataTable("select * from teacher where tsex=@tsex", new { tsex = "女" });

2.汇总查询

SqlSugarClient db => GetInstance();
//更方便的获取第一行第一列
string result1 = db.Ado.GetString(" select  name from UserInfo where UserID=@UserID", new { UserID = 1 });
Console.WriteLine(result1);
int count = db.Ado.GetInt("select count(*) from UserInfo");
Console.WriteLine(count);
double result2 = db.Ado.GetDouble("select avg(degree) from score where cno=@cno ", new System.Data.SqlClient.SqlParameter("@cno", "3-105"));
Console.WriteLine(result2);

decimal result3 = db.Ado.GetDecimal(" select avg(degree) from score");
Console.WriteLine(result3);

3.执行视图、存储过程

SqlSugarClient db => GetInstance();
//执行视图查询
List<student> list1 = db.SqlQuery<student>("select * from V_student");
Console.WriteLine(list1.ToJsonString());
//执行存储过程处理
var pars = SqlSugarTool.GetParameters(new { pageStart = 1, pageEnd = 5, recordCount = 0 });
//禁止清空参数
db.IsClearParameters = false;
pars[2].Direction = System.Data.ParameterDirection.Output;
List<student> list2 = db.SqlQuery<student>("exec proc_PageStudent @pageStart,@pageEnd,@recordCount output", pars);
db.IsClearParameters = true;//启用自动清空参数
var recordCount = pars[2].Value;
Console.WriteLine(list2.ToJsonString());
Console.WriteLine(recordCount);

 

4:DataTable转list类

public class DataConvertList<T> where T : new()
    {
        Logger log = new Logger(typeof(DataConvertList<T>));
        /// <summary>
        /// 只轉換一層的實體類對象,實體類中的實體類不參與轉換了
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public List<T> ConvertToList(DataTable dt)
        {
            // 定义集合  
            List<T> ts = new List<T>();

            // 获得此模型的类型  
            Type type = typeof(T);
            //定义一个临时变量  
            string tempName = string.Empty;
            //遍历DataTable中所有的数据行  
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                // 获得此模型的公共属性  
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //遍历该对象的所有属性  
                foreach (PropertyInfo pi in propertys)
                {
                    try
                    {

                        ModelType modelType = GetModelType(pi.PropertyType);
                        if (modelType == ModelType.Else)//引用类型
                        {
                            Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集
                            var obj = assembly.CreateInstance(pi.PropertyType.FullName); // 创建类的实例,返回为 object 类型,需要强制类型转换
                            //引用类型 必须对泛型实例化
                            PropertyInfo[] _propertys = obj.GetType().GetProperties();
                            setPropertyData(_propertys, obj, dt, dr);

                            pi.SetValue(t, obj, null);
                            continue;
                        }
                        tempName = pi.Name;//将属性名称赋值给临时变量  
                                           //检查DataTable是否包含此列(列名==对象的属性名)    
                                           //if (dt.Columns.ContainsKey(tempName))
                        if (dt.Columns.Contains(tempName))
                        {
                            // 判断此属性是否有Setter  
                            if (!pi.CanWrite) continue;//该属性不可写,直接跳出  
                                                       //取值  
                            object value = dr[tempName];
                            //如果非空,则赋给对象的属性  
                            if (value != DBNull.Value)
                                pi.SetValue(t, value, null);
                        }
                    }
                    catch (Exception e)
                    {
                        log.Error("tempName轉換失敗", e);
                        continue;
                    }

                }
                //对象添加到泛型集合中  
                ts.Add(t);
            }
            return ts;
        }

        /// <summary>
        /// 設置第二層的對象
        /// </summary>
        /// <param name="propertys"></param>
        /// <param name="t"></param>
        /// <param name="dt"></param>
        /// <param name="dr"></param>
        private void setPropertyData(PropertyInfo[] propertys, object t, DataTable dt, DataRow dr)
        {
            string tempName = string.Empty;
            foreach (PropertyInfo pi in propertys)
            {
                try
                {

                    ModelType modelType = GetModelType(pi.PropertyType);
                    if (modelType == ModelType.Else)//引用类型
                    {
                        continue;
                    }
                    tempName = pi.Name;//将属性名称赋值给临时变量  
                                       //检查DataTable是否包含此列(列名==对象的属性名)    
                                       //if (dt.Columns.ContainsKey(tempName))
                    if (dt.Columns.Contains(tempName))
                    {
                        // 判断此属性是否有Setter  
                        if (!pi.CanWrite) continue;//该属性不可写,直接跳出  
                                                   //取值  
                        object value = dr[tempName];
                        //如果非空,则赋给对象的属性  
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
                catch (Exception e)
                {
                    log.Error("tempName轉換失敗", e);
                    continue;
                }

            }
        }

        /// <summary>
        /// 类型枚举
        /// </summary>
        private enum ModelType
        {
            //值类型
            Struct,
            Enum,
            //引用类型
            String,
            Object,
            Else
        }

        private static ModelType GetModelType(Type modelType)
        {
            //值类型
            if (modelType.IsEnum)
            {
                return ModelType.Enum;
            }
            //值类型
            if (modelType.IsValueType)
            {
                return ModelType.Struct;
            }
            //引用类型 特殊类型处理,c#对string也当做值类型处理
            if (modelType == typeof(string))
            {
                return ModelType.String;
            }
            //引用类型 特殊类型处理
            return modelType == typeof(object) ? ModelType.Object : ModelType.Else;
        }





    }

 

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SqlSugar是一个基于.NET的ORM框架,它简化了在.NET应用程序中与SQL Server数据库交互的操作。在.NET 7中,使用SqlSugar进行查询通常涉及以下几个步骤: 1. **创建上下文**:首先,你需要创建一个`ISqlSugar`或其子类(如`DbTable<T>`)的实例,这通常对应于数据库中的某个表。 ```csharp using SqlSugar; var db = new\DbTable<User>(new Config()); ``` 2. **执行查询方法**:你可以使用链式调用来编写查询,例如获取所有用户: ```csharp var users = db.Select<User>() .Where(u => u.Id > 0) .ToList(); ``` - `.Select<T>()`: 定义要返回的结果类型和列选择。 - `.Where(Predicate<T>)`: 根据条件筛选数据。 - `.ToList()`: 或者其他查询操作,比如`.Count()`、`.First()`等,最后将结果换为集合。 3. **动态查询**:SqlSugar支持Linq语法和字符串拼接的混合查询,例如根据传入参数动态构建SQL: ```csharp string name = "John"; var user = db.Queryable<User>() .Where("Name like @name", new { name = $"%{name}%" }) .FirstOrDefault(); ``` 4. **分页查询**:如果你需要分页,可以用`.Page`方法: ```csharp var pageResult = db.Queryable<User>() .Page(1, 10) // 第一页,每页10条 .OrderBy(u => u.Id) // 排序 .Take(20) // 取前20条 .ToList(); ``` 5. **事务处理**:对于复杂的操作,可以使用事务管理: ```csharp using (db.BeginScope()) { try { User newUser = new User { Name = "NewUser" }; db.Insert(newUser); // 更多数据库操作... db.Commit(); // 成功则提交事务 } catch (Exception ex) { db.Rollback(); // 异常则回滚事务 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值