C# 数据访问编码需要遵循的几个规范
一,链接打开之后必须关闭,否则会占用系统空间
SqlConnection conn=new SqlConnection(CONNECTIONSTRING);
conn.open();
conn.close(); //必须成对出现
二,在创建命令对象commandText查询时尽量不要用join查询,那样会造成数据访问量加大,可编写多个函数查询多次来完成
三,在运行程序时,为防止编码出错而造成链接关闭不了,要用try--finally把代码包裹起来 ,之后不管try里面的代码出没出错都会执行到finally内的代码
SqlConnection conn=new SqlConnection(CONNECTIONSTRING);
try
{
conn.open();
SqlCommand cmd=conn.Createcommand();
cmd.CommandText="";
cmd.Executexxxxx();
}
finally
{
conn.close();
}
四,如果要从一个表中查询多条内容,可以编写一个函数返回SqlDataReader来简化代码,但还要保证链接能够关闭
static SqlDataReader GetKcDataReader(string name)
{
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from kc where WzName='" + name + "'";
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); //注意括号内给ExecuteReader添加了一个参数,用来调用的时候关闭链接
return dr;
}
static decimal GetPrice(string name)
{
decimal price = 0;
SqlDataReader dr = GetKcDataReader(name);
dr.Read();
price = Convert.ToDecimal(dr["price"]);
dr.Close(); //用dr来关闭链接
return price;
}
五,为了防止SQL注入式攻击,在C#中编写sql语句时尽量不要用单引号',而用@xx
SqlConnection conn=new SqlConnection(CONNECTIONSTRING);
try
{
conn.open();
SqlCommand cmd=conn.Createcommand();
cmd.CommandText = "delete from work where infocode=@no";
cmd.Parameters.Clear(); //编码习惯,为了防止@no声明重复,事先清除一下
cmd.Parameters.AddWithValue("@no", no);
cmd.ExecuteNonQuery();
}
finally
{
conn.close();
}
六,执行聚合函数查询的时候,用ExecuteScalar()执行SQL语句,返回首行首列中的值。
cmd.CommandText = "select count(*) from work where infocode=@no";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@no", no);
int count =(int)cmd.ExecuteScalar(); //ExecuteScalar()返回值为object类型,需强转成int类型