WPF高級 | WPF 與數據庫交互:連接、查詢與數據更新

在這里插入圖片描述
在這里插入圖片描述

WPF高級 | WPF 與數據庫交互:連接、查詢與數據更新

  • 前言
  • 一、數據庫交互基礎概念
    • 1.1 數據庫簡介
    • 1.2 數據訪問技術
  • 二、WPF 與數據庫連接
    • 2.1 連接字符串
    • 2.2 建立連接
  • 三、WPF 中的數據查詢
    • 3.1 使用ADO.NET進行數據查詢
    • 3.2 使用 Entity Framework 進行數據查詢
    • 3.3 使用 Dapper 進行數據查詢
  • 四、WPF 中的數據更新
    • 4.1 使用ADO.NET進行數據更新
    • 4.2 使用 Entity Framework 進行數據更新
    • 4.3 使用 Dapper 進行數據更新
  • 五、數據綁定與顯示
    • 5.1 將查詢結果綁定到 WPF 控件
    • 5.2 實現數據的實時更新顯示
  • 六、錯誤處理與事務
    • 6.1 錯誤處理
    • 6.2 事務處理
  • 七、總結
  • 結束語
  • 優質源碼分享

WPF高級 | WPF 與數據庫交互:連接、查詢與數據更新 ,在現代應用程序開發中,數據的存儲和管理至關重要。Windows Presentation Foundation(WPF)作為一款強大的圖形界面開發框架,常常需要與數據庫進行交互,以實現數據的持久化存儲、讀取和更新。本文將深入探討 WPF 與數據庫交互的各個方面,包括數據庫連接的建立、數據查詢的執行以及數據更新的操作,并通過豐富的代碼示例和詳細的概念解釋,幫助讀者掌握這一關鍵技術。

前言

????在數字浪潮洶涌澎湃的時代,程序開發宛如一座神秘而宏偉的魔法城堡,矗立在科技的浩瀚星空中。代碼的字符,似那閃爍的星辰,按照特定的軌跡與節奏,組合、交織、碰撞,即將開啟一場奇妙且充滿無限可能的創造之旅。當空白的文檔界面如同深邃的宇宙等待探索,程序員們則化身無畏的星辰開拓者,指尖在鍵盤上輕舞,準備用智慧與邏輯編織出足以改變世界運行規則的程序畫卷,在 0 和 1 的二進制世界里,鐫刻下屬于人類創新與突破的不朽印記。

????在當今數字化時代,桌面應用程序的用戶界面(UI)設計至關重要,它直接影響著用戶體驗與產品的競爭力。而 WPF(Windows Presentation Foundation)作為微軟推出的一款強大的 UI 框架,其布局系統更是構建精美界面的核心要素。WPF 布局系統為開發者提供了豐富多樣的布局方式,能夠輕松應對各種復雜的界面設計需求,無論是簡潔明了的工具軟件,還是功能繁雜的企業級應用,都能借助其打造出令人驚艷的視覺效果與流暢的交互體驗。

????WPF從入門到精通專欄,旨在為讀者呈現一條從對 WPF(Windows Presentation Foundation)技術懵懂無知到精通掌握的學習路徑。首先從基礎入手,介紹 WPF 的核心概念,涵蓋其獨特的架構特點、開發環境搭建流程,詳細解讀布局系統、常用控件以及事件機制等基礎知識,幫助初學者搭建起對 WPF 整體的初步認知框架。隨著學習的深入,進階部分聚焦于數據綁定、樣式模板、動畫特效等關鍵知識點,進一步拓展 WPF 開發的能力邊界,使開發者能夠打造出更為個性化、交互性強的桌面應用界面。高級階段則涉及自定義控件開發、MVVM 設計模式應用、多線程編程等深層次內容,助力開發者應對復雜的業務需求,構建大型且可維護的應用架構。同時,通過實戰項目案例解析,展示如何將所學知識綜合運用到實際開發中,從需求分析到功能實現再到優化測試,全方位積累實踐經驗。此外,還探討了性能優化、與其他技術集成以及安全機制等拓展性話題,讓讀者對 WPF 技術在不同維度有更深入理解,最終實現對 WPF 技術的精通掌握,具備獨立開發高質量桌面應用的能力。

🛕 點擊進入WPF從入門到精通專欄

在這里插入圖片描述

一、數據庫交互基礎概念

1.1 數據庫簡介

????數據庫是按照數據結構來組織、存儲和管理數據的倉庫。常見的數據庫管理系統(DBMS)有 SQL Server、MySQL、Oracle 等。在 WPF 應用中,選擇合適的數據庫取決于項目的需求,如數據量大小、性能要求、成本等因素。例如,SQL Server 是微軟的關系型數據庫,與.NET 框架集成度高,適合企業級應用;MySQL 是開源的關系型數據庫,成本低,性能較好,廣泛應用于各種規模的項目。

1.2 數據訪問技術

????在.NET 開發中,有多種數據訪問技術可用于 WPF 與數據庫交互,常見的有ADO.NET、Entity Framework 和 Dapper。

????ADO.NET:是.NET Framework 中用于訪問數據的基本技術,它提供了一組用于與各種數據源進行交互的類,包括數據庫、文件系統等。ADO.NET主要由 Connection、Command、DataReader、DataAdapter 等對象組成。例如,使用ADO.NET連接 SQL Server 數據庫:

using System.Data.SqlClient;string connectionString = "Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD";
using (SqlConnection connection = new SqlConnection(connectionString))
{connection.Open();// 在這里執行數據庫操作
}

????Entity Framework:是一種對象關系映射(ORM)框架,它允許開發者使用.NET 對象來操作數據庫,而無需編寫大量的 SQL 語句。Entity Framework 會自動將對象的操作轉換為對應的 SQL 語句。例如,使用 Entity Framework 創建一個簡單的數據庫上下文:

using System.Data.Entity;public class MyDbContext : DbContext
{public DbSet<Product> Products { get; set; }
}public class Product
{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }
}

????Dapper:是一個輕量級的 ORM 框架,它在性能上表現出色,適用于對性能要求較高的場景。Dapper 主要通過SqlMapper類來執行 SQL 語句,并將結果映射到對象。例如,使用 Dapper 查詢數據:

using Dapper;
using System.Data.SqlClient;string connectionString = "Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD";
using (SqlConnection connection = new SqlConnection(connectionString))
{var products = connection.Query<Product>("SELECT * FROM Products").ToList();
}

二、WPF 與數據庫連接

2.1 連接字符串

????連接字符串是用于建立與數據庫連接的關鍵信息,它包含了數據庫服務器地址、數據庫名稱、用戶名、密碼等信息。連接字符串的格式因數據庫類型而異。例如,SQL Server 的連接字符串格式如下:

Data Source=服務器名稱;Initial Catalog=數據庫名稱;User ID=用戶名;Password=密碼

????MySQL 的連接字符串格式如下:

server=服務器地址;database=數據庫名稱;uid=用戶名;pwd=密碼;

????在 WPF 應用中,可以將連接字符串存儲在配置文件(如app.config或web.config)中,以便于管理和修改。例如,在app.config中添加連接字符串:

<configuration><connectionStrings><add name="MyConnectionString" connectionString="Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD" providerName="System.Data.SqlClient" /></connectionStrings>
</configuration>

????在代碼中讀取連接字符串:

string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

2.2 建立連接

????使用ADO.NET建立連接:通過SqlConnection類(針對 SQL Server)或其他數據庫對應的連接類來建立連接。

using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{try{connection.Open();MessageBox.Show("連接成功!");}catch (Exception ex){MessageBox.Show("連接失敗:" + ex.Message);}
}

????使用 Entity Framework 建立連接:在創建DbContext實例時,Entity Framework 會根據配置文件中的連接字符串自動建立連接。

using System.Data.Entity;public class MyDbContext : DbContext
{public MyDbContext() : base("name=MyConnectionString"){}public DbSet<Product> Products { get; set; }
}在使用時:
using (MyDbContext context = new MyDbContext())
{// 在這里執行數據庫操作
}

三、WPF 中的數據查詢

3.1 使用ADO.NET進行數據查詢

????使用 SqlDataReader 讀取數據:SqlDataReader是一種快速、只進的讀取器,用于從數據庫中讀取數據。

using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{string query = "SELECT * FROM Products";using (SqlCommand command = new SqlCommand(query, connection)){connection.Open();using (SqlDataReader reader = command.ExecuteReader()){while (reader.Read()){int id = reader.GetInt32(0);string name = reader.GetString(1);decimal price = reader.GetDecimal(2);// 處理讀取到的數據}}}
}

????使用 DataSet 和 DataAdapter 填充數據:DataSet是一個內存中的數據緩存,DataAdapter用于在數據庫和DataSet之間進行數據傳輸。

using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{string query = "SELECT * FROM Products";using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection)){DataSet dataSet = new DataSet();adapter.Fill(dataSet, "Products");// 處理dataSet中的數據}
}

3.2 使用 Entity Framework 進行數據查詢

????Entity Framework 提供了 LINQ to Entities 查詢語法,使得查詢操作更加簡潔和直觀。

using (MyDbContext context = new MyDbContext())
{var products = from p in context.Productswhere p.Price > 100orderby p.Nameselect p;foreach (var product in products){// 處理查詢結果}
}

????還可以使用 Lambda 表達式進行查詢:

using (MyDbContext context = new MyDbContext())
{var products = context.Products.Where(p => p.Price > 100).OrderBy(p => p.Name).ToList();foreach (var product in products){// 處理查詢結果}
}

3.3 使用 Dapper 進行數據查詢

????Dapper 的查詢操作基于 SQL 語句,通過Query方法執行查詢并將結果映射到對象。

using Dapper;
using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{string query = "SELECT * FROM Products WHERE Price > @Price";var products = connection.Query<Product>(query, new { Price = 100 }).ToList();foreach (var product in products){// 處理查詢結果}
}

四、WPF 中的數據更新

4.1 使用ADO.NET進行數據更新

????使用 SqlCommand 執行更新語句:通過SqlCommand的ExecuteNonQuery方法執行 SQL 更新語句。

using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{string updateQuery = "UPDATE Products SET Price = @NewPrice WHERE Id = @Id";using (SqlCommand command = new SqlCommand(updateQuery, connection)){command.Parameters.AddWithValue("@NewPrice", 150.0m);command.Parameters.AddWithValue("@Id", 1);connection.Open();int rowsAffected = command.ExecuteNonQuery();if (rowsAffected > 0){MessageBox.Show("數據更新成功!");}else{MessageBox.Show("數據更新失敗!");}}
}

????使用 DataAdapter 更新 DataSet 并同步到數據庫:先修改DataSet中的數據,然后通過DataAdapter的Update方法將更改同步到數據庫。

using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{string query = "SELECT * FROM Products";using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection)){SqlCommandBuilder builder = new SqlCommandBuilder(adapter);DataSet dataSet = new DataSet();adapter.Fill(dataSet, "Products");DataRow row = dataSet.Tables["Products"].Rows[0];row["Price"] = 150.0m;adapter.Update(dataSet, "Products");}
}

4.2 使用 Entity Framework 進行數據更新

????修改實體對象并保存更改:在 Entity Framework 中,修改實體對象的屬性,然后調用SaveChanges方法保存更改。

using (MyDbContext context = new MyDbContext())
{var product = context.Products.FirstOrDefault(p => p.Id == 1);if (product!= null){product.Price = 150.0m;context.SaveChanges();MessageBox.Show("數據更新成功!");}else{MessageBox.Show("未找到要更新的數據!");}
}

????使用 DbSet 的 Attach 和 Entry 方法更新:對于從其他地方獲取的實體對象,可以使用Attach方法將其附加到上下文,然后使用Entry方法標記屬性的更改狀態。

using (MyDbContext context = new MyDbContext())
{var product = new Product { Id = 1, Name = "Product Name", Price = 150.0m };context.Products.Attach(product);context.Entry(product).Property(p => p.Price).IsModified = true;context.SaveChanges();
}

4.3 使用 Dapper 進行數據更新

????Dapper 通過Execute方法執行 SQL 更新語句。

using Dapper;
using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{string updateQuery = "UPDATE Products SET Price = @NewPrice WHERE Id = @Id";int rowsAffected = connection.Execute(updateQuery, new { NewPrice = 150.0m, Id = 1 });if (rowsAffected > 0){MessageBox.Show("數據更新成功!");}else{MessageBox.Show("數據更新失敗!");}
}

五、數據綁定與顯示

5.1 將查詢結果綁定到 WPF 控件

????在 WPF 中,可以將數據庫查詢結果綁定到各種控件,如ListView、DataGrid等。

????使用 ListView 顯示數據:首先創建一個包含數據的集合,然后將其綁定到ListView的ItemsSource屬性。

<ListView x:Name="ProductListView"><ListView.View><GridView><GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}"/><GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/><GridViewColumn Header="Price" DisplayMemberBinding="{Binding Price}"/></GridView></ListView.View>
</ListView>using (MyDbContext context = new MyDbContext())
{var products = context.Products.ToList();ProductListView.ItemsSource = products;
}

使用 DataGrid 顯示數據:DataGrid提供了更豐富的數據展示和編輯功能。

<DataGrid x:Name="ProductDataGrid" AutoGenerateColumns="True"/>using (MyDbContext context = new MyDbContext())
{var products = context.Products.ToList();ProductDataGrid.ItemsSource = products;
}

5.2 實現數據的實時更新顯示

????當數據庫中的數據發生變化時,為了在 WPF 界面上實時顯示更新,可以使用ObservableCollection結合數據綁定。ObservableCollection是一個動態數據集合,當集合中的元素發生變化時,會自動通知綁定的 UI 元素進行更新。

public class ProductViewModel : INotifyPropertyChanged
{private ObservableCollection<Product> _products;public ObservableCollection<Product> Products{get { return _products; }set{_products = value;OnPropertyChanged(nameof(Products));}}public ProductViewModel(){LoadProducts();}private void LoadProducts(){using (MyDbContext context = new MyDbContext()){Products = new ObservableCollection<Product>(context.Products.ToList());}}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

????在 XAML 中綁定:

<Window.DataContext><local:ProductViewModel/>
</Window.DataContext>
<DataGrid x:Name="ProductDataGrid" ItemsSource="{Binding Products}"/>

????當數據更新后,重新加載數據并更新ObservableCollection,界面會自動刷新顯示最新數據。

六、錯誤處理與事務

6.1 錯誤處理

????在與數據庫交互過程中,可能會出現各種錯誤,如連接失敗、查詢語法錯誤、數據更新沖突等。合理的錯誤處理可以提高應用程序的穩定性和用戶體驗。

????使用 try - catch 塊捕獲異常:在執行數據庫操作時,使用try - catch塊捕獲可能出現的異常,并進行相應的處理。

using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{try{string query = "SELECT * FROM Products";using (SqlCommand command = new SqlCommand(query, connection)){connection.Open();using (SqlDataReader reader = command.ExecuteReader()){while (reader.Read()){// 處理數據}}}}catch (SqlException ex){MessageBox.Show("數據庫操作錯誤:" + ex.Message);}catch (Exception ex){MessageBox.Show("其他錯誤:" + ex.Message);}
}

????記錄錯誤日志:將錯誤信息記錄到日志文件中,以便后續分析和排查問題。可以使用第三方日志庫,如 Log4Net。

using log4net;
using System.Data.SqlClient;private static readonly ILog log = LogManager.GetLogger(typeof(YourClassName));string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{try{// 數據庫操作}catch (SqlException ex){log.Error("數據庫操作錯誤", ex);MessageBox.Show("數據庫操作錯誤:" + ex.Message);}catch (Exception ex){log.Error("其他錯誤", ex);MessageBox.Show("其他錯誤:" + ex.Message);}
}

6.2 事務處理

????事務是一組數據庫操作的集合,這些操作要么全部成功執行,要么全部回滾。在 WPF 與數據庫交互中,事務處理尤為重要,特別是在涉及多個相互關聯的數據更新操作時,它能確保數據的完整性和一致性。例如,在一個銀行轉賬操作中,需要同時從轉出賬戶扣除金額并向轉入賬戶增加金額,這兩個操作必須作為一個事務來處理,否則可能導致數據不一致,出現金額丟失或錯誤增加的情況。

1. 使用ADO.NET處理事務

????在ADO.NET中,可以通過SqlTransaction類來管理事務。以下是一個使用ADO.NET進行事務處理的示例,假設我們要在數據庫中插入一條新的產品記錄,同時更新另一條相關記錄的狀態:

using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{connection.Open();SqlTransaction transaction = connection.BeginTransaction();try{string insertQuery = "INSERT INTO Products (Name, Price) VALUES (@Name, @Price)";using (SqlCommand insertCommand = new SqlCommand(insertQuery, connection, transaction)){insertCommand.Parameters.AddWithValue("@Name", "New Product");insertCommand.Parameters.AddWithValue("@Price", 99.99m);insertCommand.ExecuteNonQuery();}string updateQuery = "UPDATE RelatedRecords SET Status = @Status WHERE ProductId = SCOPE_IDENTITY()";using (SqlCommand updateCommand = new SqlCommand(updateQuery, connection, transaction)){updateCommand.Parameters.AddWithValue("@Status", "Updated");updateCommand.ExecuteNonQuery();}transaction.Commit();MessageBox.Show("操作成功完成!");}catch (Exception ex){transaction.Rollback();MessageBox.Show("操作失敗,已回滾:" + ex.Message);}
}

????在這個示例中,首先通過BeginTransaction方法開始一個事務,然后在事務中執行插入和更新操作。如果所有操作都成功,調用Commit方法提交事務;如果在任何一個操作中出現異常,catch塊會捕獲異常并調用Rollback方法回滾事務,從而確保數據庫的一致性。

2. 使用 Entity Framework 處理事務

????在 Entity Framework 中,事務管理相對簡潔,因為DbContextSaveChanges方法默認是原子操作,即要么所有更改都保存到數據庫,要么都不保存。然而,當需要在多個SaveChanges調用之間進行事務處理時,可以使用TransactionScope類。以下是一個示例:

using System.Transactions;
using (TransactionScope scope = new TransactionScope())
{using (MyDbContext context = new MyDbContext()){var newProduct = new Product { Name = "New Product", Price = 99.99m };context.Products.Add(newProduct);context.SaveChanges();var relatedRecord = context.RelatedRecords.FirstOrDefault(r => r.ProductId == newProduct.Id);if (relatedRecord!= null){relatedRecord.Status = "Updated";context.SaveChanges();}}scope.Complete();
}

????在這個示例中,TransactionScope會自動管理事務的開始、提交和回滾。在TransactionScope塊內的所有DbContext操作都屬于同一個事務。如果所有操作成功完成,調用scope.Complete()方法提交事務;如果出現異常,事務會自動回滾。

3. 使用 Dapper 處理事務
????Dapper 本身沒有內置的事務管理類,但可以利用SqlTransaction來實現事務處理。示例如下:

using Dapper;
using System.Data.SqlClient;string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{connection.Open();SqlTransaction transaction = connection.BeginTransaction();try{string insertQuery = "INSERT INTO Products (Name, Price) VALUES (@Name, @Price)";connection.Execute(insertQuery, new { Name = "New Product", Price = 99.99m }, transaction);string updateQuery = "UPDATE RelatedRecords SET Status = @Status WHERE ProductId = SCOPE_IDENTITY()";connection.Execute(updateQuery, new { Status = "Updated" }, transaction);transaction.Commit();MessageBox.Show("操作成功完成!");}catch (Exception ex){transaction.Rollback();MessageBox.Show("操作失敗,已回滾:" + ex.Message);}
}

????這里通過BeginTransaction開始事務,在Execute方法中傳入transaction參數,確保所有操作都在同一個事務中執行,最后根據操作結果決定是提交還是回滾事務。

七、總結

????通過本文的詳細闡述,我們全面了解了 WPF 與數據庫交互的關鍵技術,涵蓋從數據庫連接、數據查詢、數據更新到數據綁定顯示,以及錯誤處理和事務管理等各個方面。不同的數據訪問技術,如ADO.NET、Entity Framework 和 Dapper,為開發者提供了多樣化的選擇,每種技術都有其獨特的優勢和適用場景。在實際開發中,應根據項目的具體需求,選擇合適的技術和方法來實現高效、穩定的數據庫交互功能。隨著技術的不斷發展,WPF 與數據庫交互的方式也將不斷演進,開發者需要持續關注新技術、新特性,以提升應用程序的數據處理能力和用戶體驗。掌握這些知識和技能,將為構建功能強大、數據驅動的 WPF 應用程序奠定堅實的基礎。

結束語

????????展望未來,WPF 布局系統依然有著廣闊的發展前景。隨著硬件技術的不斷革新,如高分辨率屏幕、折疊屏設備的日益普及,WPF 布局系統有望進一步強化其自適應能力,為用戶帶來更加流暢、一致的體驗。在應對高分辨率屏幕時,能夠更加智能地縮放和布局元素,確保文字清晰可讀、圖像不失真;對于折疊屏設備,可動態調整布局結構,充分利用多屏空間,實現無縫切換。

????????性能優化方面,微軟及廣大開發者社區將持續努力,進一步降低復雜布局的計算開銷,提高布局更新的效率,使得 WPF 應用在處理大規模數據、動態界面時依然能夠保持高效響應。通過改進算法、優化內存管理等手段,讓 WPF 布局系統在性能上更上一層樓。

????????親愛的朋友,無論前路如何漫長與崎嶇,都請懷揣夢想的火種,因為在生活的廣袤星空中,總有一顆屬于你的璀璨星辰在熠熠生輝,靜候你抵達。

???????? 愿你在這紛繁世間,能時常收獲微小而確定的幸福,如春日微風輕拂面龐,所有的疲憊與煩惱都能被溫柔以待,內心永遠充盈著安寧與慰藉。

????????至此,文章已至尾聲,而您的故事仍在續寫,不知您對文中所敘有何獨特見解?期待您在心中與我對話,開啟思想的新交流。


--------------- 業精于勤,荒于嬉 ---------------

請添加圖片描述

--------------- 行成于思,毀于隨 ---------------

優質源碼分享

  • 【百篇源碼模板】html5各行各業官網模板源碼下載

  • 【模板源碼】html實現酷炫美觀的可視化大屏(十種風格示例,附源碼)

  • 【VUE系列】VUE3實現個人網站模板源碼

  • 【HTML源碼】HTML5小游戲源碼

  • 【C#實戰案例】C# Winform貪吃蛇小游戲源碼


在這里插入圖片描述


???? 💞 關注博主 帶你實現暢游前后端

???? 🏰 大屏可視化 帶你體驗酷炫大屏

???? 💯 神秘個人簡介 帶你體驗不一樣得介紹

???? 🎀 酷炫邀請函 帶你體驗高大上得邀請


???? ① 🉑提供云服務部署(有自己的阿里云);
???? ② 🉑提供前端、后端、應用程序、H5、小程序、公眾號等相關業務;
???? 如🈶合作請聯系我,期待您的聯系。
????:本文撰寫于CSDN平臺,作者:xcLeigh所有權歸作者所有) ,https://blog.csdn.net/weixin_43151418,如果相關下載沒有跳轉,請查看這個地址,相關鏈接沒有跳轉,皆是抄襲本文,轉載請備注本文原地址。


???? 親,碼字不易,動動小手,歡迎 點贊 ? 收藏,如 🈶 問題請留言(評論),博主看見后一定及時給您答復,💌💌💌


原文地址:https://blog.csdn.net/weixin_43151418/article/details/145470241(防止抄襲,原文地址不可刪除)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71052.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71052.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71052.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ESP32S3接入訊飛在線語音識別】

【ESP32S3接入訊飛在線語音識別】 1. 前言1.1 步驟概括1.2 硬件介紹1.3 接線2. 操作流程2.1 創建語音識別應用2.2 記錄API秘鑰3. JSON語音接入api3.1 JSON格式3.2 交互流程3.2 ESP32S3 Sense接入代碼1. 核心功能2. 主要模塊3. 工作流程4. 典型應用場景5. 關鍵技術點6. 待完善功…

學生管理前端

文章目錄 首頁student.html查詢功能 首頁 SpringBoot前端html頁面放在static文件夾下&#xff1a;/src/main/resources/static 默認首頁為index.html&#xff0c;我們可以用兩個超鏈接或者兩個button跳轉到對應的頁面。這里只是單純的跳轉頁面&#xff0c;不需要提交表單等其…

(動態規劃 最長遞增的子序列)leetcode 300

這道題我第一眼反應就是暴力&#xff0c;但是暴力的話就是n*n-1*n-2*...n-(n-1) 也就是O(n^n)dfs做絕對超時 貪心也不行&#xff0c;這里是子序列&#xff0c;要考慮在ni的范圍內考慮多種路線取最優&#xff0c;所以用動態規劃 如何用動態規劃呢&#xff1f; 答&#xff1a;…

RabbitMQ系列(六)基本概念之Routing Key

在 RabbitMQ 中&#xff0c;Routing Key&#xff08;路由鍵&#xff09; 是用于將消息從交換機&#xff08;Exchange&#xff09;路由到指定隊列&#xff08;Queue&#xff09;的關鍵參數。其核心作用是通過特定規則匹配綁定關系&#xff0c;確保消息被正確分發。以下是其核心機…

Spark內存并行計算框架

spark核心概念 spark集群架構 spark集群安裝部署 spark-shell的使用 通過IDEA開發spark程序 1. Spark是什么 Apache Spark? is a unified analytics engine for large-scale data processingspark是針對于大規模數據處理的統一分析引擎 spark是在Hadoop基礎上的改進&…

Ubuntu 安裝 Nginx并配置反向代理

Ubuntu版本&#xff1a;Ubuntu 24.04.2 LTS 一、安裝Nginx ?更新系統軟件包? 安裝前需確保系統處于最新狀態&#xff0c;避免依賴沖突 sudo apt update && sudo apt upgrade -y ?安裝Nginx主程序? Ubuntu官方倉庫已包含穩定版Nginx&#xff0c;直接安裝即可 sudo…

Solr中得Core和Collection的作用和關系

Solr中得Core和Collection的作用和關系 一&#xff0c; 總結 在Apache Solr中&#xff0c;Core和Collection 是兩個核心概念&#xff0c;他們分別用于單機模式和分布式模式&#xff08;SolrCloud&#xff09;中&#xff0c;用于管理和組織數據。 二&#xff0c;Core 定義&am…

yolov8,yolo11,yolo12 服務器訓練到部署全流程 筆記

正在進行中&#xff0c;隨時更新 一. Anaconda配置 1.安裝anaconda (1)下載.sh文件 Index of /anaconda/archive/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror (2)scp到服務器后&#xff0c;運行安裝包 bash Anaconda3-2020.07-Linux-x86_64.sh (3)安裝anacond…

從零開始開發純血鴻蒙應用之語音朗讀

從零開始開發純血鴻蒙應用 〇、前言一、API 選型1、基本情況2、認識TextToSpeechEngine 二、功能集成實踐1、改造右上角菜單2、實現語音播報功能2.1、語音引擎的獲取和關閉2.2、設置待播報文本2.3、speak 目標文本2.4、設置語音回調 三、總結 〇、前言 中華漢字洋洋灑灑何其多…

【AGI】DeepSeek開源周:The whale is making waves!

DeepSeek開源周&#xff1a;The whale is making waves&#xff01; 思維火花引言一、DeepSeek模型體系的技術演進1. 通用語言模型&#xff1a;DeepSeek-V3系列2. 推理優化模型&#xff1a;DeepSeek-R1系列3. 多模態模型&#xff1a;Janus系列 二、開源周三大工具庫的技術解析1…

25年前端如何走的更穩

2025年&#xff0c;隨著deepseek引起的AI大模型技術的深度革命&#xff0c;帶來了很多機會和挑戰&#xff0c;前端程序員作為互聯網里一個普通但必不可少的崗位&#xff0c;在當前形勢下&#xff0c;需要主動變革才能走的更穩。本文簡單介紹三個方向&#xff0c;Web3前端、全棧…

DockerでOracle Database 23ai FreeをセットアップしMAX_STRING_SIZEを拡張する手順

DockerでOracle Database 23c FreeをセットアップしMAX_STRING_SIZEを拡張する手順 はじめに環境準備ディレクトリ作成Dockerコンテナ起動 データベース設定変更コンテナ內でSQL*Plus起動PDB操作と文字列サイズ拡張設定検証 管理者ユーザー作成注意事項まとめ はじめに Oracle…

市場加速下跌,但監管「堅冰」正在消融

作者&#xff1a;Techub 熱點速遞 撰文&#xff1a;Yangz&#xff0c;Techub News 與近日氣溫逐步回暖不同&#xff0c;自 2 月 25 日比特幣跌破 9 萬美元以來&#xff0c;加密貨幣市場行情一路下滑。今日 10 時 50 分左右&#xff0c;比特幣更是跌破 8 萬美元大關&#xff0c…

【Android】安卓付款密碼輸入框、支付密碼輸入框

如圖 代碼部分&#xff1a; public class PayPasswordDialog extends AppCompatDialogFragment {private String mPayPass "";private String mTitle, mMoney;private final TextView[] mPayPassTextViewArray new TextView[6];private List<Integer> mPayP…

Java數據結構_一篇文章了解常用排序_8.1

本文所有排序舉例均默認為升序排列。 目錄 1. 常見的排序算法 2. 常見排序算法的實現 2.1 插入排序 2.1.1 基本思想&#xff1a; 2.1.2 直接插入排序 2.1.3 希爾排序&#xff08;縮小增量排序&#xff09; 2.2 選擇排序 2.2.1 基本思想&#xff1a; 2.2.2 直接選擇排…

性能調優篇——索引優化與執行計劃解析

引言 當數據庫表數據突破千萬級時&#xff0c;一個未優化的索引可能讓查詢耗時從毫秒級暴增至分鐘級。某電商平臺曾因商品搜索接口的索引缺失&#xff0c;導致大促期間數據庫CPU飆升至98%&#xff0c;直接引發服務雪崩。本文將深入B樹索引的存儲奧秘&#xff0c;詳解慢查詢日志…

計算機畢業設計SpringBoot+Vue.js人口老齡化社區服務與管理平臺 (源碼+文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

C#上位機--三元運算符

引言 在 C# 上位機開發中&#xff0c;我們經常需要根據不同的條件來執行不同的操作。條件判斷是編程中不可或缺的一部分&#xff0c;而三元運算符就是一種簡潔而強大的條件判斷工具。本文將詳細介紹 C# 中的三元運算符&#xff0c;探討其在上位機開發中的應用場景&#xff0c;…

AI時代保護自己的隱私

人工智能最重要的就是數據&#xff0c;讓我們面對現實&#xff0c;大多數人都不知道他們每天要向人工智能提供多少數據。你輸入的每條聊天記錄&#xff0c;你發出的每條語音命令&#xff0c;人工智能生成的每張圖片、電子郵件和文本。我建設了一個網站(haptool.com)&#xff0c…

Hutool - POI:讓 Excel 與 Word 操作變得輕而易舉

各位開發者們&#xff0c;在日常的 Java 開發工作里&#xff0c;處理 Excel 和 Word 文件是相當常見的需求。無論是從 Excel 里讀取數據進行分析&#xff0c;還是將數據寫入 Excel 生成報表&#xff0c;亦或是對 Word 文檔進行內容編輯&#xff0c;傳統的 Apache POI 庫雖然功能…