如何在使用SqlConnectionStringBuilder前验证字符串是否为有效SQL连接串?
针对SQL连接字符串解析与验证的解决方案
1. 跨数据库保存的连接字符串对比优化
你当前通过SqlConnectionStringBuilder提取DataSource和InitialCatalog做跨库判断的思路可行,推荐补充空值处理并统一大小写,避免因实例名大小写差异导致误判:
Dim currentDB As New System.Data.SqlClient.SqlConnectionStringBuilder(DbF.ConStr) Dim fileDB As New System.Data.SqlClient.SqlConnectionStringBuilder(P.ConStr) ' 统一转小写消除大小写影响,同时处理空值 Dim currentDataSource = currentDB.DataSource?.ToLowerInvariant() Dim currentCatalog = currentDB.InitialCatalog?.ToLowerInvariant() Dim fileDataSource = fileDB.DataSource?.ToLowerInvariant() Dim fileCatalog = fileDB.InitialCatalog?.ToLowerInvariant() If currentDataSource <> fileDataSource OrElse currentCatalog <> fileCatalog Then ' 执行跨数据库保存的专属逻辑 End If
2. 区分Excel路径与数据库连接字符串
最可靠的方式是在加载模型时标记来源类型:
- 加载阶段:定义枚举(如
SourceType.Database/SourceType.Excel),加载Excel时给OM标记SourceType.Excel并保存文件路径;加载数据库时标记SourceType.Database并保存连接字符串。 - 保存阶段:先判断
SourceType,如果是Excel类型,直接跳过数据库连接字符串的对比逻辑。
如果无法提前标记,也可以通过字符串特征快速区分:
- 数据库连接字符串通常包含
Data Source、Initial Catalog、Server这类核心关键词; - Excel路径一般带
.xls/.xlsx后缀,或是本地路径(如C:\)、网络共享路径(如\\server\file)格式。
3. 非异常捕获方式验证SQL Server连接字符串
官方没有提供直接的验证API,但可以通过组合规则判断:
- 必须包含
Data Source(或Server)和Initial Catalog(或Database)这两组核心键中的至少一组对应项; - 不包含Excel连接特有的关键词(如
Excel 12.0、HDR=Yes); - 符合键值对用
;分隔、键值用=连接的基本格式。
以下是实现示例:
Function IsSqlServerConnectionString(conStr As String) As Boolean If String.IsNullOrWhiteSpace(conStr) Then Return False ' 拆分并提取所有键名(转小写) Dim keyNames = conStr.Split(";"c) .Where(Function(s) s.Contains("=")) .Select(Function(s) s.Split("="c)(0).Trim().ToLowerInvariant()) ' 检查核心数据库关键词 Dim hasDataSource = keyNames.Contains("data source") OrElse keyNames.Contains("server") Dim hasCatalog = keyNames.Contains("initial catalog") OrElse keyNames.Contains("database") ' 排除Excel相关连接字符串 Dim isExcelCon = conStr.IndexOf("excel", StringComparison.OrdinalIgnoreCase) >= 0 _ OrElse conStr.IndexOf("hdr=", StringComparison.OrdinalIgnoreCase) >= 0 Return hasDataSource AndAlso hasCatalog AndAlso Not isExcelCon End Function
这个方法能覆盖绝大多数场景,避免了异常处理的性能开销。
内容的提问来源于stack exchange,提问作者Maury Markowitz
相关产品推荐
相关产品推荐

