gpt4 book ai didi

c# - 即使没有互联网,NpgsqlConnection.Open 也会打开远程连接

转载 作者:行者123 更新时间:2023-11-29 12:54:04 27 4
gpt4 key购买 nike

这是我在这里的第一个问题。

所以我有一个使用 Npgsql 库连接到远程数据库的应用程序。 我有一个连接到数据库的方法,执行查询,最后关闭连接。可以正常使用,但问题是,如果在程序运行但没有调用方法时,我断开WiFi模拟无法连接到服务器,然后运行方法,连接方法仍然可以打开连接。这会导致查询卡住。我似乎无法找到一种方法来检查我是否可以连接到服务器,因为即使我断开互联网连接,NpgsqlConnection.Open() 方法仍会打开它。

抱歉我的英语不好

 public static NpgsqlConnection ConnectRemote()
{
try
{
remoteConnection = new NpgsqlConnection("Server = " + remoteData.server + "; " +
"Port = " + remoteData.port + "; " +
"User Id = " + remoteData.user + "; " +
"Password = " + remoteData.password + "; " +
"Database = " + remoteData.dataBase + "; ");

remoteConnection.Open();
}
catch (NpgsqlException ex)
{
throw;
}
catch (Exception ex)
{
remoteConnection.Close();
remoteConnection = null;
}
return remoteConnection;

}

public static bool CheckRemote()
{
if (remoteConnection != null)
{
if (remoteConnection.FullState.Equals(ConnectionState.Open))
return true;
return false;
}
return false;
}

public bool AddNewProduct(Product product)
{
try
{
DBManager.ConnectLocal();
DBManager.ConnectRemote();
object[] parameters;

if (DBManager.CheckRemote())
{
if (!DBManager.isSyncronized)
{
DBManager.Syncronize();
}

parameters = new object[8];
parameters[0] = 1;
parameters[1] = product.id;
parameters[2] = product.description;
parameters[3] = (decimal)product.salePrice;
parameters[4] = (decimal)product.cost;
parameters[5] = product.minStock;
parameters[6] = product.providerName;
parameters[7] = product.category;
DBManager.RunFunction(DBManager.remoteConnection, DBProcedures.createProduct, parameters);
}
else
{
string sql = "select * from createproduct(1, " + product.id + ", '" + product.description + "', " + (decimal)product.salePrice + ", "
+ (decimal)product.cost + ", " + product.minStock + ", '" + product.providerName + "', '" + product.category + "'); ";
parameters = new object[1];
parameters[0] = sql;
DBManager.RunFunction(DBManager.localConnection, "addsync", parameters);

DBManager.isSyncronized = false;

}

parameters = new object[6];
parameters[0] = product.description;
parameters[1] = (decimal)product.salePrice;
parameters[2] = (decimal)product.cost;
parameters[3] = product.minStock;
parameters[4] = product.providerName;
parameters[5] = product.category;

DataTable result = DBManager.RunFunction(DBManager.localConnection, DBProcedures.createProduct, parameters);
DBManager.DisconnectLocal();
DBManager.DisconnectRemote();
return true;
}
catch (Npgsql.NpgsqlException ex)
{
return false;
}
}

最佳答案

一些事情——一件不相关,两件相关。我希望这些的一些组合会有所帮助。

  1. 首先,不相关的评论。 NpgSqlStringBuilder 类是帮助揭开连接字符串神秘面纱的好工具。我知道你的作品,但因为你必须进行编辑(我会在一分钟内建议),我发现它比导航 String.Format 更容易使用,就像查询参数更容易(在最重要的是更安全),而不是通过将参数传递给查询来尝试 string.Format。此外,在您的连接字符串中声明 ApplicationName 以帮助诊断服务器上究竟发生了什么,就像您将在下一条评论中看到的那样。

  2. 如果您正在使用连接池,当连接关闭时,我认为它并没有真正关闭——甚至在数据库上也没有。如果您打开服务器管理器,您就会明白我的意思——它有点悬在那里,等待被重用。尝试在您的连接字符串中设置 pooled=false 以确保当您关闭连接时您确实关闭了它。

  3. 如果这不起作用,请尝试一个简单的查询。在您不需要它的情况下,成本将是最低的,并且毫无疑问会在您确实需要它时修复您的用例。

这里反射(reflect)了所有三个建议:

public static NpgsqlConnection ConnectRemote()
{
NpgsqlConnectionStringBuilder sb = new NpgsqlConnectionStringBuilder();
sb.ApplicationName = "Connection Tester";
sb.Host = remoteData.server;
sb.Port = remoteData.port;
sb.Username = remoteData.user;
sb.Password = remoteData.password;
sb.Database = remoteData.database;
sb.Pooling = false;

remoteConnection = new NpgsqlConnection(sb.ToString());

try
{
remoteConnection.Open();
NpgSqlCommand test = new NpgSqlCommand("select 1", remoteConnection);
test.ExecuteScalar();
}
catch (NpgsqlException ex)
{
throw;
}
catch (Exception ex)
{
remoteConnection.Close();
remoteConnection = null;
}
return remoteConnection;
}

关于c# - 即使没有互联网,NpgsqlConnection.Open 也会打开远程连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586335/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com