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 中找不到服务器‘系统’。” [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
使用 C# dataAdapter.Fill() 和 dataAdapter.Update() 将表的数据从一个数据库传输到另一个数据库的同一个表