C#的DataGridView数据控件(直接访问SQL vs 通过EF实体模型访问SQL)

目录

一、在DataGridView控件中显示数据

1.直接编程访问SQL

(1)源码

(2)生成效果

2.通过EF实体模型访问SQL

(1)源码

(2)生成效果

二、获取DataGridView控件中的当前单元格

1.直接编程访问SQL 

(1)源码

(2)生成效果​​​​​​​

2.通过EF实体模型访问SQL

(1)源码

(2)生成效果

三、在DataGridView控件中修改数据

 1.直接编程访问SQL

(1)源码

(2)生成效果 

 2.通过EF实体模型访问SQL

(1)源码

(2)生成效果


       使用DataGridView控件可以快速地将数据库中的数据显示给用户,并且可以通过DataGridView控件直接对数据进行操作,大大增强了操作数据库的效率。DataGridView控件提供一种强大而灵活的以表格形式显示数据的方式。

        既可以通过编程直接访问SQL ,也可以通过建立EF实体模型间接访问SQL,哪个方法更方便呢?请读者给出答案吧?

         如何建立数据库的实体模型,在作者的其他文章里有所涉及,本文中不再论述。

一、DataGridView控件中显示数据

1.直接编程访问SQL

        通过DataGridView控件显示数据表中的数据,首先需要使用DataAdapter对象查询指定的数据,然后通过该对象的Fill()方法填充DataSet,最后设置DataGridView控件的DataSource属性为DataSet的表格数据。DataSource属性用于获取或设置DataGridView控件所显示数据的数据源。

语法如下:public Object DataSource{get;set;}
属性值:包含DataGridView控件要显示的数据的对象。

(1)源码

//Form1.cs
//在DataGridView控件中显示数据
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 实例化SqlConnection变量conn,连接数据库db_CSharp
        /// 创建一个SqlDataAdapter对象
        /// 创建一个DataSet对象
        /// 使用SqlDataAdapter对象的Fil()方法填充DataSet
        /// 设置dataGridView1控件数据源
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Dock = DockStyle.Fill;
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.AllowUserToDeleteRows = false;
            dataGridView1.AllowUserToResizeColumns = false;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.ReadOnly = true;
            dataGridView1.RowHeadersVisible = false;

            SqlConnection conn = new SqlConnection("Server=DESKTOP-QFENBNJ\\SQL_WEN;integrated security=SSPI;Initial Catalog=db_CSharp");
            //conn = new SqlConnection("Server=DESKTOP-GFMO83R;integrated security=SSPI;Initial Catalog=db_CSharp");
            SqlDataAdapter sda = new SqlDataAdapter("select*from tb_emp", conn);
            DataSet ds = new DataSet();
            sda.Fill(ds, "emp");
            dataGridView1.DataSource = ds.Tables[0];
        }
    }
}

(2)生成效果

 

2.通过EF实体模型访问SQL

(1)源码

//Form1.cs
//在DataGridView控件中显示数据
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _01_1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Dock = DockStyle.Fill;
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.AllowUserToDeleteRows = false;
            dataGridView1.AllowUserToResizeColumns = false;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.ReadOnly = true;
            dataGridView1.RowHeadersVisible = false;

            using (db_CSharpEntities db_ = new db_CSharpEntities())
            {
                dataGridView1.DataSource = db_.tb_emp.ToList();
            };
        }
    }
}

(2)生成效果

         生成效果与上述方法相同。但通过EF实体模型访问数据库更简单。

二、获取DataGridView控件中的当前单元格

1.直接编程访问SQL 

        若要与DataGridView进行交互,通常要求通过编程方式发现哪个单元格处于活动状态。如果需要更改当前单元格,可通过DataGridView控件的CurrentCell属性来获取当前单元格信息。CurrentCell属性用于获取当前处于活动状态的单元格。语法如下:

public DataGridViewCell CurrentCell {get;set;}
属性值:表示当前单元格的DataGridViewCell,如果没有当前单元格,则为空引用。默认值是第一列中的第一个单元格,如果控件中没有单元格,则为空引用。

(1)源码

//Form1.cs
//获取控件单元格信息
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _02
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 初始化Form1    
        /// 实例化SqlConnection变量conn,连接数据库db_CSharp
        /// 创建一个SqlDataAdapter对象
        /// 创建一个DataSet对象
        /// 使用SqlDataAdapter对象的Fil()方法填充DataSet
        /// 设置dataGridView1控件数据源
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "获取单元格信息:";
            button1.Size = new Size(110,23);
            textBox1.Size = new Size(200,21);

            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.AllowUserToDeleteRows = false;
            dataGridView1.AllowUserToResizeColumns = false;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.ReadOnly = true;
            dataGridView1.RowHeadersVisible = false;

            //SqlConnection conn = new SqlConnection("Server=DESKTOP-QFENBNJ\\SQL_WEN;integrated security=SSPI;Initial Catalog=db_CSharp");
            SqlConnection conn_ = new SqlConnection("Server=DESKTOP-GFMO83R;integrated security=SSPI;Initial Catalog=db_EMS");
            SqlDataAdapter sda_ = new SqlDataAdapter("select*from tb_CNStudent", conn_);
            DataSet ds_ = new DataSet();
            sda_.Fill(ds_, "emp");
            dataGridView1.DataSource = ds_.Tables[0];
        }

        /// <summary>
        /// 获取控件中单元格的信息
        /// 鼠标选中想要获取的单元格,点击获取信息按钮,文本框就会显示单元格信息
        /// </summary>
        private void Button1_Click(object sender, EventArgs e)
        {
            string msg_ = String.Format("第{0}行,第{1}列", dataGridView1.CurrentCell.RowIndex,dataGridView1.CurrentCell.ColumnIndex);
            textBox1.Text = "选择的单元格为:" + msg_;
        }
    }
}

(2)生成效果

2.通过EF实体模型访问SQL

(1)源码

//Form1.cs
//EF获取控件单元格信息
using _02_1;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace _02_1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 初始化Form1    
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "获取单元格信息:";
            button1.Size = new Size(110, 23);
            textBox1.Size = new Size(200, 21);

            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.AllowUserToDeleteRows = false;
            dataGridView1.AllowUserToResizeColumns = false;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.ReadOnly = true;
            dataGridView1.RowHeadersVisible = false;

            using (db_EMSEntities db_ = new db_EMSEntities())
            {
                dataGridView1.DataSource = db_.tb_CNStudent.ToList();
            };
        }

        /// <summary>
        /// 获取单元格信息
        /// Format{}中“”是格式字符串,逗号前=当前行,逗号后=当前列
        /// </summary>
        private void Button1_Click(object sender, EventArgs e)
        {
            string msg_ = String.Format("第{0}行,第{1}列", dataGridView1.CurrentCell.RowIndex, dataGridView1.CurrentCell.ColumnIndex);
            textBox1.Text = "选择的单元格为:" + msg_;
        }
    }
}

(2)生成效果

         生成效果与上述方法相同。但通过EF实体模型访问数据库更简单。

三、DataGridView控件中修改数据

 1.直接编程访问SQL

        在DataGridView控件中修改数据,主要用到DataTable的ImportRow()方法和DataAdapter对象的Update()方法。实现的过程是通过DataTable的ImportRow()方法将更改后的数据复制到一个DataTable中,然后通过DataAdapter对象的Update()方法,将DataTable中的数据更新到数据库中。ImportRow()方法用于将DataRow复制到DataTable中,保留任何属性设置以及初始值和当前值

语法如下:
public void ImportRow(DataRow row)
row:要导入的DataRow。 
或
void DataTable.ImportRow(DataRow row);
将DataRow复制到DataTable中,保留任何属性设置、初始值和当前值。

(1)源码

//Form1.cs
//在DataGridView控件中修改数据,然后进行批量更新
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;

namespace _03
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SqlConnection _Conn;
        SqlDataAdapter _Adapter;
        int _CurIndex;

        /// <summary>
        /// 初始化Form1并加载SQL数据表
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "提交修改";
            button1.Size = new Size(70, 23);

            dataGridView1.AllowUserToAddRows = true;
            dataGridView1.AllowUserToDeleteRows = true;
            dataGridView1.AllowUserToResizeColumns = false;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.ReadOnly = false;
            dataGridView1.RowHeadersVisible = false;
            dataGridView1.ColumnHeadersVisible = true;

            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;  //全行选中
            dataGridView1.DefaultCellStyle.SelectionBackColor = Color.Red;          //选中行红色背景

            //_Conn = new SqlConnection("Server=DESKTOP-GFMO83R;integrated security=SSPI;Initial Catalog=db_EMS");
            _Conn = new SqlConnection("Server=DESKTOP-QFENBNJ\\SQL_WEN;integrated security=SSPI;Initial Catalog=db_EMS");
            SqlDataAdapter sda = new SqlDataAdapter("select*from tb_CNStudent", _Conn);
            DataSet ds = new DataSet();
            sda.Fill(ds);
            dataGridView1.DataSource = ds.Tables[0];     
        }

        /// <summary>
        /// 按下按钮,调用dbUpdate(),为真则消息提示=成功
        /// </summary>
        private void Button1_Click(object sender, EventArgs e)
        {
            if (DbUpdate())
            {
                MessageBox.Show("修改成功!");
            }
        }

        /// <summary>
        /// 功能:自定义更新数据库函数DbUpdate(),更新成功返回true否则返回false
        /// 功能:只能对同一行内的单元格进行修改。多行修改,只有最后一行修改的内容会复制到SQL
        /// 功能:其前面的行的修改都是虚假修改,不会复制到SQL。退出重启后修改不见。
        /// 虽然VS提示CommandBuiler没有用,但实际不可或缺
        /// 提交自上次调用DataTable.AcceptChanges()以来对该表进行的所有更改,更改到数据表
        /// </summary>
        /// <returns>
        /// 调用Dbconn()的结果=dtSelect,是Fill()方法填充的数据表DataTable
        /// </returns>
        private Boolean DbUpdate()
        {
            string strSQL = "select * from tb_CNStudent";
            DataTable dtUpdate = Dbconn(strSQL);                    //创建数据表dtUpdate,其内容为dtSelect
            DataTable dtShow = (DataTable)dataGridView1.DataSource; //获取DataGridView所显示数据复制为数据表dtShow
            dtUpdate.ImportRow(dtShow.Rows[_CurIndex]);             //把dtShow当前行属性、值复制到dtUpdate中
            SqlCommandBuilder CommandBuiler = new SqlCommandBuilder(_Adapter);//适配器沟通SQL的变量
            _Adapter.Update(dtUpdate);  //对dtUpdate的已修改,Update到数据库
            dtUpdate.AcceptChanges();   //所有修改更新到数据表dtUpdate
            return true;
        }

        /// <summary>
        /// 功能:返回一个已填充的数据表对象DataTable dtSelect
        /// 建立DataTable的方法 Dbconn():
        /// 打开SQL连接
        /// 带入实参新建适配器对象dtSelect
        /// Fill()方法填充dtSelect
        /// 关闭SQL连接
        /// </summary>
        /// <param name="strSQL">
        ///  Dbconn()形参由DbUpdate()函数的实参带入
        /// </param>
        /// <returns>
        /// 返回dtSelect,是Fill()方法填充的数据表DataTable
        /// </returns>
        private DataTable Dbconn(string strSQL)
        {
            _Conn.Open ();
            _Adapter = new SqlDataAdapter(strSQL, _Conn);
            DataTable dtSelect = new DataTable();
            _Adapter.Fill(dtSelect);
            _Conn.Close();
            return dtSelect;
        }

        /// <summary>
        /// 鼠标的cellclick事件
        /// 鼠标点击cell单元时,触发当前行的索引号_CurIndex
        /// 没有行索引号_CurIndex,提交虚假的修改成功,SSMS更新后发现实际没有修改成功
        /// </summary>
        private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            _CurIndex = e.RowIndex;
        }
    }
}

(2)生成效果 

        以上数据表中单元格内容为null的都应该修改为空或者添加文字,否则生成后当点击含有null的行时就会报警,导致修改失败。取消行中所有的null后,警告消失。

 2.通过EF实体模型访问SQL

(1)源码

        以上面的工程为例,通过EF实体模型访问数据库的,修改数据表中选中行的单元格内容。为了让读者更好地理解EF实体模型访问数据库与SQL编程访问数据库在应用方面的差别,在窗体设计上增加了一些控件,程序段里也增加了测试语句(均有注释)。

//Form1.cs测试用
//通过EF实体模型访问数据库的,修改数据表
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Entity;
using System.Drawing;
using System.Linq;
using System.Net.NetworkInformation;
using System.Runtime.Serialization.Json;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _03_1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public int _ID;
        public int _RowIndex;
        public string[,] _CellContext;

        /// <summary>
        /// 初始化Form1
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "提交修改";
            button1.Size = new Size(70, 23);

            dataGridView1.AllowUserToAddRows = true;
            dataGridView1.AllowUserToDeleteRows = true;
            dataGridView1.AllowUserToResizeColumns = false;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.ReadOnly = false;
            dataGridView1.RowHeadersVisible = false;
            dataGridView1.ColumnHeadersVisible = true;

            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;          //全行选中
            dataGridView1.DefaultCellStyle.SelectionBackColor = Color.Red;                              //选中行红色背景                                                                                    

            using (db_EMSEntities db_ = new db_EMSEntities())
            {
                dataGridView1.DataSource = db_.tb_CNStudent.ToList();
                dataGridView1.Columns[3].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";   //显示秒数格式 
            };
        }

        /// <summary>
        /// 按下按键,执行修改
        /// 如果实例表不为空,则对选中行的cell执行修改
        /// 主键cell不能修改
        /// 如果实例是空表,其修改就用Add()方法增加到数据库
        /// </summary>
        private void Button1_Click(object sender, EventArgs e)
        {
            using (db_EMSEntities db_ = new db_EMSEntities())
            {              
               tb_CNStudent _CNStudent =db_.tb_CNStudent.Where(W => W.学生编号 == _ID).FirstOrDefault();    //获取指定编号学生信息 
                if (_CNStudent!=null)
                {
                    db_.tb_CNStudent.Attach(_CNStudent);
                    textBox1.Text = dataGridView1.Rows[_RowIndex].Cells[1].Value.ToString();         //测试 

                    _CNStudent.学生编号 = Convert.ToInt32(dataGridView1.Rows[_RowIndex].Cells[0].Value.ToString());
                    _CNStudent.学生姓名 = dataGridView1.Rows[_RowIndex].Cells[1].Value.ToString();
                    _CNStudent.性别 = dataGridView1.Rows[_RowIndex].Cells[2].Value.ToString();

                    string _Str = dataGridView1.Rows[_RowIndex].Cells[3].Value.ToString();
                    string _DateStr = Convert.ToDateTime(_Str).ToString("yyyy-MM-dd HH:mm:ss");
                    textBox13.Text = _DateStr;                                                                            //测试时间格式

                    _CNStudent.出生年月 = DateTime.ParseExact(_DateStr, "yyyy-MM-dd HH:mm:ss", null);

                    _CNStudent.年龄 = (int)dataGridView1.Rows[_RowIndex].Cells[4].Value;         //等效语句
                    //_CNStudent.年龄 = Convert.ToInt32(dataGridView1.Rows[_RowIndex].Cells[4].Value.ToString());
                    _CNStudent.所在学院 = dataGridView1.Rows[_RowIndex].Cells[5].Value.ToString();
                    _CNStudent.所学专业 = dataGridView1.Rows[_RowIndex].Cells[6].Value.ToString();
                    _CNStudent.家庭住址 = dataGridView1.Rows[_RowIndex].Cells[7].Value.ToString();
                    _CNStudent.统招否 = (bool)dataGridView1.Rows[_RowIndex].Cells[8].Value;//等效语句
                   //_CNStudent.统招否 = Convert.ToBoolean(dataGridView1.Rows[_RowIndex].Cells[8].Value.ToString());
                    _CNStudent.备注信息 = dataGridView1.Rows[_RowIndex].Cells[9].Value.ToString();
                    
                    db_.Entry(_CNStudent).Property("学生编号").IsModified = true;
                    db_.Entry(_CNStudent).Property(_ => _.学生姓名).IsModified = true;         //等效语句
                    db_.Entry(_CNStudent).Property(_ => _.性别).IsModified = true;                //等效语句
                    db_.Entry(_CNStudent).Property("出生年月").IsModified = true;                 //依此类推
                    db_.Entry(_CNStudent).Property("年龄").IsModified = true;
                    db_.Entry(_CNStudent).Property("所在学院").IsModified = true;
                    db_.Entry(_CNStudent).Property("所学专业").IsModified = true;
                    db_.Entry(_CNStudent).Property("家庭住址").IsModified = true;
                    db_.Entry(_CNStudent).Property("统招否").IsModified = true;
                    db_.Entry(_CNStudent).Property("备注信息").IsModified = true;

                    db_.SaveChanges();
                    dataGridView1.DataSource = db_.tb_CNStudent.ToList();
                }               
                else 
                {
                    db_.tb_CNStudent.Add(_CNStudent);
                    db_.SaveChanges();
                    dataGridView1.DataSource = db_.tb_CNStudent.ToList();
                }
            }
        }

        /// <summary>
        /// 点击单元格事件
        /// 定义单元格二维数组,全局变量,并由选中行的EF实体模型单元格的内容给赋值
        /// </summary>
        private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            _CellContext = new string[dataGridView1.Rows.Count, dataGridView1.Columns.Count];
            _ID = Convert.ToInt32(dataGridView1[0, e.RowIndex].Value);                                                                  //获取选中行的编号
            _RowIndex = dataGridView1.CurrentRow.Index;
            textBox12.Text = _RowIndex.ToString();                                                                                                  //测试行号
            using (db_EMSEntities db_ = new db_EMSEntities())
            {
                tb_CNStudent _CNStudent = db_.tb_CNStudent.Where(W => W.学生编号 == _ID).FirstOrDefault();  //获取指定编号学生信息 
                //_CellContext[_RowIndex, 0] = dataGridView1.Rows[_RowIndex].Cells[0].Value.ToString();                 //等效语句
                _CellContext[_RowIndex, 0] = _ID.ToString();                                                                                    //等效语句
                //_CellContext[_RowIndex, 0] = _CNStudent.学生编号.ToString();                                                      //等效语句
                _CellContext[_RowIndex, 1] = _CNStudent.学生姓名.ToString();
                _CellContext[_RowIndex, 2] = _CNStudent.性别.ToString();
                //_CellContext[_RowIndex, 3] = _CNStudent.出生年月.ToString(); //格式不标准1991/2/12 0:00:00
                _CellContext[_RowIndex, 3] = Convert.ToDateTime(_CNStudent.出生年月).ToString("yyyy-MM-dd HH:mm:ss");       //格式标准
                //string _DateStr = dataGridView1.Rows[_RowIndex].Cells[3].Value.ToString();                                                          //标准格式等价语句
                //Convert.ToDateTime(_DateStr).ToString("yyyy-MM-dd HH:mm:ss");
                _CellContext[_RowIndex, 4] = _CNStudent.年龄.ToString();
                _CellContext[_RowIndex, 5] = _CNStudent.所在学院.ToString();
                _CellContext[_RowIndex, 6] = _CNStudent.所学专业.ToString();
                _CellContext[_RowIndex, 7] = _CNStudent.家庭住址.ToString();
                _CellContext[_RowIndex, 8] = _CNStudent.统招否.ToString();
                _CellContext[_RowIndex, 9] = _CNStudent.备注信息.ToString();

                textBox2.Text = _CellContext[_RowIndex, 0];
                textBox3.Text = _CellContext[_RowIndex, 1];
                textBox4.Text = _CellContext[_RowIndex, 2];
                textBox5.Text = _CellContext[_RowIndex, 3];
                textBox6.Text = _CellContext[_RowIndex, 4];
                textBox7.Text = _CellContext[_RowIndex, 5];
                textBox8.Text = _CellContext[_RowIndex, 6];
                textBox9.Text = _CellContext[_RowIndex, 7];
                textBox10.Text = _CellContext[_RowIndex, 8];
                textBox11.Text = _CellContext[_RowIndex, 9];

                string _Str = dataGridView1.Rows[_RowIndex].Cells[3].Value.ToString();                   //测试
                string _DateStr = Convert.ToDateTime(_Str).ToString("yyyy-MM-dd HH:mm:ss");
                textBox13.Text = _DateStr;                                                                                      //测试时间格式
            }
        }
    }
}

         源码中,第4列,出生年月,编程时和修改时要注意格式一致,有一点不一致也不会放过你的,会报警。

        按钮按下后的[行,列]值是修改后的内容,读取数据表的是修改前的内容,编程时一定要注意区别,否则也会出现警告,不让你修改SQL。

        正常设计时,不必设计DataGridView1_CellClick()。所有全局变量定义放到Button1_Click()中,取消所有测试用语句和等效语句,EF实体模型访问SQL的程序会更简便易懂。

(2)生成效果

        Form1.cs[设计] 

        DEBUG生成 ,选中行3,修改各cell:张*飞哥哥,男子汉,2023-12-25 00:00:00,35,机电工程学院,车辆工程,吉林省长春市(不变),true,全日制。

         各个cell,想修改那个就修改哪个,不必全都修改。都不修改就不更新SQL。

         对应更新SQL后的效果。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/107980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1024 云上见 · 上云挑战(ChatGPT搭建)

【玩转1024】使用函数计算X通义千问搭建AI助手&#xff0c;参与1024小说创作大赛 【使用函数计算X通义千问搭建AI助手&#xff0c;参与小说创作大赛】&#xff1a;本活动基于函数计算X 通义千问快速部署 AI 个人助手应用&#xff0c;用户可以根据需要选择不同角色的AI助手开启…

刀具磨损状态识别(Python代码,MSCNN_LSTM_Attention模型,初期磨损、正常磨损和急剧磨损分类,解压缩直接运行)

1.运行效果&#xff1a;刀具磨损状态识别&#xff08;Python代码&#xff0c;MSCNN_LSTM_Attention模型&#xff0c;初期磨损、正常磨损和急剧磨损&#xff09;_哔哩哔哩_bilibili 环境库&#xff1a; NumPy 版本: 1.19.4 Pandas 版本: 0.23.4 Matplotlib 版本: 2.2.3 Keras …

【C语言】【goto语句】复习捡拾~

goto语句可以在同一个函数内跳转到设定好的位置&#xff1a; #include<stdio.h> int main() {printf("hello world\n");goto next;printf("hehe"); next:printf("leap here\n");return 0; }goto 语句如果使⽤的不当&#xff0c;就会导致在…

构建外卖小程序:技术要点和实际代码

1. 前端开发 前端开发涉及用户界面设计和用户交互。HTML、CSS 和 JavaScript 是构建外卖小程序界面的主要技术。 <!-- HTML 结构示例 --> <header><h1>外卖小程序</h1><!-- 其他导航元素 --> </header> <main><!-- 菜单显示 -…

vm_flutter

附件地址 https://buuoj.cn/match/matches/195/challenges#vm_flutter 可以在buu下载到。 flutter我也不会&#xff0c;只是这个题目加密算法全部在java层&#xff0c;其实就是一个异或和相加。 反编译 package k;import java.util.Stack;/* loaded from: classes.dex */ pu…

【Linux】部署单机项目以及前后端分离项目

Linux部署单机项目&#xff1a; 优点&#xff1a; 简化了系统管理&#xff1a;由于所有服务都在同一台机器上运行&#xff0c;因此可以简化系统管理和维护。 提高了性能&#xff1a;由于没有网络延迟和其他因素的影响&#xff0c;所以可以提高系统的性能。 缺点&#xff1a; 容…

SSH安全登录远程主机

SSH服务器简介 SSH即Security SHell的意思&#xff0c;它可以将连线的封包进行加密技术&#xff0c;之后进行传输&#xff0c;因此相当的安全。 SSH是一种协议标准&#xff0c;其目的是实现安全远程登录以及其它安全网络服务。 SSH协定&#xff0c;在预设的状态下&#xff0c;…

系统架构设计师之系统应用集成

应用集成是指两个或多个应用系统根据业务逻辑的需要而进行的功能之间的相互调用和互操作。应用集成需要在数据集成的基础上完成。应用集成在底层的网络集成和数据集成的基础上实现异构应用系统之间语用层次上的互操作。它们共同构成了实现企业集成化运行最顶层会聚臭成所需要的…

开源利器:it-tools 项目介绍

作为一名开发人员&#xff0c;我们在日常工作和学习中常常需要使用一系列小工具&#xff0c;如JSON格式化、JSON转表格、当前时间戳、XML格式化、SQL格式化、密码生成以及UUID生成等。通常情况下&#xff0c;我们会在网上搜索各种在线工具来满足这些需求。然而&#xff0c;这些…

私有云:【2】AD域的安装

私有云&#xff1a;【2】AD域的安装 1、使用vmwork创建虚拟机2、启动配置虚拟机3、安装域服务4、配置域服务器 1、使用vmwork创建虚拟机 新建虚拟机 稍后安装操作系统 选择win2012&#xff0c;如下图 设置名称及路径 分配硬盘大小&#xff0c;默认60G即可 镜像选择win2012的is…

【网安AIGC专题10.19】论文6:Java漏洞自动修复+数据集 VJBench+大语言模型、APR技术+代码转换方法+LLM和DL-APR模型的挑战与机会

How Effective Are Neural Networks for Fixing Security Vulnerabilities 写在最前面摘要贡献发现 介绍背景&#xff1a;漏洞修复需求和Java漏洞修复方向动机方法贡献 数据集先前的数据集和Java漏洞Benchmark数据集扩展要求数据处理工作最终数据集 VJBenchVJBench 与 Vul4J 的…

SSM度假村管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 度假村管理系统是一套完善的信息系统&#xff0c;结合SSM框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要 采用B/S模式开发…

系列二十五、@Configuration的作用及解析原理

一、作用 Configuration是用来代替传统的xml的配置方式配置bean的。 二、不加Configuration注解不能配置bean吗 能。 三、加与不加的区别 3.1、区别 加了Configuration注解&#xff0c;会为配置类创建cglib动态代理&#xff0c;Bean方法的调用就会通过容器getBean进行获取…

七层负载均衡 HAproxy

一、HAproxy 1、负载均衡类型&#xff1a; (1) 无负载均衡&#xff1a; 没有负载均衡&#xff0c;用户直接连接到 Web 服务器。当许多用户同时访问服务器时&#xff0c;可能无法连接。 (2) 四层负载均衡&#xff1a; 用户访问负载均衡器&#xff0c;负载均衡器将用户的请求…

深入探究深度学习、神经网络与卷积神经网络以及它们在多个领域中的应用

目录 1、什么是深度学习&#xff1f; 2、深度学习的思想 3、深度学习与神经网络 4、深度学习训练过程 4.1、先使用自下上升非监督学习&#xff08;就是从底层开始&#xff0c;一层一层的往顶层训练&#xff09; 4.2、后自顶向下的监督学习&#xff08;就是通过带标签的数…

毅速丨金属3D打印能替代传统制造吗?

金属3D打印技术已经逐渐被很多行业认可和应用&#xff0c;但是目前&#xff0c;金属3D打印多数被作为传统制造技术的一种补充&#xff0c;暂时还不能完全替代传统制造。 金属3D打印使用的是金属粉末进行选择性激光烧结&#xff0c;打印时在成型缸里铺上金属粉末&#xff0c;打印…

2023-10-27 LeetCode每日一题(切割后面积最大的蛋糕)

2023-10-27每日一题 一、题目编号 1465. 切割后面积最大的蛋糕二、题目链接 点击跳转到题目位置 三、题目描述 矩形蛋糕的高度为 h 且宽度为 w&#xff0c;给你两个整数数组 horizontalCuts 和 verticalCuts&#xff0c;其中&#xff1a; horizontalCuts[i] 是从矩形蛋糕…

牛客题霸 -- HJ52 计算字符串的编辑距离

解题步骤&#xff1a; 参考代码&#xff1a; int main() {string s1;string s2;while (cin >> s1 >> s2){int ms1.size();int ns2.size();//增加空白字符&#xff0c;修正下标的映射关系s1 s1;s2 s2;//多卡一行&#xff0c;多开一列vector<vector<int&…

stable-diffusion-ui 下载和安装

简介 Stable Diffusion Web UI是一款基于Stable Diffusion基础应用的交互程序&#xff0c;它利用gradio模块搭建而成。这个模块除了具有txt2img、img2img等基本功能外&#xff0c;还包含许多模型融合改进、图片质量修复等附加升级。所有这些功能都可以通过易于使用的Web应用程…

C语言二、八、十六进制转换

二进制转八进制、十六进制 二进制转八进制&#xff1a; 三合一法&#xff1a; 从低位到高位&#xff0c;每 3 给二进制组成 1 位八进制数据&#xff0c;高位不够三位用 0 填补&#xff0c;将二进制转为对应的八进制数即可 二进制转十六进制&#xff1a; 四合一法&#xff1a;…