news 2026/10/21 11:56:00

EF+WinForm连接字符串配置与运行时修改实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EF+WinForm连接字符串配置与运行时修改实战指南

简介:面向.NET开发者的EF与WinForms集成学习资源,演示如何在桌面程序中动态修改数据库连接配置,并附带可直接挂载的数据库文件。资源围绕Code First模式,系统讲解DbContext、ConfigurationManager等核心用法,涵盖连接字符串的安全管理、运行时更新与CRUD操作,适合希望提升ORM及桌面应用实战能力的初中级开发人员。压缩包共240个文件,包含95个C#源码、30个常用DLL库、13个PDB调试符号、9个config配置文件,以及MDF/LDF数据库文件,整体约61.27MB,目录与Visual Studio解决方案结构一致,便于直接打开运行。已有453人浏览学习。通过完整项目可清晰看到BLL、Model等分层组织方式,能快速掌握连接字符串动态切换的实现思路,并借助附带数据库进行即时验证。无论是学习Code First还是处理多环境部署,都可从中获得可直接落地的排错思路与配置管理经验,是系统学习EF与WinForms结合开发的实用参考。

1. 为什么说连接字符串才是 EF+WinForm 交付时要摸清的第一块石头

接手一个 EF+WinForm 的桌面端项目,第一件容易让人原地翻车的事往往不是业务逻辑,而是连接字符串。Web 项目里改一下配置文件刷新就生效,WinForm 里改了 App.config,生成后客户端照样连旧的库——因为程序运行时读的是 exe 同目录下的 exe.config,项目里的 App.config 只负责编译时拷贝。这个场景太常见:内网客户端跟着数据库迁机房、开发库切正式库、SQL Server 换了实例名,凡是这类"程序里临时换连接"的需求,没一套可复用的改连接方法,就得重新编译发版,用户每等一次就多一分不满。这篇围绕 EF+WinForm 的组合,把版本怎么选、模型怎么建、运行时怎么改配置连接一步步走完,最后落到一套验证清单,适合正在维护这类项目、被连接字符串坑过或即将被坑的人。

2. 环境选型:EF6、SQL Server 与 .NET Framework 的搭配细节

2.1 为什么首选 EF6:桌面端 DB-First 的成熟度最高

如果项目是 "EF+Winform",第一个问题不是"连接字符串能不能改",而是"到底用哪个 EF"。这个场景下我会直接建议 EF6,而不是 EF Core。EF Core 在 WinForms 上不是不能用,但它是给新项目准备的,讲究依赖注入、DbContext 生命周期管理和迁移链路,老代码一旦切过去,原先的 EDMX 文件无法直接兼容,实体生成代码基本要重写。

EF6 的 DB-First 工具链在 Visual Studio 里相当成熟:右键添加"ADO.NET 实体数据模型",向导走完就生成 EDMX、DbContext 和实体类,几分钟就能把数据库表映射成对象。这在老项目的维护场景里非常实用——数据库表结构已经定了,不需要 Code-First 那套迁移流程来折腾。

版本上要注意区分:

环境项推荐值说明
.NET Framework4.6.1 / 4.7.2EF6 最高支持到 6.4.4,前提是 .NET Framework 4.x
Visual Studio2019 或 2022都内置 EF6 向导,生成 EDMX 无额外插件
NuGet 包EntityFramework 6.4.46.x 系列最后一个稳定版,WinForms 老项目够用
数据库SQL Server 2008 R2 及以上未发现需要更高版本的可信理由

有一点容易被忽略:如果项目还锁在 .NET Framework 4.0 上,EntityFramework 包版本最高只能装到 6.1.3,再新的 6.4.4 装不进去。所以先看目标框架再定包版本,不要一上来就Install-Package EntityFramework拉最新,拉到装不上反而添乱。

2.2 数据库版本取舍与附带数据库的处理

资源包标题里写着"另附带数据库",说明交付物里大概率带着一个 mdf/ldf 文件。这类文件不是直接双击就能用的,得先附加到 SQL Server 实例上。客户端本身不会自带一个 SQL Server 服务端,内网部署一般按下面三种方式落:

  1. SQL Server Express:免费,适合小规模客户端,但远程 TCP/IP 访问默认没开,需要手动启用。
  2. LocalDB:开发调试方便,但它是按用户进程运行的,不能做多客户端共享的服务器库,别用在生产。
  3. 完整版 SQL Server Standard/Enterprise:内网正规部署的首选,端口、权限、实例名都可控。

先从 mdf 附加数据库。拿到 mdf 后,在服务器上执行:

USE [master] GO CREATE DATABASE [DemoDB] ON (FILENAME = N'C:\Data\DemoDB.mdf'), (FILENAME = N'C:\Data\DemoDB_log.ldf') FOR ATTACH; GO

参数说明:FILENAME要写成 mdf/ldf 文件所在的实际路径,路径里别带中文和空格,SQL Server 对这类路径的解析有时会出现玄学问题;FOR ATTACH告诉 SQL Server 这是附加操作,不要把文件当新建数据库处理。

这里有个高频坑:如果只拿到 mdf 而 ldf 丢了,SQL Server 在FOR ATTACH时会尝试重建一个日志文件。要是重建失败,会报"无法打开物理文件……操作系统错误 5(拒绝访问)"之类的错,多数是目录权限问题,把文件所在目录给 SQL Server 服务账户加上读写权限即可。还有一个版本匹配问题需要注意:高版本 SQL Server 生成的数据文件附加到低版本实例上会直接失败,提示文件版本高于服务器版本;低版本文件附加到高版本一般可以,但数据库会自动升级到高版本文件格式,升级后就回不去了。交付时最好在说明里写清数据库是用哪个版本实例建的,避免用户拿错实例去挂。

2.3 客户端运行环境:TCP/IP、防火墙与实例名

程序里改了连接字符串还是连不上,一半以上的原因跟连接字符串本身无关,而是 SQL Server 没开 TCP/IP,或者防火墙挡了端口。SQL Server 默认只用共享内存和命名管道协议,Visual Studio 本机调试没感觉,一旦客户端从别的机器连过来,TCP/IP 没启用就直接超时。

在服务器上把 SQL Server 配置管理器打开,检查:

  1. SQL Server 服务是否在运行,服务名是MSSQLSERVER(默认实例)还是带实例名的命名实例。
  2. 网络配置 → MSSQLSERVER 的协议:确认 TCP/IP 已启用,右键属性里看"IP 地址"页签,IPAll 的 TCP 端口要填 1433 或其他约定端口。
  3. 防火墙里放行 1433 端口,或者直接放行sqlservr.exe。Windows Server 的防火墙默认拦入站,很多 RDP 远程调试没问题、客户端连不上的案例都是死在这一步。

检查服务状态可以这样:

net start | findstr /i "SQLSERVER"

如果没看到服务,用net start MSSQLSERVER启动,命名实例则写成MSSQL$实例名。另外,连接字符串里用命名实例时(比如server\SQLEXPRESS)客户端要找sqlbrowser服务来解析实例名,这个服务没启动就会报"无法识别服务器名称"。老运维的习惯是:能写 IP 就直接写 IP,少用实例名解析,省掉一个变量。

3. 项目接入 EF:从 NuGet 包到 EDMX 模型,完整落一遍

3.1 创建 WinForms 项目并安装 EF 包

这一步没太多悬念:新建一个 Windows 窗体应用(.NET Framework,不是 .NET Core/5+ 的 WinForms),然后在包管理器控制台执行:

Install-Package EntityFramework -Version 6.4.4

拆开讲:-Version 6.4.4是必须的,不写版本号虽然也是拉 EF6 最新,但明确锁定版本可以让团队里每个人的开发环境千篇一律,避免某人无意中升到不同小版本导致行为差异。装完后项目引用里会多出两个 dll:EntityFramework.dll和EntityFramework.SqlServer.dll,前者是 EF 核心,后者是 SQL Server 提供程序,缺了后者跑 SQL Server 会直接报"找不到提供程序"。

安装完 EF 包后,App.config 里会被 NuGet 自动写入一段<entityFramework>配置节,里面声明了默认连接工厂(SqlConnectionFactory)。这段配置先不用动,等 EDMX 向导走完,连接字符串会自动加到 connectionStrings 里。

3.2 用向导从数据库生成模型

以 DB-First 方式落地。提前把数据库附加好(见 2.2),然后在项目上右键 → 添加 → 新建项 → 数据 → ADO.NET 实体数据模型,文件名我这边习惯起成DemoDBEntities.edmx。

接下来的向导几步是:

  1. 选择"来自数据库的 EF 设计器"。
  2. 新建连接:服务器名填实例地址,身份验证选 Windows 或 SQL Server 账号,选目标数据库。在这里连接一次,只是为了让向导读取表结构和生成模型,不代表程序将来固定连接这个库。
  3. 实体框架版本:选 EF 6.x(如果界面列出 6.0/6.1/6.4 就选 6.4),不要选 EF Core 版本。
  4. 选表、视图、存储过程,勾选"确定生成的模型中的外键",完成。

生成后的文件大致是:

DemoDBEntities.edmx DemoDBEntities.Context.tt DemoDBEntities.Context.cs DemoDBEntities.tt DemoTable.cs

说明一下:Context.cs里是 DbContext 类,名字默认取连接字符串里 name 属性的值;tt模板生成的实体类就是对应数据库表的 POCO。这里有个很多人没意识到的点:DbContext 类名和连接字符串的 name 属性是绑定的。

默认构造函数是这样的:

public partial class DemoDBEntities : DbContext { public DemoDBEntities() : base("name=DemoDBEntities") { } }

base("name=DemoDBEntities")的意思是从 App.config 的 connectionStrings 节点里找 name 为 DemoDBEntities 的连接字符串。这个 name 对应关系在运行时改连接时尤其重要,后面第 4 章会重点说明。

3.3 解剖 App.config 里的 connectionString

生成 EDMX 后,App.config 里会多出这段:

<connectionStrings> <add name="DemoDBEntities" connectionString="metadata=res://*/DemoDBEntities.csdl|res://*/DemoDBEntities.ssdl|res://*/DemoDBEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=DemoDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> </connectionStrings>

这段连接字符串是 EF6 DB-First 最容易改错的东西。拆开看:

  • metadata=res://*/DemoDBEntities.csdl|res://*/DemoDBEntities.ssdl|res://*/DemoDBEntities.msl:三段路径分别指向概念模型、存储模型和映射资源,是 EF 运行时加载模型文件的定位符。手动修改时只要丢一段或把分隔符写错,就会报元数据相关错误。
  • provider=System.Data.SqlClient:表示数据库提供程序是 SQL Server,这个值不能改成别的。
  • provider connection string=&quot;...&quot;:这里是真正连数据库的 ADO.NET 连接字符串,由于整个 connectionString 是 XML 属性,内嵌的双引号必须用&quot;转义,这是新手手改时最爱踩的雷。
  • providerName="System.Data.EntityClient":整个节点在 EF 里的提供程序名称,保持原样。

记住一个要点:程序运行时修改连接字符串,尽量不要直接手拼这段,而是用 EF 提供的连接字符串构造器分步生成,这个在第 4 章展开。

另外要留意项目里 App.config 和输出目录下DemoDB.exe.config的关系。运行时ConfigurationManager读的是程序目录下的 exe.config,项目里的 App.config 只是生成时的源文件。你在 Visual Studio 里改了 App.config 但不重新生成,运行目录里的 exe.config 不会被更新,很多"改了没生效"的问题都是这个原因。

4. 程序中改配置连接:三种写法与它们的承受力

4.1 方案一:直接改配置节并刷新

最直觉的做法是运行时修改 App.config 里的 connectionStrings 节点,然后刷新配置节。代码大致是这样:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConnectionStringSettings setting = config.ConnectionStrings.ConnectionStrings["DemoDBEntities"]; if (setting != null) { setting.ConnectionString = newConnectionString; config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("connectionStrings"); }

参数说明:OpenExeConfiguration拿到的是当前程序(exe.config)的配置文件对象,这个对象可以写回文件;RefreshSection("connectionStrings")强制让配置系统重新读取,否则内存里还是第一次读取的旧缓存。

这个方案的优点是实现简单,保存后重启程序即可吃到新配置,适合"一次性迁移、改完不再动"的场景。但它有个明显的命门:如果你想改的是那段 EntityClient 格式的连接字符串,就必须保证新值里 metadata、provider 和转义完全正确,手工拼格式很容易在第 5 章的元数据坑里翻车。另外,ConfigurationManager.RefreshSection刷新的是配置节,但如果代码里有静态的DemoDBEntities已经被实例化过,已创建的上下文对象不会因为配置刷新而自动重连。

4.2 方案二:EntityConnectionStringBuilder 重建上下文(推荐)

这个方案是我在实际维护里最常用的一种。思路是:不在配置文件里做文章,而是用EntityConnectionStringBuilder把连接参数重新拼好,再传给 DbContext 的构造函数重载。这样既绕开了 EDMX 连接字符串那套复杂的转义规则,又能实现多个服务器之间自由切换。

先在生成的DemoDBEntities.Context.cs里确认有带参数的构造函数,没有就手动补一个:

public partial class DemoDBEntities : DbContext { public DemoDBEntities(string connectionString) : base(connectionString) { } }

然后运行时这样构建连接:

using System.Data.Entity.Core.EntityClient; using System.Data.SqlClient; var sqlBuilder = new SqlConnectionStringBuilder { DataSource = txtServer.Text.Trim(), // 服务器IP或实例名 InitialCatalog = txtDatabase.Text.Trim(), // 数据库名 UserID = txtUser.Text.Trim(), // SQL账号,如sa Password = txtPassword.Text, // 密码 MultipleActiveResultSets = true, ApplicationName = "EntityFramework" }; var entityBuilder = new EntityConnectionStringBuilder { Provider = "System.Data.SqlClient", ProviderConnectionString = sqlBuilder.ConnectionString, Metadata = "res://*/DemoDBEntities.csdl|res://*/DemoDBEntities.ssdl|res://*/DemoDBEntities.msl" }; using (var ctx = new DemoDBEntities(entityBuilder.ConnectionString)) { int count = ctx.DemoTable.Count(); // 正常查询、写库…… }

这段代码的关键在于用SqlConnectionStringBuilder处理用户的输入,特殊字符(分号、双引号、中文密码)全部由构造器自动转义,EntityConnectionStringBuilder再把 SQL 连接串嵌进 EntityClient 格式里。Metadata那段从原 App.config 原样抄过来,保持不变。

这种做法不需要写配置文件,完全靠代码控制,切换服务器只需要重新构造连接串并 new 一个 DbContext。缺点也很直接:程序一重启,连接信息就丢了,所以一般配合一个持久化的连接配置文件使用。

4.3 方案三:独立连接配置文件,不改主配置

如果客户端频繁切换服务器,我建议在程序目录下单独放一个连接配置文件(比如db.config),跟主程序的 exe.config 分离。这样发布时可以只替换连接配置文件,不动主程序和主配置。

读取方式用 LINQ to XML 解析即可:

string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "db.config"); if (File.Exists(configPath)) { XDocument doc = XDocument.Load(configPath); var connNode = doc.Root?.Element("connection"); string server = connNode?.Attribute("server")?.Value; string database = connNode?.Attribute("database")?.Value; string userId = connNode?.Attribute("user")?.Value; string password = connNode?.Attribute("password")?.Value; // 再用4.2的方式拼EntityConnectionStringBuilder }

配置文件的长相可以做成这样:

<?xml version="1.0" encoding="utf-8" ?> <connection> <server>192.168.1.10</server> <database>DemoDB</database> <user>sa</user> <password>your_password</password> </connection>

这个方案的优点是运维只需要改一个文件,跟程序逻辑完全解耦;密码明文让人不舒服,但内网工具类程序很常见,真要安全的可以再套一层加密,一个字符集对应处理即可。

4.4 三种方案的取舍对比

方案持久化改连接是否重启维护复杂度适用场景
方案一 直接改配置节写回 exe.config需要重启低,但格式易错一次性迁移,改完不再动
方案二 Builder 重建上下文仅内存不用,立即生效中连接在程序运行期间动态切换
方案三 独立连接配置文件独立文件持久化需要重启低,文件易替换客户端频繁更换服务器地址

实际项目里我一般把方案二和方案三搭配用:启动时从db.config读连接参数,拼好传给 DbContext;界面上加一个"连接设置"窗口,修改后写回db.config,下次重启无缝衔接。这样既满足"程序中可修改配置连接",又不把连接字符串的格式风险暴露在用户面前。

5. 常见问题排查:连接字符串改不生效、连不上的五个高频坑

5.1 现象:改了项目里的 App.config,生成后客户端还是连旧库

原因:App.config 只是项目源配置,生成时会按程序名复制成DemoDB.exe.config放到输出目录,程序运行时读取的是程序目录下的 exe.config。改源文件不重新生成,或者发布时只拷贝了 exe 没带新 config,客户端看到的还是旧配置。

解决:开发调试时直接修改输出目录下的 exe.config 来验证;正式改配置要写回运行目录,推荐用方案三的独立配置文件方式,避免源配置和运行时配置错位。每次发布记得把最新 exe.config 一起带走,一个都不能漏。

5.2 现象:手工改连接字符串后,EF 报"未在配置中找到指定连接,或者未在提供程序中找到连接"或元数据相关错误

原因:EF6 DB-First 的 EntityClient 连接字符串里metadata=res://*/...三段是刚需,手工拼接时一旦丢失、写错分隔符或路径不对,EF 运行时无法定位模型资源。很多人只改了provider connection string里的服务器地址,却把前面的 metadata 一并弄丢了。

解决:永远不要手拼 EntityClient 连接字符串,用EntityConnectionStringBuilder的Metadata属性来承载,ProviderConnectionString单独交给SqlConnectionStringBuilder。metadata 三段路径建议直接从原 App.config 复制,保持完全一致。

5.3 现象:密码或数据库名里带分号、双引号,程序启动时报连接字符串语法错误

原因:分号是连接字符串里各参数的分隔符,双引号是字段值的边界符,特殊字符没有转义会把整条串解析错位。直接字符串拼接"data source=...;password=" + pwd + ";"在 pwd 含分号时必然出错。

解决:用户输入的服务器名、账号、密码统一交给SqlConnectionStringBuilder编码,它内部会正确处理特殊字符,再把它作为ProviderConnectionString传给EntityConnectionStringBuilder。这是最保险的两层构造法。

5.4 现象:界面上切换了新服务器,查询和写入还是落在旧库

原因:DbContext 被设计成静态单例或常驻实例,底层 DbConnection 在第一次使用时已经固定;改配置或重新拼连接字符串并不会让已创建的上下文自动换连接。

解决:每次切换连接后必须创建新的 DbContext 实例。简单说,代码里不要这样写——用static DemoDBEntities _db = new DemoDBEntities(),然后到处用这个单例;而是用using块创建短生命周期实例,在构造函数里传入最新拼出的连接串。

5.5 现象:测试连接按钮用 SqlConnection 能连上,但 EF 查询时报登录失败

原因:测试连接用的是 SqlConnection 和一套认证信息,而 EF 上下文创建时如果走的是默认构造函数base("name=DemoDBEntities"),就会忽略你之前拼的连接串,仍从配置文件读取旧的认证信息,两边认证不一致。

解决:确认创建 DbContext 时传入的是 EntityClient 格式连接串,而不是只设置了一堆 SqlConnection 参数;同时检查 SQL Server 中该登录账号对应的数据库用户是否有权限。集成 Windows 身份验证的情况下,还要确认域账号在目标库里有映射,否则会出现"用户已登录,但没有默认数据库访问权"的后缀报错。

6. 验证跑通:从状态栏到换库增删改查的自查清单

6.1 启动自检:状态栏显示当前库与服务器

在窗体 Load 事件里加一段自检逻辑,把当前 DbContext 实际连的服务器和库名显示出来,一眼就能看出程序连的是哪台机器:

using (var ctx = new DemoDBEntities()) { var conn = ctx.Database.Connection; toolStripStatusLabel1.Text = $"{conn.DataSource} / {conn.Database}"; try { conn.Open(); toolStripStatusLabel2.Text = conn.State.ToString(); conn.Close(); } catch (Exception ex) { toolStripStatusLabel2.Text = "连接失败:" + ex.Message; } }

这段代码的秘密在于:ctx.Database.Connection返回的是底层 DbConnection,DataSource能看到实际服务器地址,Database能看到当前库名。如果程序里同时配置了多个上下文,或者连接被构造函数覆盖过,这里能立刻反映出真实连接目标,不用去配置文件里猜。

6.2 换库演练:从新建空库到增删改查

验证要做到位,我一般强制自己走一遍换库演练:

  1. 在 SQL Server 里新建一个空数据库DemoDB_Test,不建任何表。
  2. 在程序界面把连接切换到这个新库,点测试连接。
  3. 首次执行 EF 查询会报"对象名无效",此时在程序里补齐建表脚本,或者用 EF 提供的数据库初始化逻辑重新建表。
  4. 执行业务增删改查:插入一条记录、查询列表、修改一条、删除一条。
  5. 重启程序,观察状态栏里显示的服务器和库名是否是刚才切过去的新库。
  6. 把连接改回正式库,再走一遍同样的增删改查,确保连接切换没有破坏原库数据。

那个"首查对象名无效"的报错其实是正常的,它恰好说明连接已切到新库,而不是还在连旧库,反而是一个有效的验证点。真正要警惕的是:切到新库后查询还能返回旧库数据,那说明上下文没被重建,连接还在缓存里。

从那以后我每次交付 EF+WinForm 的客户端,都强制自己先走一遍"切库→查询→重启→再连"的完整自查,确定连接字符串不是靠玄学跑通的,才敢把安装包发出去。希望帮到你,也祝你这次少踩个坑。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 11:52:37

AI时代独立开发者如何用IdeaLoop搭建自动化灵感日报系统

这次我们来看一个挺有意思的方向&#xff1a;AI 时代独立开发者怎么稳定地拿到创业和副业灵感。大部分人的真实状态不是没想法&#xff0c;而是每天被信息淹没&#xff1a;GitHub Trending、Product Hunt、Hacker News、公众号、播客、即刻、各种知识星球……每条都扫一眼&…

作者头像 李华
网站建设 2026/10/21 11:51:33

随机森林工程化实践:从数据清洗到模型交付的完整模板

简介&#xff1a;随机森林作为一种经典集成学习方法&#xff0c;在分类与回归任务中应用广泛。压缩包共66个文件&#xff0c;约29.8MB&#xff0c;面向机器学习初学者和需要快速上手实践的数据从业者&#xff0c;包含C源码、Matlab脚本、预编译mex文件、MAT数据、文本说明、教学…

作者头像 李华
网站建设 2026/10/21 11:48:37

Apache安装SVN site-1.8.22插件全流程:版本匹配、编译避坑与403排查

简介&#xff1a;这是一份面向 Eclipse/MyEclipse 开发者的 SVN 版本控制插件资源包&#xff0c;站点版本为 site-1.8.22&#xff0c;适合需要在 IDE 中直接完成代码提交、更新、历史查看与冲突解决的 Java 工程师。包内共 30 个文件&#xff0c;主体为 27 个 jar 插件组件&…

作者头像 李华
网站建设 2026/10/21 11:46:09

爱子在协调轨迹独特性中的作用| 赵杰 | 量子意识(第三卷)

作者&#xff1a;赵杰 清华大学硕士、微美全息云科技&#xff08;NASDAQ&#xff1a;WIMI&#xff09;董事长、微算法科技&#xff08;NASDAQ&#xff1a;MLGO&#xff09;董事长、育杰奖学金创始人我们观测宇宙中的轨迹时&#xff0c;总默认其遵循可复现的规律&#xff0c;行星…

作者头像 李华
网站建设 2026/10/21 11:46:09

黄金午夜走势:下有托底,上有压制

消息面&#xff1a;黄金当前处于“加息预期、美元美债、地缘避险”三重力量交织中。美联储官员沃什偏鸽表态一度缓和了10月加息押注&#xff0c;但12月加息预期仍高&#xff0c;美元与美债收益率晚间收复部分失地&#xff0c;继续压制金价。与此同时&#xff0c;中东局势并未缓…

作者头像 李华
网站建设 2026/10/21 11:45:52

以体育促融合,省残疾人公益基金会支持 GPCC 匹克球赛事

9 月 26 -27日&#xff0c;2026 “凯瑞麟杯” GPCC 粤港澳大湾区匹克球城市挑战赛广州赛区城市决赛&#xff0c;在白云区永旺梦乐城顺利落幕。广东省残疾人公益基金会作为本次赛事支持单位&#xff0c;深度参与赛事公益联动&#xff0c;助力 “赛事 文旅 嘉年华” 创新办赛模…

作者头像 李华