ado.net 自己编写的SqlHelper类

.net 软件开发模式——三层架构 需要注意的是,不同的数据访问技术和开发框架通常有不同的 SqlHelper 实现方式,例如在 ASP.NET 中,我们通常使用 SqlHelper 类来访问 SQL Server 数据库,而在 Entity Framework 中,我们可以使用 DbContext 来管理数据访问逻辑,或者使用 LINQ 表达式来查询数据。1.查询操作返回的是DataTable 是一个 C# 中的数据表格类,它代表了一个内存中的数据表格,提供了一种方便的方法来存储和操作数据。下面分别介绍在 .NET 中如何实现这三层架构。 阅读详情

要注意DataSet的写法,有点麻烦


SqlHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;

namespace WPFDemo01
{
    class SqlHelper
    {
        //基础版SqlHelper
        ////注意,要用这行代码前提是将连接字符串配置在了app.config配置文件中
        //private static string connstr = ConfigurationManager.ConnectionStrings["linkDBStr"].ConnectionString;


        ////封装方法的原则:把不变的放到方法里,把变化的放到参数中。
        ////注意,命名虽然可以随便,但是要写好意思方便阅读
        ////执行Update,Delete,Insert语句
        //public static int ExecuteNonQuery(string sql)
        //{
        //    using (SqlConnection conn = new SqlConnection(connstr))
        //    {
        //        conn.Open();
        //        using (SqlCommand cmd = conn.CreateCommand())
        //        {
        //            cmd.CommandText = sql;
        //            return cmd.ExecuteNonQuery();
        //        }
        //    }
        //}


        ////返回第一行第一列
        //public static object ExecuteScalar(string sql)
        //{
        //    using (SqlConnection conn = new SqlConnection(connstr))
        //    {
        //        conn.Open();
        //        using (SqlCommand cmd = conn.CreateCommand())
        //        {
        //            cmd.CommandText = sql;
        //            return cmd.ExecuteScalar();
        //        }
        //    }
        //}


        //DataSet版本1
        ////返回一个DataSet,这里因为一般只会返回一个table,
        ////所以返回值改为datatable更为简便,
        ////以后根据需要看着改变
        ////注意:只用来执行查询结果比较少的sql
        //public static DataTable ExecuteDataTable(string sql)
        //{
        //    using (SqlConnection conn = new SqlConnection(connstr))
        //    {
        //        conn.Open();
        //        using (SqlCommand cmd = conn.CreateCommand())
        //        {
        //            cmd.CommandText = sql;
        //            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        //            DataSet dataset = new DataSet();
        //            adapter.Fill(dataset);//把adapter放入dataset中
        //            return dataset.Tables[0];
        //        }
        //    }
        //}











        //注意,要用这行代码前提是将连接字符串配置在了app.config配置文件中
        private static string connstr = ConfigurationManager.ConnectionStrings["linkDBStr"].ConnectionString;


        //封装方法的原则:把不变的放到方法里,把变化的放到参数中。
        //注意,命名虽然可以随便,但是要写好意思方便阅读
        //执行Update,Delete,Insert语句
        public static int ExecuteNonQuery(string sql,SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    //foreach (SqlParameter param in parameters)
                    //{
                    //    cmd.Parameters.Add(param);
                    //}
                    cmd.Parameters.AddRange(parameters);//实质和foreach是一样的
                    return cmd.ExecuteNonQuery();
                }
            }
        }


        //返回第一行第一列
        public static object ExecuteScalar(string sql,SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    return cmd.ExecuteScalar();
                }
            }
        }



        ////DataSet版本2
        ////返回一个DataSet,这里因为一般只会返回一个table,
        ////所以返回值改为datatable更为简便,
        ////以后根据需要看着改变
        ////注意:只用来执行查询结果比较少的sql
        //public static DataTable ExecuteDataTable(string sql, SqlParameter[] parameters)
        //{
        //    using (SqlConnection conn = new SqlConnection(connstr))
        //    {
        //        conn.Open();
        //        using (SqlCommand cmd = conn.CreateCommand())
        //        {
        //            cmd.CommandText = sql;
        //            cmd.Parameters.AddRange(parameters);
        //            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        //            DataSet dataset = new DataSet();
        //            adapter.Fill(dataset);//把adapter放入dataset中
        //            return dataset.Tables[0];
        //        }
        //    }
        //}



        //DataSet版本3:使用长度可变参数来简化
        //注意:长度可变参数必须是数组类型
        public static DataTable ExecuteDataTable(string sql,params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    DataSet dataset = new DataSet();
                    adapter.Fill(dataset);//把adapter放入dataset中
                    return dataset.Tables[0];
                }
            }
        }
    }
}



WPF代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;

namespace WPFDemo01
{
    /// <summary>
    /// ADOBasic.xaml 的交互逻辑
    /// </summary>
    public partial class ADOBasic : Window
    {
        public ADOBasic()
        {
            InitializeComponent();
        }

        private void btnLink_Click(object sender, RoutedEventArgs e)
        {
             //对实现了IDisposible接口的,使用using关键字,它能控制对资源的释放,具体的自行百度。语法是
            //using(类型d = new (这里面指的是创建对象)......){.................}他可以自动回收资源,不用自己关闭数据库
            //以后都这么写,conn.close();的方法前面程序挂掉了,那么数据库就没有关,这样时间久了会造成数据库泄露

            //SqlConnection建立和数据库的连接



            //1.第一种,
            //ExecuteNonQuery()通常用来执行Update,Delete,Insert语句,就如单词所示NonQuery,非查询!
            //using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=DemoDB;User ID=sa;Password=540469505")) 
            //{
            //    conn.Open();
            //    MessageBox.Show("数据库连接成功!");
            //    //通过连接创建一个向数据库发命令(command)的对象
            //    using(SqlCommand cmd = conn.CreateCommand())
            //    {
            //        //CommandText为要执行的sql语句
            //        cmd.CommandText = "insert into T_Students(id,name,age,aihao,height) values (101,'刘亦菲',23,'北京吧',170);";
            //        cmd.ExecuteNonQuery();  //开始执行
            //    }
            //}





            //2.第二种,
            //查询用ExecuteScalar()返回的是一行一列的值
            //using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=DemoDB;User ID=sa;Password=540469505")) 
            //{
            //    conn.Open();
            //    using(SqlCommand cmd = conn.CreateCommand())
            //    {
            //        //例1:
            //        //cmd.CommandText="select count(*) from T_Students";
            //        //ExecuteScalar()返回的是一行一列的值使用该类型,意思就是查询的结果只有一个,
            //        //因为其返回的是object类型,所以根据我们返回的实际类型可以进行强制类型转换,
            //        //这里一定要写对对应类型,比如数据库中的varchar类型对应C#中的是string,
            //        //bigint类型对应的是long类型
            //        //int i =(int)cmd.ExecuteScalar(); 
            //        //MessageBox.Show("查询到结果数为:"+i+"条");

            //        //例2:
            //        //cmd.CommandText = "select 'dafa'";
            //        //string s = (string)cmd.ExecuteScalar();
            //        //MessageBox.Show(s);


            //        //例3:
            //        //本数据库中自增长字段为addId,其值是数据库自动分配的,
            //        //那么我们如何得知本数据的addId是多少呢?
            //        cmd.CommandText = "insert into T_Students(id,name,age,aihao,height) output inserted.addId values (10000,'离死',102,'',80)";
            //        int i = (int)cmd.ExecuteScalar();
            //        MessageBox.Show("当前addId为:"+i);
            //    }
            //}

           
            
            
            
            //3.第三种,
            //执行有多行结果的结果集用ExecuteReader,同样是实现IDisposible接口的
            //SqlDataReader reader = cmd.ExecuteReader();.....
            //while(reader.Reader())
            //{
            //Console.writeLine(reader.GetString(1));
            //}这里要和注意,该查询结果是放在数据库中的,没有放到
            //客户端,初始指针指向第一条数据之前,每调用一次Reader指针
            //下移一条,只要没有移到最后一条之后,就一直返回true
            //reader的GetString、GetInt32的方法只接受整数参数,
            //也就是序号,用GetOrdinal方法根据列名动态得到序号
            using(SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=DemoDB;User ID=sa;Password=540469505"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand()) 
                {
                    cmd.CommandText = "select * from T_Students;";
                    using (SqlDataReader reader = cmd.ExecuteReader()) 
                    {
                        while(reader.Read())
                        {
                            string name = reader.GetString(1);  //根据数据库返回值类型写C#对应类型,这里面的参数表示返回该行的第几列
                            int age = reader.GetInt32(2);   //这里的类型对应有点麻烦,要注意
                            MessageBox.Show("名字是:"+name+"   "+"年龄是:"+age);
                        }
                    }
                }
            }

            MessageBox.Show("执行完成~!");
        }




        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            using(SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=DemoDB;User ID=sa;Password=540469505"))
            {
                conn.Open();
                using(SqlCommand cmd = conn.CreateCommand())
                {
                    //此字符串拼接方法,如果这里输入“1' or '1'='1”,则会查出所有的结果,造成了SQL注入漏洞
                    //cmd.CommandText = "select * from T_Students where name = '"+txtPerson.Text+"'";

                    //@Name是占位符,表示我这里需要一个Name的值,这样看起来更有意义,但是name这个词可以换成其他的任意词
                    cmd.CommandText = "select * from T_Students where Name=@Name or Age=@Age";
                    //用法1:
                    //cmd.Parameters.AddWithValue("@Name",txtPerson.Text);
                    //用法2:推荐使用
                    cmd.Parameters.Add(new SqlParameter("@Name",txtPerson.Text));
                    //注意如果是别的类型的注意转换类型
                    cmd.Parameters.Add(new SqlParameter("@Age", Convert.ToInt32(txtPerson.Text)));
                    //此语句也可以用在如下语句等
                    //insert into......values(@Name,@Age...)
                    //delete ...... where ID=@idAdd

                    //注意"@参数"不能用在替换表名、字段名、select之类的关键字等。
                    //如下都是不可以的!
                    //select age from @TableName..
                    //select @AgeName from table...



                    using(SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while(reader.Read())
                        {
                            //GetInt32获得的是int类型
                            //GetInt64获得的是long类型(数据库中是bigint)
                            int id = reader.GetInt32(0);
                            string name = reader.GetString(1);
                            int age = reader.GetInt32(2);
                            string address = reader.GetString(3);
                            int addId = reader.GetInt32(4);
                            MessageBox.Show(id.ToString()+"   "+name+"   "+age.ToString()+"   "+address+"   "+addId.ToString());
                        }
                    }
                }
            }
        }



        //4.第四种
        //SqlDataReader是连接相关的,SqlDataReader中的查询结果并不是放到程序中,
        //而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),只能
        //读取当前游标指向的行,一旦连接断开就不能再读取。这样做的好处就是无论查询
        //结果有多少条,对程序占用的内存都几乎没有影响。
        //SqlDataReader对于小数据量的数据来说带来的只有麻烦。ado.net中提供了数据集的
        //机制,将查询结果填充到本地内存中,这样连接断开、服务器断开都不影响数据的读取。
        //数据集的好处就是降低数据库服务器压力,编程也简单。
        //DataSet dataset = new DataSet();
        //SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        //adapter.Fill(dataset);
        //DataSet包含若干表DataTable,DataTable包含若干行DataRow,

        private void btnDataSet_Click(object sender, RoutedEventArgs e)
        {
            using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=DemoDB;User ID=sa;Password=540469505"))
            {
                conn.Open();
                using(SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from T_Students where age<@Age";
                    cmd.Parameters.Add(new SqlParameter("@Age",txtAge.Text));

                    //SqlDataAdapter是一个帮我们把SqlCommand查询的结果
                    //填充到DataSet中的一个类
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);

                    //DataSet相当于本地的一个复杂集合(类似于List<int>)
                    DataSet dataset = new DataSet();
                    //执行cmd并且把SqlCommand查询的结果填充到DataSet
                    adapter.Fill(dataset);

                    //dataset可以放多个表,我们只放了一个表,所以下标为0
                    DataTable table = dataset.Tables[0];
                    //得到表中有多少行
                    DataRowCollection rows = table.Rows;
                    for (int i = 0; i < rows.Count; i++ )
                    {
                        //取出多行中的第i行
                        DataRow row = rows[i];
                        //分别去除第i行中的各个列的值
                        int age = (int)row["Age"];
                        string name = (string)row["Name"];
                        MessageBox.Show(name + ","+age);
                    }
                }
            }
        }





        //5.第五,连接字符串配置
        //(1)新建项目,应用程序配置文件,App.config,名字必须是这样
//        <configuration>
//            <connectionStrings>
//                <add name="英文名随意" connectionString="数据库连接字符串"/>
//            </connectionStrings>
//        </configuration>
//        (2)然后项目要引用一个类,该类位于.Net-->System.Configuration,
//        代码中:
//       string connstr = ConfigurationManager.ConnectionStrings["linkDBStr"].ConnectionString;

        private void btnConfig_Click(object sender, RoutedEventArgs e)
        {
            string connstr = ConfigurationManager.ConnectionStrings["linkDBStr"].ConnectionString;
            MessageBox.Show(connstr);
        }




        //6.第六。这里使用了自定义的SqlHelper类。
        private void btnSqlHelper_Click(object sender, RoutedEventArgs e)
        {
            //不用长度可变参数的话,调用起来麻烦
            //SqlHelper.ExecuteNonQuery("insert into T_Students(id,name,age,address) values(22,'账期',21,'北京')");
            //DataTable table = SqlHelper.ExecuteDataTable("select * from T_Students where age<80");
            //DataTable table = SqlHelper.ExecuteDataTable("select * from T_Students where age<@Age",
            //    new SqlParameter[]{new SqlParameter("@Age",500)});

            DataTable table = SqlHelper.ExecuteDataTable("select * from T_Students where age<@Age or name=@Name",
               new SqlParameter("@Age", 500), new SqlParameter("@Name", "小天"));
            foreach(DataRow row in table.Rows)
            {
                string name = (string)row["Name"];
                MessageBox.Show(name);
            }
        }
    }
}


告别重复造轮子:用C# SQLHelper封装数据库操作,提升开发效率 本文详细介绍了如何使用C# SQLHelper封装数据库操作,显著提升开发效率。通过封装常用数据库操作方法如执行非查询、标量查询等,减少重复代码,确保资源正确释放。文章还涵盖事务支持、存储过程调用等高级功能,并提供实战案例和性能优化技巧,帮助开发者快速掌握SQLHelper的应用。 阅读详情

相关推荐

ADO.NET操作封装(SqlHelper)

本文封转ado.net的常用操作,若是项目中用到此工具类,直接copy过去即可,省得每次开发都做同样的事情,当然了,用orm框架是另一种选择,这里不做过多讨论

Hello World 4113

C#数据库教程4-ADO.NET自己封装SqlHelper类

目录 一、版本1.0 1、方法封装 (1)ExecuteNonQuery方法 (2)ExecuteScalar方法 (3)ExecuteDataTable方法 2、调用测试 界面 (1)插入数据 (2)查询数据 (3)DataTable查询 二、版本2.0 1、方法封装 (1)ExecuteNonQuery方法 (2)ExecuteScalar方法 (3)ExecuteDataTable方法 2、调用测试 界面 (1)插入数据 (2)查询数据 (3)DataTabl.

panjinliang066333的博客 3753

VB.NET学习笔记:ADO.NET操作ACCESS数据库——微软官方原版SqlHelper类

SQLHelper.vb是2004年微软发布的一个使用ADO.Net方法对SQL Server数据库进行操作的封装类。在网上贴出的SqlHelper类大多是C#版本,如果需要VB.NET版本的微软官方原版SqlHelper类,可以进行如下操作获取。 一、获取SQLHelper.vb 需要从微软官方下载Data Access Application Block for .NET v2,下载地址:ht...

zyjq52uys的博客 1067

ADO.Net和SqlHelper封装

1.什么是ADO.Net 简单来讲,ADO.NET是用于和数据源打交道的.Net结束,是一组向.NET程序员公开数据访问服务的类 2.ADO.NET的组成部分和对象模型 (1)ADO.NET的两个重要组成部分:.NET数据提供程序和数据集(DataSet) (2)ADO.NET对象模型如下图: 3.数据库操作类的封装 SqlHelper (1)...

371

C# SqlHelper类的使用

SqlHelper类 1.首先SqlHelper类是一个基于.NET Framework的数据库操作组件,包含了数据库的操作方法。可以简化在C#中使用ADO.NET连接数据库时每次都要编写连接、打开、执行SQL语句的代码,它将每次连接都要写的代码封装成方法,把要执行的SQL语句通过参数传进去,如数据库连接字符串,SQL参数等,就可以访问数据库了。 2.SqlHelper类的编写不详细说,有完整的现...

xzya321的博客 6148

封装ADO.NET SqlHelper类提升数据库操作效率

ADO.NET 是一个数据访问技术,它允许数据在应用程序和数据源之间进行传输。它主要由两个核心组件构成:数据提供者(Data Provider)和数据集(DataSet)。数据提供者直接连接到数据源,执行命令,读取数据。DataSet 是一个离线数据存储器,用于管理数据的缓存和映射,它支持多种数据源的数据,并且提供了数据关系和约束。泛型方法是一种在方法级别实现类型参数化的方法。这使得方法能够接受任意类型的数据,而不必每次都重新编写类似的代码。泛型方法通过在方法名称前添加<T>来定义,其中T。

weixin_42323064的博客 984

SqlHelper类的方法详细解读和使用示例

本文详细介绍了C#中SqlHelper类的实现与应用,包括核心方法对比、完整代码实现及多种使用场景示例。SqlHelper封装了ADO.NET操作,提供ExecuteNonQuery(增删改)、ExecuteScalar(聚合查询)、ExecuteReader(大数据流读取)和ExecuteDataTable(UI数据绑定)等方法。文章通过CRUD操作、事务处理等实际案例,并强调参数化查询防注入、连接管理、异常处理等最佳实践,帮助开发者提升数据库操作效率与安全性。

weixin_66547608的博客 1260

ADO.NET数据库SqlHelper

ADO.NET中简单实用的三种方法,并将其进行封装,便于操作者进行开发与使用。

ADO.NET复习——自己编写SqlHelper类

今天复习了一次ADO.NET基础,整理一下自己的认为的重点: 编写SqlHelper类,方便我们执行数据库语句,这时可以直接调用封装在SqlHelper类的方法。现在大多数公司面试的时候,给你的面试题都会要你自己手写一个SqlHelper的类,这考的是自己的基本功,如果一个根基不牢固的开发人员,你写的代码肯定好不到哪里去。 下面是SqlHelper的演示代码,一定要熟练: 1 p...

weixin_33757609的博客 111

SqlHelper类1(封装好的ADO.NETSQLHELPER类)

经常调用ado.net的程序员,每次都要new Connection对象、Command对象。甚是麻烦,敲了个SQLHelper类,供初学者下载使用。 是针对SqlServer数据库的。 里头包含了五大对象、ado.net的基本操作够用了,(*^__^*) 嘻嘻…

ADO.Net操作数据库DBhelper可直接使用

ADO.Net操作数据库DBhelper可直接使用,链接SQL数据库,详细代码加注释

黑马程序员_ADO.Net(配置文件的两种写法与使用方法,手动编写SqlHelper类)

一.配置文件的两种写法与使用方法                       使用方法:添加配置文件,添加引用System.comfiguration   //public string con=System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];        public 

雨后春笋_aspx专栏 887

sqlhelper for Adonet

适合c#数据库封装操作Data Access Application Block .NET 2.0: Get Return Values, Output Values.

Sqlhleper 帮助类的编写过程

Sqlhleper 帮助类的编写过程和注意事项   要满足的基本的ADO.NET的sql执行语句! 一、基本的runsql 有几种返回类型的执行结果! 都是通过sqlcommand来实现 com.ExecuteNonQuery();返回的只有整型 所以满足两种要求就行! com.ExecuteNonQuery(); 一就是有直接运行传递过来的sql语句并返回是否执行成功   publi

xjianfeng的专栏 422

asp.net(C#)sql server数据库ado.net操作类SqlServerHelper

asp.net(C#)sql server数据库ado.net操作类SqlServerHelper

网络安全面试题

在当今社会网络安全行业越来越发达,也有越来越多的人去学习,为了更好地进行工作,除了学好知识外还要应对企业的面试。 所以在这里我归总了一些网络安全方面的常见面试题,希望对大家有所帮助。 windows常见 1:描述tcp/udp的区别及优劣,及其发展前景 TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能...

fzx_hsaj的博客 6万+

学习笔记:ADO.NET详解

了解ADO.NET 什么是ADO.NET呢?其实ADO.NET就是C#应用程序访问数据库的一个中间组件。 那ADO.NET又是由哪些部分组成呢?来看下面这张图 根据上面的图,来捋一遍数据库CRUD的流程: 连接数据库 >>> SqlCommand对数据库进行操作 >>> 查询出的数据放到DataSet中(若是增删改只是返回受影响记录条数,即返回int) &g...

KeithRong的博客 4026

企业信息化系统的组成模块-核心业务系统

通过标准化的数据流形成完整的业务闭环,CRM生成的销售订单驱动ERP的生产和采购,ERP将生产计划传递给MES执行,MES报工数据返回ERP进行成本核算,ERP再将交付信息同步给CRM供客户查询。生产管理确保高效交付,缩短订单周期。某贸易公司实施ERP供应链模块后,库存周转率从每年4次提升到8次,库存资金占用从2000万降到1200万,释放800万现金流,同时缺货率从15%降到5%。│ │库存 │ │ MRP │ │ ERP │ │ 云ERP/ │ │。

weiyvyy的博客 695

Ado.Net SqlHelper C#

Ado.Net SqlHelper public class SqlHelper { //private static Logger logger = new Logger(typeof(SqlHelper)); private static string ConnStr = "server=改为ip;database=改为数据库名;uid=sa;pwd=密码";//ConfigurationManager.ConnectionStrings["mvc5"].Conn

qq_37959151的博客 258

基于深度学习的Person Re-ID(综述)

一. 问题的提出        Person Re-ID 全称是 Person Re-Identification,又称为 行人重检测 or 行人再识别,直观上可以通过两种思路进行比对,一种是 通过 静态图像(still-image)进行特征比对,另一种是通过视频的时序特征(temporal)进行 Video Re-Id。        不管是采用 图像特征比对的方法 还是 结合时序特征比

跟随技术的脚步-linolzhang的专栏 2万+

YOLO11涨点优化:注意力魔改 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测

多尺度卷积注意力(MSCA),有效地提取上下文信息,新颖度高,创新十足。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 6316
上一篇: 长度可变参数
下一篇: Transact-SQL 语法规则
Timesongs
博客等级 码龄14年 15粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值