我以前上海的公司就3个方法搞定 所有的存错过程, 取 数据集 或者删除
public static DataView DisplayDataDetail(string strNo, string strSPName) //参数 , 存错过程命
{
Database db = DatabaseFactory.CreateDatabase("BusinessDb");
DbCommand cmd = db.GetStoredProcCommand(strSPName);
db.AddInParameter(cmd, "chrNo", DbType.String, strNo);
DataSet dst = db.ExecuteDataSet(cmd);
if (dst != null)
{
return dst.Tables[0].DefaultView;
}
else
{
return null;
}
}
新增或者修改
public static string SaveDataXML(string strXmlPara, string strSPName) 传进去XML 然后存错过程解析XML 在插入或者修改
{
Database db = DatabaseFactory.CreateDatabase("BusinessDb");
DbCommand cmd = db.GetStoredProcCommand(strSPName);
db.AddInParameter(cmd, "chrXML", DbType.String, strXmlPara); //XML组合文档
db.AddOutParameter(cmd, "chrReturn", DbType.String, 100);
try
{
db.ExecuteNonQuery(cmd);
return db.GetParameterValue(cmd, "chrReturn").ToString();
}
catch (Exception ex)
{
return ex.Message;
}
}
执行一条UPDATE、INSERT 或 DELETE 语句 返回影响的行数
public static string ExcuteSql(string strSql)
{
Database db = DatabaseFactory.CreateDatabase("BusinessDb");
DbCommand cmd = db.GetSqlStringCommand(strSql);
try
{
return db.ExecuteNonQuery(cmd).ToString();
}
catch (Exception ex)
{
return ex.Message;
}
}
这3个差不多就搞定了所有基本的需求, 但是有个问题, 存错过程里也是拼接的SQL语句 然后exec执行下容易被注入。 你们说的SqlParameter 确实很不方便。如果用这个 每个程序员都要根据自己的需求 去复制粘贴参数 赋值。 公司也有 具体的使用,但是基本没什么人用的
public DataView GetDataView(string strProcName, SqlParameter[] sqlpam)
{
m_strConn = ConfigurationSettings.AppSettings["ConnectionString"].ToString();
sqlcon = new SqlConnection(m_strConn);
DataSet dst = new DataSet();
SqlDataAdapter sqlada = new SqlDataAdapter();
if (sqlpam != null)
sqlada.SelectCommand = BuildQueryCommand(strProcName, sqlpam);
else
sqlada.SelectCommand = BuildQueryCommand(strProcName, null);
try
{
if (sqlcon.State == ConnectionState.Open) sqlcon.Close();
sqlcon.Open();
sqlada.SelectCommand.CommandTimeout = 0;
sqlada.Fill(dst);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
try
{
sqlcon.Close();
}
catch { }
}
if (dst.Tables.Count > 0)
return dst.Tables[0].DefaultView;
else return null;
}
private SqlCommand BuildQueryCommand(string strProcName, SqlParameter[] sqlpam)
{
SqlCommand sqlcmd = new SqlCommand();
sqlcmd.CommandType = CommandType.StoredProcedure;
sqlcmd.CommandText = strProcName;
sqlcmd.Connection = sqlcon;
if (sqlpam != null)
{
for (int i = 0; i < sqlpam.GetLength(0); i++)
{
sqlcmd.Parameters.Add(sqlpam.GetValue(i));
}
}
return sqlcmd;
}
但是这样 公司的存储过程就没办法模板化 。 比如公司取东西 的存储过程都定义好的, 开发很快。 所有人接手也很快。 只要读懂公司的想法, 所有存储过程拿来就写
存储过程 查询的
新增和修改
。
删除就不截图了, 跟查询差不多
这么模板化,公司开发任何项目 都很快。 架构搭好, 初级程序员开发很快。 但是唯一缺点就是SQL注入这。 因为存储过程是拼装查询。而且还可以分出一个人就写SQL存储过程基本的增删改查。 如果用SqlParamete配合最后一个方法开发起来传参数很墨迹。 尤其在新增的时候, 那参数有的时候好几十列简直累死,用XML序列号进去就很简单。新手用SqlParamete上手也慢。 也不好分一个人就写存储过程。
希望大家结合这来聊聊针对主要的开发模式优缺点, 和怎么避免SQL注入