C#SQL库正在将我的查询修改为标准表

问题描述 投票:1回答:1

它正在更改我的查询,并且似乎完全可以对我的表进行限定,而无需我明确告知。有没有办法阻止它这样做?

这里是我所看到的相关信息。让我知道是否还有其他帮助。

我们有一个名为serverName的SQL Server。它已经投入生产多年了。它已从Windows 2008 Server迁移到Windows 2012 Server。新服务器的名称为sql_1234_4321(不是真实名称,但很糟糕)

我们有第n个应用程序正在使用旧的serverName SQL Server,因此我们使旧服务器脱机并为serverName创建了DNS条目,该条目指向新的sql_1234_4321,希望我们不必点击使用旧服务器的所有应用的连接字符串。

除了某些C#ASP.NET MVC应用程序外,大多数情况下都有效。

他们正在使用System.Data.SqlClient.SqlCommand

连接字符串:

Data Source=serverName;Initial Catalog=USData; Persist Security Info=True; User ID=appUn;Password=appPw

SQL查询:

select FirstName from Customers

代码:

using (SqlCommand cmd = new SqlCommand(query, sqlConnection))
{
    if (parameters != null)
    {
        cmd.Parameters.AddRange(parameters.ToArray());
    }

    var reader = cmd.ExecuteReader();
    var results = new List<TType>();

    while (reader.Read())
    {
        results.Add(convert(reader));
    }

    return results;
}

我收到一个错误:

在sys.servers中找不到服务器'serverName'。请验证是否指定了正确的服务器名称。如有必要,执行存储过程sp_addlinkedserver将服务器添加到sys.servers。

为什么会出现此错误?在连接字符串中唯一引用serverName的时间。我的查询应该只在服务器上使用默认名称空间。但似乎我的查询在过程中的某个时刻已经完全合格,如下所示:

select FirstName from serverName.USData.dbo.Customers

我在新的serverName服务器上添加了一个链接服务器sql_1234_4321,该服务器只是指向自身,这似乎可以解决问题。但是,这绝对是肮脏的,这让我怀疑它是否真的在进行跨服务器查询,或者它是否足够聪明地说“嗨!我们在自欺欺人,所以不必担心会进入网络并进行此操作。比应有的价格昂贵”,但我对此表示怀疑。

我曾考虑过使用同义词,但问题是我们有带有服务器名称的表。并且可能会有查询命中带有服务器名称的服务器,因此以下操作将不起作用:

CREATE SYNONYM serverName FOR sql_1234_4321;

因此,我必须为服务器上的每个数据库指定一个特定的同义词:

CREATE SYNONYM serverName.database1 FOR sql_1234_4321.database1;
CREATE SYNONYM serverName.database2 FOR sql_1234_4321.database2;
CREATE SYNONYM serverName.database3 FOR sql_1234_4321.database3;
CREATE SYNONYM serverName.database4 FOR sql_1234_4321.database4;
CREATE SYNONYM serverName.database5 FOR sql_1234_4321.database5;
CREATE SYNONYM serverName.database6 FOR sql_1234_4321.database6;
CREATE SYNONYM serverName.database7 FOR sql_1234_4321.database7;
CREATE SYNONYM serverName.database8 FOR sql_1234_4321.database8;
CREATE SYNONYM serverName.database9 FOR sql_1234_4321.database9;
CREATE SYNONYM serverName.database10 FOR sql_1234_4321.database10;

如您所见,这将是一场噩梦,而且感觉很脏。

我的问题是...在什么时候基于连接字符串对表名进行完全限定?有办法防止这种情况发生吗?

c# sql-server tsql dns connection-string
1个回答
0
投票

大卫·布朗(David Browne)带领我找到了问题。我的查询实际上引用了一个视图,而该视图具有对旧服务器的引用。我的疏忽大意是没有注意到这一点。谢谢大卫

© www.soinside.com 2019 - 2024. All rights reserved.