今天看了牛腩,整体看下来,感觉理解了很多代码为什么这么用,为什么要通过参数来传值或址,以下是总结的一些小知识,仅供参考
- SqlConnection()参数是传数据库配置的字符串,如下:
server=DESKTOP-RN1CDVF;database=newssystem;uid=sa;pwd=123
- SqlCommand()参数是需要执行的语句(增删改)和SqlConnection类型的数据
SqlCommand cmd = new SqlCommand(cmdText, GetConn());
- ExecuteNonQuery返回受影响行数
int res = cmd.ExecuteNonQuery();
-
SqlCommand cmd.Paramenters.AddRange(SqlParamter[])---括号里面添加的是SqlParamter类型的数组,可以通过外面传参数,传进来
public DataTable ExecuteQuery(string cmdtext, SqlParameter[] paras, CommandType ct)
{
cmd.Parameters.AddRange(paras);
}
-
SqlCommand cmd.CommandType有三种,只说两种:CommandType.Text和CommandType.StoredProcedure,第一种执行SQL文本命令,第一种执行存储过程的命令,再调用的时候声明
-
从数据库中读取出数据赋值给SqlDataReader类的对象
SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
一、将open和close提取出来
第一种:(保存错误都会执行finally里面的代码)
public int ExecuteNonQuery(string cmdText, CommandType ct)
{
int res;
try
{
SqlCommand cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
}
catch (Exception)
{
throw;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
//连接语句
return res;
}
第二种:(执行到return,就会释放资源)
public int ExecuteNonQuery(string cmdtext, SqlParameter[] paras, CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdtext, GetConn()))
{
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
return res;
}
二、修改数据库连接的字符串
将其添加到配置文件中,如
<appSettings/>
<connectionStrings>
<add name="connStr" connectionString ="server=DESKTOP-RN1CDVF;database=newssystem;uid=sa;pwd=123"/>
</connectionStrings>
接下来我们要引用
using System.Configuration;
然后再SQLHlper构造函数中写
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
三、如何避免SQL的注入
上图就是注入,因为拼接字符引起,黑客可以通过超过你的设置的数据类型长度可以看到漏洞,如果你长度是20,可以通过上面的方法超过长度
如何做:
将增删改的数据改为@XXX,设置为实体的属性,由实体的属性进行赋值。