关于直接写SQL语句和使用Parameter参数良种方式的迷惑
/// <summary>
/// 增加一条数据
/// </summary>
public string Add(SalesServer.Model.Inventory model)
{
model.cInvCode=GetMaxId();
StringBuilder strSql=new StringBuilder();
strSql.Append( "insert into Inventory( ");
strSql.Append( "cInvCode,cInvName,cBarCode,cInvStd,cInvClass,cComUnit,cInvProperty1,cInvProperty2,cInvProperty3,Memo) ");
strSql.Append( " values ( ");
strSql.Append( "@cInvCode,@cInvName,@cBarCode,@cInvStd,@cInvClass,@cComUnit,@cInvProperty1,@cInvProperty2,@cInvProperty3,@Memo) ");
SqlParameter[] parameters = {
new SqlParameter( "@cInvCode ", SqlDbType.Char,8),
new SqlParameter( "@cInvName ", SqlDbType.Char,100),
new SqlParameter( "@cBarCode ", SqlDbType.Char,50),
new SqlParameter( "@cInvStd ", SqlDbType.Char,50),
new SqlParameter( "@cInvClass ", SqlDbType.Char,10),
new SqlParameter( "@cComUnit ", SqlDbType.Char,20),
new SqlParameter( "@cInvProperty1 ", SqlDbType.Char,50),
new SqlParameter( "@cInvProperty2 ", SqlDbType.Char,50),
new SqlParameter( "@cInvProperty3 ", SqlDbType.Char,50),
new SqlParameter( "@Memo ", SqlDbType.Char,100)};
parameters[0].Value = model.cInvCode;
parameters[1].Value = model.cInvName;
parameters[2].Value = model.cBarCode;
parameters[3].Value = model.cInvStd;
parameters[4].Value = model.cInvClass;
parameters[5].Value = model.cComUnit;
parameters[6].Value = model.cInvProperty1;
parameters[7].Value = model.cInvProperty2;
parameters[8].Value = model.cInvProperty3;
parameters[9].Value = model.Memo;
DbHelperSQL.ExecuteSql(strSql.ToString(),parameters);
return model.cInvCode;
}
------------------------------
/// <summary>
/// 增加一条数据
/// </summary>
public string Add(SalesServer.Model.Inventory model)
{
model.cInvCode=GetMaxId();
StringBuilder strSql=new StringBuilder();
strSql.Append( "insert into Inventory( ");
strSql.Append( "cInvCode,cInvName,cBarCode,cInvStd,cInvClass,cComUnit,cInvProperty1,cInvProperty2,cInvProperty3,Memo ");
strSql.Append( ") ");
strSql.Append( " values ( ");
strSql.Append( " ' "+model.cInvCode+ " ', ");
strSql.Append( " ' "+model.cInvName+ " ', ");
strSql.Append( " ' "+model.cBarCode+ " ', ");
strSql.Append( " ' "+model.cInvStd+ " ', ");
strSql.Append( " ' "+model.cInvClass+ " ', ");
strSql.Append( " ' "+model.cComUnit+ " ', ");
strSql.Append( " ' "+model.cInvProperty1+ " ', ");
strSql.Append( " ' "+model.cInvProperty2+ " ', ");
strSql.Append( " ' "+model.cInvProperty3+ " ', ");
strSql.Append( " ' "+model.Memo+ " ' ");
strSql.Append( ") ");
DbHelperSQL.ExecuteSql(strSql.ToString());
return model.cInvCode;
}
这两种方式究竟除了写法不同而已,本质有些什么区别,那种更好?我以前为了简单就直接写的SQL语句,有什么弊端吗?TKS
[解决办法]
个人觉得两点..
第一,用参数写起来,看起来会更清晰,且不容易出错,如果是直接拼sql语句,字段多的话,就很容易出现一些不必要的错误,且不容易查找...
第二,用参数方式,也更加安全,可以防止sql注入,关于什么是sql注入,可以再上网找些资料看看..
[解决办法]
比如有一个二进制的字段值要插入,你怎么用字符串拼起来!!!
另外用SqlParameter来传参数在数据类型上是精确的!
[解决办法]
一般大家都喜欢 "拼 "那个SQL语句,比如
string name= "张三 ";
string SQL= "select * from 表名 where name = ' "+name " ' ";
其实ADO.NET里的 parameters 称为参数,也就是你那个string name成为了一个参数进去
比如 Comment cmd = new Comment(select * from 表名 where name=?);
cmd.Parameters.Add( "@name ",类型,大小);
cmd.Parameters[ "@name "]=...
上面那个问号(?)就是参数 代替了你 "拼 "的出的SQL语句中的name
这样是ADO.NET中推荐的 不仅使安全系数增强了,而且代码可读性也大大提高了
大家一看到parameters就知道,必须要有参数声明,
还要给参数赋值(也就等于你 "拼的那个SQL语句了)
但参数还可以有输出参数,输出参数是另外一回事
[解决办法]
就像liujia_0421(SnowLover) 说的
第一 代码看起来更加清晰
第二 使用参数模式 可以 一定程度上防止SQL注入..
第三 类型匹配 更加清晰 使用上更灵活