最近做了一个每天在规定的时间短开网络连接的windows服务。
首先用SQLite做了两个表一个是netconnection填写网络连接的信息(我是单独拉的联通2M带宽,adsl上网)。一个netweek存放平时和周末两种情况下断网的时间。
首先写了一个封装SQLite操作的简单类(参考网络上的内容):
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SQLite;
namespace autonet
class Db
SQLiteConnection conn ;
SQLiteCommand com;
public Db(string strConn)
conn = new SQLiteConnection("Data Source=" + strConn);
com = conn.CreateCommand();
conn.Open();
public void Open()
if (conn.State != ConnectionState.Open)
conn.Open();
}
public void Close()
if (conn.State != ConnectionState.Closed)
conn.Close();
}
public void DoNoneSQL(string strnonesql)
com.CommandText = strnonesql;
com.ExecuteNonQuery();
public int DoIntSQL(string strdointsql)
int t;
com.CommandText = strdointsql;
t= com.ExecuteNonQuery();
return t;
public void DoNoneSQL(string strnonesql, SQLiteParameter[] pars)
ParamentsCommand(strnonesql, pars);
DoNoneSQL(strnonesql);
public SQLiteDataReader DoDataReader(string strdatareadersql)
com.CommandText = strdatareadersql;
return com.ExecuteReader();
public SQLiteDataReader DoDataReader(string strdatareadersql, SQLiteParameter[] pars)
ParamentsCommand(strdatareadersql, pars);
return DoDataReader(strdatareadersql);
public DataTable DoDataTable(string strdatatablesql)
com.CommandText = strdatatablesql;
SQLiteDataAdapter sda = new SQLiteDataAdapter(com);
DataTable db = new DataTable();
sda.Fill(db);
return db;
public DataTable DoDataTable(string strdatatablesql, SQLiteParameter[] pars)
ParamentsCommand(strdatatablesql, pars);
return DoDataTable(strdatatablesql);
public void BeginTrans()
conn.BeginTransaction();
public void Commit()
conn.BeginTransaction().Commit();
public void ParamentsCommand(string strcontext, SQLiteParameter[] compars)
com.CommandText = strcontext;
if (compars != null)
foreach (SQLiteParameter par in compars)
if (par.Value == null)
par.Value = DBNull.Value;
com.Parameters.Add(par);
}
public SQLiteParameter MakeSQLiteParameter(string name, DbType type, object value)
SQLiteParameter par = new SQLiteParameter(name,type);
par.Value = value;
return par;
}
}
然后封装简单的连接拨号和断开拨号程序:
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace autonet
class modemnet
private static Mutex mutex = new Mutex();
private Process pro = new Process();
private int Desc;
private int connectcount;//连接次数0表示断开1表示连接
private int disconnectcount;//断开次数0表示连接1表示断开
private bool status;//true:connected false:not connected
private string connname;//连接名字
private string connusername;//连接帐号用户
private string connpwd;//连接密码
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
public string NetName
set { this.connname = value; }
public string UserName
set { this.connusername = value; }
public string Pwd
set { this.connpwd = value; }
public int ConnectNum
get{ return connectcount;}
public int DisConnectNum
get { return disconnectcount; }
private bool isconnecting()
status = InternetGetConnectedState(out Desc, 0);
return status;
private bool isactive(string strProName)
Process[] ps = Process.GetProcessesByName(strProName);
if (ps.Length > 0)
return true;
else
return false;
}
public void StopConn()
if (isconnecting())
lock (pro)
if (!isactive("rasdial"))
mutex.WaitOne();
//pro.StartInfo.FileName = "rundll32.exe";
//pro.StartInfo.Arguments = "iedkcs32.dll CloseRASConnections";
pro.StartInfo.FileName = "rasdial.exe";
pro.StartInfo.Arguments = this.connname + @" /DISCONNECT";
pro.Start();
mutex.ReleaseMutex();
disconnectcount++;
connectcount--;
}
pro.Close();
}
public void startconn()
if (!isconnecting())
lock (pro)
if (!isactive("rasdial"))
mutex.WaitOne();
pro.StartInfo.FileName = "rasdial.exe";
pro.StartInfo.Arguments = this.connname + " " + this.connusername + " " + this.connpwd;
pro.Start();
mutex.ReleaseMutex();
connectcount++;
disconnectcount--;
}
pro.Close();
}
}
后面就是简单的调用了,就是 0.开始先连接网络,然后 1.检查是否需要执行该功能(在netconnection中有字段表示) 2.是否到达配置的断网时间 3.1和2都
true,执行断网,否则连接网络
在过程中对SQLite里面执行update语句让我检查了好久,首先是DB文件找错了,执行后检查都结果总是不对,后来发现这个问题后执行update还是不对。愁。 原来是在一个连接下事务不能嵌套。
拨号程式的名字如果带空格就要用双引号引起来执行命令
windows服务中若用timer控件是System.Timers 下的timer.