SQL异常 - 与网络相关或特定实例。SQL Express "在我的机器上可以运行"问题

5

编辑:花了一周的时间,我最终找到了问题所在,主要是因为纯运气和另一个具有更具体修复方法的错误。 问题出在我制作的connStr上,由于某种原因,在这台机器上运行时会随机出现“System.ArgumentException: Keyword not supported: 'datasource'.”的错误。然后我发现解决方法是将connStr重命名如下:

 connStr = @"server = (server name); Initial Catalog = AutoTestDB; Integrated Security = true";

如果您像我一样遇到此错误,请尝试使用该连接方法。目前,我正在使用Katalon自动化测试进行自动化测试,其本质上是Chrome的Selenium,但当我尝试将测试结果添加到我们的测试结果数据库中时,SQL异常"A network-related or instance-specific error occurred while establishing a connection to SQL Server."就会不断出现。 TCP/IP已打开,防火墙和远程连接也都已开启,我在运行带有SQL连接的数据库时也一直保持SQL-SMS开启状态。
然而,只有当我使用某个特定机器访问存储在机器内部的数据库时,才会出现这种情况,在使用其他任何机器时都可以正常工作。我能想到的这台机器唯一的区别就是使用了SQL Express,而我使用的所有其他机器都装有完整版本的Microsoft SQL-SMS-17。
这确实是一个"它在我的机器上可行"的真实案例,除了这台机器是唯一无法运行此代码的机器,唯一的区别是它使用了应该在\\SQLExpress中列出的SQL Express。
下面是使用SQL连接对C#代码进行编辑,并将其值插入到数据库中已有的表格中:
public void testDBAdd(String testName, Boolean pass, String testComment)
    {
        SqlConnection con;
        SqlDataAdapter daAutoTest;
        DataSet dsAutoTestDB = new DataSet();
        SqlCommandBuilder cmdBAutoTest;
        String connStr, sqlAutoTest;

        connStr = @"datasource = .\\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();
        }
    }

4
您的连接代码正在查找一个名为“.\sqlexpress”的SQL Express实例......如果您的本地计算机上没有叫做这个的实例,那么您将需要更改它。 - BugFinder
你可能需要设置权限和启用TCP连接。过去曾经是一个问题,不确定新版本是否默认处理了这些事情。 - Steve
可能是半打问题之一。检查TCP是否启用,连接字符串在机器上是否有效,数据库是否在线等等。 - Liam
似乎问题在于您期望用户拥有本地的 SQL Server (Express) 实例。通常,应用程序会连接到托管 SQL Server 实例的特定机器(服务器)。如果用户需要安装 SQL Server (Express),那么用户首先需要安装它,然后在服务器上拥有正确的数据库,并将其域用户添加为服务器和数据库上的登录和用户(因为您正在使用集成安全性)。我想,实际上,您希望他们连接到正确的服务器。 - Thom A
为了澄清,这个服务器尚未在网络上投入使用,仍然在本地专门托管,每台机器都使用一个实例进行活动测试。一旦数据库进入网络并移交给另一个团队处理,情况就会发生改变。如果这些检查获得有益的结果,我们将进一步更新。 - John McGlinchey
显示剩余2条评论
2个回答

1

我花了一个星期最终找到了问题,主要是由于纯运气和另一个具有更具体修复方法的错误。问题出在我创建的connStr上,在这台机器上,运行时会随机给我“System.ArgumentException: Keyword not supported: 'datasource'.”的错误。然后我发现解决方法是将connStr重命名为以下内容:

 connStr = @"server = (server name); Initial Catalog = AutoTestDB; Integrated Security = true";

如果你像我一样遇到了这个错误,请尝试连接的方法。感谢在帖子评论区和回答部分提供帮助的用户们。

1

不确定,但我认为您的连接字符串中有一个多余的反斜杠。您在字符串前加上了“@”,但在数据源中使用了“\\”。您也可以尝试使用“(localdb)\SQLExpress”作为数据源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接