DataAdapter.Fill 给出错误“在 sys.servers 中找不到服务器‘系统’。” [关闭]

Posted

技术标签:

【中文标题】DataAdapter.Fill 给出错误“在 sys.servers 中找不到服务器‘系统’。” [关闭]【英文标题】:DataAdapter.Fill gives error "Could not find server 'System' in sys.servers." [closed] 【发布时间】:2021-10-15 10:03:33 【问题描述】:

我正在尝试从我的 SQL Server 数据库中获取一些值,我可以通过以下方式连接到它:

SqlConnection conx = new SqlConnection();
SqlConnection conx4 = new SqlConnection("Data Source=.\\Sistema_Deci;Initial Catalog=sistema_decisiones_financieras;Persist Security Info=True;User id=sa;Password=somepassword;timeout=120;");
conx = conx4;

conx.Open();
conx.Close();

到目前为止它运行良好,但是当我尝试从中获取值时出错,代码如下:

try

    SqlCommand cmd2 = new SqlCommand("SELECT * FROM Ordenes_Servicios", conx);
    SqlDataReader reader1;
    DataTable dtordenes = new DataTable();

    conx.Open();

    SqlDataAdapter sqlDA = new SqlDataAdapter(cmd2.ToString(), conx.ConnectionString);
    sqlDA.Fill(dtordenes);  // <--- at this point the error occurs

    conx.Close();

catch(Exception ex)

            

例外是:

System.Data.SqlClient.SqlException (0x80131904):在 sys.servers 中找不到服务器“系统”。验证是否指定了正确的服务器名称。如有必要,执行存储过程 sp_addlinkedserver 将服务器添加到 sys.servers。

到目前为止,我已经在 SQL Server 上尝试过这个来查看服务器的名称,显然结果中没有任何“系统”服务器,但是我不明白为什么它试图连接到“系统” ' 而不是 'Sistema_Deci'

select name from sys.servers

哦,我的 Visual Studio 是 2017(与 2019 相同的问题)并运行 SQL Server 2019 Express,因为我无法安装 2014,这是我迄今为止一直在使用的版本(我知道为什么,但它在安装时开始抛出错误2014)。

我找到了一种可行的方法,但这不是我试图对其进行编程的方式,因为将所有内容映射出来需要大量额外的工作

SqlCommand cmd2 = new SqlCommand("SELECT * FROM Ordenes_Servicios", conx);

SqlDataReader reader1;
DataTable dtordenes = new DataTable();

dtordenes.Columns.Add("ID");
dtordenes.Columns.Add("Cliente");

conx.Open();

reader1 = cmd2.ExecuteReader();

while (reader1.Read())

    string temp = reader1["ID_Reporte"].ToString();
    string temp2 = reader1["Cliente"].ToString();
    dtordenes.Rows.Add(temp, temp2);

【问题讨论】:

SqlDataAdapter sqlDA = new SqlDataAdapter(cmd2.ToString(), conx.ConnectionString); 更改为SqlDataAdapter sqlDA = new SqlDataAdapter(cmd2); ***.com/questions/6073382/… 我笑得很厉害,我不敢相信,但这完全解决了问题,你能解释一下为什么会出现这个问题吗? 您正在执行new SqlDataAdapter(cmd2.ToString(), conx.ConnectionString);,这会将"System.Data.SqlClient.SqlCommand" 和连接字符串传递给构造函数。第一个字符串应该是实际的 SQL 查询而不是 "System.Data.SqlClient.SqlCommand"。 SqlDataAdapter 的另一个构造函数只接受SqlCommand。你只需要使用它。 docs.microsoft.com/en-us/dotnet/api/… 【参考方案1】:

这是错误的:

SqlDataAdapter sqlDA = new SqlDataAdapter(cmd2.ToString(), conx.ConnectionString);

cmd2 是一个 SqlConnection,它没有自己的 ToString,因此它使用来自 object 的默认值,它只是对象的类型。这意味着数据适配器看到的“SQL”最终是"System.Data.SqlClient.SqlConnection",并且您的 sqlserver 认为您正在调用另一个名为“System”的服务器上的存储过程(在名为 Data 的数据库中,在名为 SqlClient 的模式中,对于名为 SqlConnection 的过程)

这样做:

var dt = new DataTable();
using var da = new SqlDataAdapter("SELECT * FROM Ordenes_Servicios", conx);
da.Fill(dt);

扔掉所有其他代码;这都是无关紧要的。你只需要这 3 行。数据适配器知道如何自己打开连接

【讨论】:

【参考方案2】:

由于以下代码,您会遇到错误:

SqlDataAdapter sqlDA = new SqlDataAdapter(cmd2.ToString(), conx.ConnectionString); //SqlDataAdapter(String, String)

如果你打算使用这个重载,你可以简单地使用这样的东西:

SqlDataAdapter sqlDA = new SqlDataAdapter("SELECT * FROM Ordenes_Servicios", "Data Source=.\\Sistema_Deci;Initial Catalog=sistema_decisiones_financieras;Persist Security Info=True;User id=sa;Password=somepassword;timeout=120;"); //SqlDataAdapter(String, String)

SqlDataAdapter sqlDA = new SqlDataAdapter(cmd2); //SqlDataAdapter(SqlCommand) 

SqlDataAdapter sqlDA = new SqlDataAdapter("SELECT * FROM Ordenes_Servicios", conx); //SqlDataAdapter(String, SqlConnection) 

也只保留一个连接为conx 并使用它:

SqlConnection conx = new SqlConnection("Data Source=.\\Sistema_Deci;Initial Catalog=sistema_decisiones_financieras;Persist Security Info=True;User id=sa;Password=somepassword;timeout=120;");

在Docs 上阅读有关 SqlDataAdapter 的更多信息。

【讨论】:

以上是关于DataAdapter.Fill 给出错误“在 sys.servers 中找不到服务器‘系统’。” [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

DataAdapter.Fill(数据集)

向 dataAdapter.fill() 添加参数

如何提高 dataadapter.fill 的性能?

DataAdapter.Fill()分页

如何同时执行 DataAdapter.Fill()

使用 C# dataAdapter.Fill() 和 dataAdapter.Update() 将表的数据从一个数据库传输到另一个数据库的同一个表