刚转学c#,写了一点点代码 ,请指点下,我这样写行不?
最好多发表自己的意见。。
万分感谢!using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;namespace Member_database
{
public class sqldbconnection
{
public static SqlConnection mysqlcon = new SqlConnection("server=.;userid=sa;password=123;database=member");
public void Mysql_conOpen()
{
try{
if (mysqlcon.State == ConnectionState.Open){
}
if (mysqlcon.State == ConnectionState.Closed){
mysqlcon.Open();
}
}catch (Exception ex){
if (ex!= null) mysqlcon = null;
}
} public void Mysql_conClose()
{
try{
if (mysqlcon.State == ConnectionState.Open){
mysqlcon.Close();
mysqlcon.Dispose();
}
if (mysqlcon.State == ConnectionState.Closed){
mysqlcon.Dispose();
}
}catch (Exception ex){
if (ex != null) mysqlcon = null;
}
}
public static SqlDataReader SqlReader(string SqlCmd)
{
SqlDataReader sqldr = null;
// Mysql_conOpen;
SqlCommand cmd = new SqlCommand(SqlCmd, mysqlcon);
try{
sqldr = cmd.ExecuteReader();
}catch (Exception ex){
if (ex != null) sqldr = null;
}
return sqldr;
} public static SqlCommand Ex_SqlCmd(string sqlcmd)
{
SqlCommand cmd = null;
// Mysql_conOpen();
cmd = new SqlCommand(sqlcmd, mysqlcon);
try{
cmd.ExecuteNonQuery();
}catch (Exception ex){
if (ex != null) cmd = null;
}
return cmd;
} public static DataTable Read_table(string sqlcmd)
{
DataTable dt = null;
dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(sqlcmd, mysqlcon);
try{
da.Fill(dt);
}catch (Exception ex){
if (ex != null) dt = null;
}
return dt;
} public static DataSet Read_Dataset(string sqlcmd)
{
DataSet ds = null;
ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sqlcmd, mysqlcon);
try{
da.Fill(ds);
}catch (Exception ex){
if (ex != null) ds = null;
}
return ds;
}
}
}
最好多发表自己的意见。。
万分感谢!using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;namespace Member_database
{
public class sqldbconnection
{
public static SqlConnection mysqlcon = new SqlConnection("server=.;userid=sa;password=123;database=member");
public void Mysql_conOpen()
{
try{
if (mysqlcon.State == ConnectionState.Open){
}
if (mysqlcon.State == ConnectionState.Closed){
mysqlcon.Open();
}
}catch (Exception ex){
if (ex!= null) mysqlcon = null;
}
} public void Mysql_conClose()
{
try{
if (mysqlcon.State == ConnectionState.Open){
mysqlcon.Close();
mysqlcon.Dispose();
}
if (mysqlcon.State == ConnectionState.Closed){
mysqlcon.Dispose();
}
}catch (Exception ex){
if (ex != null) mysqlcon = null;
}
}
public static SqlDataReader SqlReader(string SqlCmd)
{
SqlDataReader sqldr = null;
// Mysql_conOpen;
SqlCommand cmd = new SqlCommand(SqlCmd, mysqlcon);
try{
sqldr = cmd.ExecuteReader();
}catch (Exception ex){
if (ex != null) sqldr = null;
}
return sqldr;
} public static SqlCommand Ex_SqlCmd(string sqlcmd)
{
SqlCommand cmd = null;
// Mysql_conOpen();
cmd = new SqlCommand(sqlcmd, mysqlcon);
try{
cmd.ExecuteNonQuery();
}catch (Exception ex){
if (ex != null) cmd = null;
}
return cmd;
} public static DataTable Read_table(string sqlcmd)
{
DataTable dt = null;
dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(sqlcmd, mysqlcon);
try{
da.Fill(dt);
}catch (Exception ex){
if (ex != null) dt = null;
}
return dt;
} public static DataSet Read_Dataset(string sqlcmd)
{
DataSet ds = null;
ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sqlcmd, mysqlcon);
try{
da.Fill(ds);
}catch (Exception ex){
if (ex != null) ds = null;
}
return ds;
}
}
}
Mysql_conOpen里有一个空分支。(当然考虑到.NET的代码优化问题不大)
Ex_SqlCmd应当返回ExecuteNonQuery()的返回值
使用SQLCommand或DataAdapter的地方最好能用using语句块或手动Dispose。(当然也可以信任垃圾回收)
如果函数无论如何都要返回的话return最好写在finally块中。
try{
if (mysqlcon.State == ConnectionState.Open){
}
if (mysqlcon.State == ConnectionState.Closed){
mysqlcon.Open();
}
}catch (Exception ex){
if (ex!= null) mysqlcon = null;
}
这不多余的try catch 吗?
第一:对数据库的操作相对来说是一个很慢长的过程,只使用一个连接,在多线程处理的时候,造成所有线程挂起等待。
第二:在b/s结构的软件中,请求处理往往是多线程的,对同一连接的操作,如果不作串行处理,对数据库的操作很容易造成混乱(如:事务处理,连接Close, 连接open,DataReader对应Connection等等)
第三:大部分ado.net的实现,一般都在内部实用了连接池。连接池里有许多连接,而我们却只用了其中的一个,太浪费资源了。
(2)连接字符串 userid --> uid
(3)Ex_SqlCmd方法
返回结果 可以是成功与否
(4)Read_table方法
DataTable dt = null;
dt = new DataTable();
改为一行(简洁):
DataTable dt = new DataTable();
(5)Read_Dataset
DataSet ds = null;
ds = new DataSet();
改为一行(简洁):
DataSet ds = new DataSet();
具体代码段:
try{
if (mysqlcon.State == ConnectionState.Open){ // 多余
}
if (mysqlcon.State == ConnectionState.Closed){
mysqlcon.Open();
}
}catch (Exception ex){
if (ex!= null) mysqlcon = null; // 多余, ex肯定 != null
} // .....个人意见:很多代码段我觉得莫名其秒。
if (mysqlcon.State == ConnectionState.Closed){
mysqlcon.Dispose(); // 已经dispose掉了,mysqlcon就不能重用了。再调用Mysql_conOpen()就会有问题
} 下面方法,如果连接没有打开,支持肯定会出错。
SqlReader
Ex_SqlCmd
Read_table
Read_dataset
ExecuteReader(CommandBehavior.CloseConnection);
using (SqlDataReader sqldr= SqlCmd.ExecuteReader())
{
}
SqlCmd.Dispose();
catch (Exception ex)
最好改为cath(SqlException ex)
}
这句是多余的,看着有些别扭SqlReader在连接关闭时,返回的值也就会不复存在,所以不适宜放在此类中
这就好象,你明知道你的肾脏有问题导致脸色鸡黄,你却只是用擦脸油去遮盖,这种事情做多了以后,系统出了问题,却再也找不到问题的根节
我记得有本书上说到了这一点,印象中应该是:核心编程 或者 .Net框架设计
什么时候cath(Exception ex)可以用呢
在遇到无法解决的问题,导致程序崩溃的时候,也就是说你的catch块里应该只有类似的代码
cath(Exception ex)
{
Exist(0);
}
个人意见,仅供参考
catch (Exception ex){
if (ex!= null) mysqlcon = null;
}
这个判断没有意义,ex肯定不会为null的
不要一直打开着连接。用using结构比较好,连接用完就释放掉
using (SqlConnection Connection=new SqlConnection(...))
{
...
}
否则控制会很烦,
你把异常给吃掉会有很多麻烦
比如这么三条语句1 Mysql_conOpen() ;
2 执行dataadapter/command
3 Mysql_conClose();如果1 Mysql_conOpen()发生了异常会发生什么?
catch (Exception ex){
if (ex!= null) mysqlcon = null;
} 你直接把异常吃掉而且连接=null
于是程序继续运行,执行2和3,因为连接=null 所以 2的时候一定会出错了,所以你又要try
{
1 Mysql_conOpen() ;
2 执行dataadapter/command
3 Mysql_conClose();
}
catch
{
...
}那Mysql_conOpen里异常捕获就没有意义了,还不如不写还有如果再开了事务,
1 Mysql_conOpen() ;
2 执行dataadapter/command
3 Mysql_conClose();2里开了事务,但开完后又发生了异常,所以还是要trytry
{
1 Mysql_conOpen() ;
2 执行dataadapter/command
3 Mysql_conClose();
}
finally
{
if 开了事务?
回滚事务
}代码看起来还是很累赘,内部异常捕获还是没用所以这样比较好using (SqlConnection Connection=new SqlConnection(...))
try
{
Connection.Open(); // 如果是dataadapter.fill数据连open都不需要
...
}
catch(Exception e)
{
比如事务回滚
}