SQL Express连接异常排查:特定机器「在我机器上正常」问题
解决SQL Express下Katalon自动化测试结果写入数据库的连接异常问题
问题背景
我最近在用Katalon(类似Chrome版Selenium)做自动化测试时,碰到了一个特别棘手的数据库连接问题:
- 只有安装SQL Express的本地机器会抛出异常:
A network-related or instance-specific error occurred while establishing a connection to SQL Server. - 其他装了完整版SQL Server 2017的机器都能正常运行
- 我已经确认TCP/IP协议、防火墙规则、远程连接权限都开了,SQL Server Management Studio也在运行,连接字符串也加了
\SQLExpress标识,但问题还是没解决
问题根源与修复方案
折腾了一周后,我偶然结合另一个更明确的错误System.ArgumentException: Keyword not supported: 'datasource'找到了问题的核心:连接字符串的关键字用错了。
原来的连接字符串里用了datasource,但SQL Server标准的连接字符串关键字应该是server。修复后的正确连接字符串如下:
connStr = @"server = .\sqlexpress; Initial Catalog = AutoTestDB; Integrated Security = true";
如果你的环境也碰到相同的连接异常,或者弹出datasource关键字不支持的错误,不妨试试改用这个连接格式。
相关代码示例
写入数据库的C#代码(已修复连接字符串)
public void testDBAdd(String testName, Boolean pass, String testComment) { SqlConnection con; SqlDataAdapter daAutoTest; DataSet dsAutoTestDB = new DataSet(); SqlCommandBuilder cmdBAutoTest; String connStr, sqlAutoTest; // 修复后的连接字符串 connStr = @"server = .\sqlexpress; Initial Catalog = AutoTestDB; Integrated Security = true"; con = new SqlConnection(connStr); sqlAutoTest = @"SELECT * FROM TestResults"; daAutoTest = new SqlDataAdapter(sqlAutoTest, connStr); cmdBAutoTest = new SqlCommandBuilder(daAutoTest); daAutoTest.FillSchema(dsAutoTestDB, SchemaType.Source, "AutoTest"); daAutoTest.Fill(dsAutoTestDB, "AutoTest"); foreach (DataRow drAutoTest in dsAutoTestDB.Tables["AutoTest"].Rows) { if (pass == true && drAutoTest["testName"].ToString() == testName) { drAutoTest.BeginEdit(); drAutoTest["testName"] = testName; drAutoTest["testResult"] = 1; drAutoTest["testComment"] = testComment; drAutoTest.EndEdit(); daAutoTest.Update(dsAutoTestDB, "AutoTest"); } else if (pass == false && drAutoTest["testName"].ToString() == testName) { drAutoTest.BeginEdit(); drAutoTest["testName"] = testName; drAutoTest["testResult"] = 0; drAutoTest["testComment"] = "Exception: " + testComment; drAutoTest.EndEdit(); daAutoTest.Update(dsAutoTestDB, "AutoTest"); } } }
执行测试并收集结果的代码
public void settingTest<TestNumber>() { IWebDriver driver = new ChromeDriver(); ChromeOptions options = new ChromeOptions(); options.AddArguments("--start-maximized"); driver = new ChromeDriver(options); String testName = "<Test Number>", testComment = ""; Boolean pass = false; try { settingsLogin(driver); settingsClick(driver); Assert.IsTrue(driver.FindElement(ElementLocator).Displayed); if (driver.FindElement(ElementLocator).Displayed == true) { testComment = "Pass"; pass = true; testDBAdd(testName, pass, testComment); } } catch (Exception ex) { testComment = "" + ex.TargetSite + "" + ex.Message; testDBAdd(testName, pass, testComment); } finally { driver.Close(); } }
内容的提问来源于stack exchange,提问作者John McGlinchey
相关产品推荐
相关产品推荐

