我为.NET Compact Framework和本地SQL Server编写了我自己的小型静态DAL类,它可以满足我的需求; GetTable(SQL,params),Exec(SQL,params),ExecScalar(SQL,Params)等。我想通过SQL做所有事情,这就是我如何滚动,如果有更好的方法来处理C#中的SQL连接 - 除了ORM-请告诉我。以下是我在DAL类下公开访问SQLConnection对象的方法:
public static SqlConnection Conn()
{
if (ConnStr == "")
Defaults();
try
{
if (conn == null)
conn = new SqlConnection(ConnStr);
if (conn.State != ConnectionState.Open)
{
conn.Open();
Execute("SET DATEFORMAT DMY",null);
}
return conn;
}
catch
{
System.Windows.Forms.MessageBox.Show("Unable to connect to DB");
}
return null;
}
我编码的应用程序正在移动Windows CE 5.0上使用。问题是,当用户从无线网络断开连接然后重新连接时,if (conn.State != ConnectionState.Open)
行不会被执行,应用程序会提供一般数据库异常,没有别的。我该如何解决这个问题?
编辑:由GetTable()等函数引发异常。我可以在每个函数中使用try-catch来处理它,但不幸的是在Compact Framework中,每个sql错误都被命名为“SqlException”。如何区分连接问题和查询问题?
答案 0 :(得分:1)
您可以使用System.Net.NetworkInformation.NetworkInterface
类检查网络是否可用吗?
您可以使用GetIsNetworkAvailable()检查.NET 2.0中的网络连接:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
要监控IP地址的变化或网络可用性的变化,请使用NetworkChange类中的事件:
System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
答案 1 :(得分:1)
您可以捕获SqlException并检查ErrorCode属性以查看它是否是与连接丢失相关的错误(即错误消息类似于“无法连接到服务器”并且具有特定错误码)。
答案 2 :(得分:1)
如果您正在处理移动应用程序,您将永远无法依赖网络访问。
更好的方法是让所有人都访问本地数据库(SQL CE,Sqlite),然后将更改(.Net同步服务将帮助解决)与主数据库同步。
这是否适用于您的应用程序的数据量是另一回事。
答案 3 :(得分:1)
我已经通过为每个查询使用新的SqlConnection而不是为所有内容共享一个静态SqlConnection来修复它。
答案 4 :(得分:0)
using (SqlConnection connectionNEWDB = new SqlConnection(
myConnectionStringNEWDB))
{
while (connectionNEWDB.State != ConnectionState.Open)
{
try
{
connectionNEWDB.Open();
}
catch (SqlException ex)
{
System.Threading.Thread.Sleep(1000);
}
}
string droptablefirst = "DROP TABLE " + t1 + ";";
SqlCommand command33 = new SqlCommand(droptablefirst, connectionNEWDB);
try
{
command33.ExecuteNonQuery();
}
catch (SqlException ex)
{
// Console.WriteLine("Create Class ex.Message = " + ex.Message + " connection string:" + myConnectionStringNEWDB);
// treeView1.Invoke(new Add44(Add4), new object[] { (indexstart / 4) + 1, " error at constr: " + myConnectionStringNEWDB + " Message:" + ex.Message + " Source:" + ex.Source });
// MessageBox.Show(" error at constr: " + myConnectionStringNEWDB + " Message:" + ex.Message + " Source:" + ex.Source + " query: " + t1q);
}
command33.Dispose();
}