做项目的一点收获之二
写注册表
程序中要求有个开机自动运行的备选功能,在网上查了查,大概有三种方法实现开机自动运行:开始菜单中的“启动”组,Windows服务,写注册表。我选择了写注册表,代码如下:
if (this.checkBox1.Checked==true)
{
RegistryKey Reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
string sFilePath = Application.ExecutablePath;
Reg.SetValue("DBExchanger",sFilePath);
}
else
{
RegistryKey Reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
Reg.DeleteValue("DBExchanger",true);
}
{
RegistryKey Reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
string sFilePath = Application.ExecutablePath;
Reg.SetValue("DBExchanger",sFilePath);
}
else
{
RegistryKey Reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
Reg.DeleteValue("DBExchanger",true);
}
使用委托
因为不能够向线程传递参数(可以定义一个类,准备好线程要使用的数据,然后把该类的方法传递给线程委托),也不会返回值,因此要想从线程返回值,可以使用委托。委托使用方法见C#中的代理(Delegate)
检测网络
程序要求在连接数据库之前要先检测网络是否连通,所以这里又用到了基于套接字的编程。
public bool CheckNet(string netid,int port)
{
bool flag=true;
string ip= netid.ToString();
IPAddress myIP = IPAddress.Parse(ip);
//根据给定的IP地址字符串,处理IPAddress实例
try
{
EndPoint ep=new IPEndPoint(myIP,port);
Socket sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sock.Connect(ep);
if (sock.Connected)
{
flag=true;
}
}
catch
{
flag=false;
}
return flag;
}
{
bool flag=true;
string ip= netid.ToString();
IPAddress myIP = IPAddress.Parse(ip);
//根据给定的IP地址字符串,处理IPAddress实例
try
{
EndPoint ep=new IPEndPoint(myIP,port);
Socket sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sock.Connect(ep);
if (sock.Connected)
{
flag=true;
}
}
catch
{
flag=false;
}
return flag;
}
最小化到系统托盘
设置窗体的SizeChanged事件,如下 :
private void Form1_SizeChanged(object sender, System.EventArgs e)
{
if (this.WindowState==System.Windows.Forms.FormWindowState.Minimized)
{
this.Hide();
this.notifyIcon1.Visible=true;
}
}
{
if (this.WindowState==System.Windows.Forms.FormWindowState.Minimized)
{
this.Hide();
this.notifyIcon1.Visible=true;
}
}
MySql参数化查询
这个项目针对的是MySql数据库,以前没有用过,所以在写参数化查询语句还是像写SQL Server和Access参数化查询语句时一样,例如一条查询语句:
cmmd.CommandText="Update TableName Set Name=@Name,Data=@Data Where ID=@ID";
cmmd.Parameters.Add("@"+ClmName[0],MySql.Data.MySqlClient.MySqlDbType.String);
cmmd.Parameters[0].Value = "Peter"
cmmd.Parameters.Add("@"+ClmName[1],MySql.Data.MySqlClient.MySqlDbType.LongBlob);
cmmd.Parameters[1].Value = ByteArrayData;
cmmd.Parameters.Add(MySql.Data.MySqlClient.MySqlDbType.Int32);
cmmd.Parameters[0].Value = "20051102"
cmmd.Parameters.Add("@"+ClmName[0],MySql.Data.MySqlClient.MySqlDbType.String);
cmmd.Parameters[0].Value = "Peter"
cmmd.Parameters.Add("@"+ClmName[1],MySql.Data.MySqlClient.MySqlDbType.LongBlob);
cmmd.Parameters[1].Value = ByteArrayData;
cmmd.Parameters.Add(MySql.Data.MySqlClient.MySqlDbType.Int32);
cmmd.Parameters[0].Value = "20051102"
但就是怎么都更新不了,也没有错误信息,后来经人指点才知道,原来MySql的参数占位符是"?",我把cmmd.CommandText中的"@"改成"?"后就可以了。