怎样改进三层 以前用的三层都是UI、DAL、BLL再加上Model辅助,所有的增删改查都是执行的数据库的存储过程。现在客户要求不要使用存储过程,用SQL语句。请问把SQL写在哪里,要不要单独写在一个文件里,还是写在BLL,UI,DAL中的某一个,写在哪里比较好,比较妥当容易维护 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 写在DAL 里面有个SQLHELP 其实这和你的存储过程写法基本一样的 你的存储过程要穿参数 而SQL防止SQL注入 也要用参数化查询 以前你是传一个 存储过程名字 这次只不过是一个SQL语句 ~~ SQL要写在UI层,一般人我不告诉他的 设置你的 CommandType 为 CommandType.Text 这是执行SQL语句的~~ sqlhelper类一般DAL层就是操作数据库的,sqlhelper这个类网上很多,里面是很多执行各种SQL语句和存储过程的方法,比如你现在要写一句select * from Users 查询所有的用户,那么你在DAL这个层里面建一个代表Users各种数据库操作的类,里面通过传入各种SQL语句调用sqlhelper这个类,然后返回各种你要的东西,然后BLL层就是调用了,这个你应该都懂了吧 恩,也就是原来是执行存储过程,现在是执行SQL语句。不过存储过程执行,要传递参数,而SQL基本不需要了吧,在SQL中直接写死,这样做怎么样???怎样防SQL注入??? 引用 5 楼 swde125 的回复:sqlhelper类一般DAL层就是操作数据库的,sqlhelper这个类网上很多,里面是很多执行各种SQL语句和存储过程的方法,比如你现在要写一句select * from Users 查询所有的用户,那么你在DAL这个层里面建一个代表Users各种数据库操作的类,里面通过传入各种SQL语句调用sqlhelper这个类,然后返回各种你要的东西,然后BLL层就是调用了,这个你应该都懂了吧……恩,也就是原来是执行存储过程,现在是执行SQL语句。不过存储过程执行,要传递参数,而SQL基本不需要了吧,在SQL中直接写死,这样做怎么样???怎样防SQL注入??? 你SQL语句是不用参数的?难道你要where的时候不通过web层取到页面输入你就能知道用户要where什么? 防止SQL注入,我目前知道的就三种,一种是通过你自己写的类过滤掉危险字符再传入SQL里面,一种就是存储过程,一种就是通过SqlParameter参数化 我觉得你该去看看基础的在做。。SQL注入可以过滤关键字。 DAL啊在DAL里面加一个 sqlhelper然后 写方法 DAL BLL 都可以 习惯写哪就写哪 你可以在dal只做sql执行 打开连接什么的 bll写一些业务逻辑方法 把sql传过去 也可以把sql写在dal bll只去调用 都无所谓 就楼主所说的三层,sql语句当然应该放在dal层建议楼主了解下为什么使用分层,就不会问这种问题了 写个XML配置文件里封装起来。。DAL也可以 我一般吧T-SQL 写在逻辑层 数据层 貌似就一个SqlHelp.cs 了 请问把SQL写在哪里,要不要单独写在一个文件里,还是写在BLL,UI,DAL中的某一个,写在哪里比较好,比较妥当容易维护---------------推荐SQL写在一个单独的文件里面,甚至调用存储过程的语句都可以写在一个单独的文件里面,还可以开发一个工具根据这个SQL文件自动生成DAL代码,这就是SQL-MAP思想。PDF.NET数据开发框架实现了这个思路,开发非常方便,想用SQL语句,存储过程,甚至ORM都由你。再给楼主一些参考:关于三层架构,不得再说一说不使用DalFactory和IDAL,支持多种数据库应用的架构 SQL你可以写在DAL里,针对Model的部分你也可以写在Model里,将字段映射一下BLL应该只操作实体(强类型)比较好防SQL注入用SqlCommand+SqlParameter传参就好了 建议建一个SqlHelper公共类,在DAL层调用 SQL版DBHelpusing System;using System.Collections.Generic;using System.Text;using System.Data.SqlClient;using System.Configuration;using System.Data;namespace MX.DAL{ public class DBHelper { private static SqlConnection _conn; static DBHelper() { if (_conn == null) { string strConn = ConfigurationManager.ConnectionStrings["SQLConn"].ConnectionString; _conn = new SqlConnection(strConn); } } public static bool ExecuteSql(string sql) { try { if (_conn.State != ConnectionState.Open) _conn.Open(); SqlCommand cmd = _conn.CreateCommand(); cmd.CommandText = sql; cmd.ExecuteNonQuery(); return true; } catch { return false; } finally { _conn.Close(); } } public static DataTable GetTable(string sql, string tableName) { try { SqlDataAdapter adp = new SqlDataAdapter(sql, _conn); DataSet ds = new DataSet(); adp.Fill(ds, tableName); return ds.Tables[0]; } catch { return null; } } public static DataTable GetTableByPages(string sql, int startIndex,int pagesize,string tableName) { try { SqlDataAdapter adp = new SqlDataAdapter(sql, _conn); DataSet ds = new DataSet(); adp.Fill(ds, startIndex, pagesize, tableName); return ds.Tables[0]; } catch { return null; } } public static SqlDataReader GetReader(string sql) { try { if (_conn.State != ConnectionState.Open) _conn.Open(); SqlCommand cmd = _conn.CreateCommand(); cmd.CommandText = sql; return cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch { return null; } } public static object GetScalar(string sql) { try { if (_conn.State != ConnectionState.Open) _conn.Open(); SqlCommand cmd = _conn.CreateCommand(); cmd.CommandText = sql; return cmd.ExecuteScalar(); } catch { return null; } finally { _conn.Close(); } } }} 在DAL里面用数据库的拼接 StringBuilder str;srt.append("");带参数的拼接sql语句这样也是比较安全的 SQL注入攻击防止:(1)不要全表查询数据(2)不要建立索引(3)分区查询(4)显示必要字段--注意:这是比较简单的方法 NHibernate还不如直接linq to sql来得快 DAL层,一个简单的方法把你的存储过程复制出来就 http://social.msdn.microsoft.com/Forums/zh-CN/2212/thread/b43087e2-4071-4949-b24e-5d12bdb14516 大家说说,还是用三层+工厂模式,来扩展使用多种数据库吗?客户是要用SqlServer的,并没有移植到Oracle等的打算 客户既然不需要,就不要加了,加了反而会成为鸡肋直接SqlHelper去操作SqlServer好了写在DAL里了,把存储过程名换为SQL语句 Jquery 疑惑 帮忙解释一下这些代码的意思! 一个统计报表的问题,高手帮下忙啊,在线坐等,加班中。。。 控件间隔如何设置 循环的在分页的DataGrid中添加数据,怎么设置 关于 showModalDialog 数据显示问题 SQL SERVER作业中的步骤命令语句 200分 征集 点击一个toolbar 上的删除 按钮弹出一个删除确认的对话框 asp.net 2005 发布时候的奇怪问题. 刷新页面!! C#读取远程服务器上的所以xml文件 高手帮帮忙~! 感谢~! 点击上面一个datalist中hyperlink绑定的值,并更新下面一个datalist,怎么做呢
恩,也就是原来是执行存储过程,现在是执行SQL语句。不过存储过程执行,要传递参数,而SQL基本不需要了吧,在SQL中直接写死,这样做怎么样???怎样防SQL注入???
恩,也就是原来是执行存储过程,现在是执行SQL语句。不过存储过程执行,要传递参数,而SQL基本不需要了吧,在SQL中直接写死,这样做怎么样???怎样防SQL注入???
SQL注入可以过滤关键字。
你可以在dal只做sql执行 打开连接什么的 bll写一些业务逻辑方法 把sql传过去
也可以把sql写在dal bll只去调用 都无所谓
---------------
推荐SQL写在一个单独的文件里面,甚至调用存储过程的语句都可以写在一个单独的文件里面,还可以开发一个工具根据这个SQL文件自动生成DAL代码,这就是SQL-MAP思想。
PDF.NET数据开发框架实现了这个思路,开发非常方便,想用SQL语句,存储过程,甚至ORM都由你。
再给楼主一些参考:
关于三层架构,不得再说一说
不使用DalFactory和IDAL,支持多种数据库应用的架构
BLL应该只操作实体(强类型)比较好
防SQL注入用SqlCommand+SqlParameter传参就好了
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;namespace MX.DAL
{
public class DBHelper
{
private static SqlConnection _conn;
static DBHelper()
{
if (_conn == null)
{
string strConn = ConfigurationManager.ConnectionStrings["SQLConn"].ConnectionString;
_conn = new SqlConnection(strConn);
}
}
public static bool ExecuteSql(string sql)
{
try
{
if (_conn.State != ConnectionState.Open)
_conn.Open();
SqlCommand cmd = _conn.CreateCommand();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
return true;
}
catch
{
return false;
}
finally
{
_conn.Close();
}
}
public static DataTable GetTable(string sql, string tableName)
{
try
{
SqlDataAdapter adp = new SqlDataAdapter(sql, _conn);
DataSet ds = new DataSet();
adp.Fill(ds, tableName);
return ds.Tables[0];
}
catch
{
return null;
}
}
public static DataTable GetTableByPages(string sql, int startIndex,int pagesize,string tableName)
{
try
{
SqlDataAdapter adp = new SqlDataAdapter(sql, _conn);
DataSet ds = new DataSet();
adp.Fill(ds, startIndex, pagesize, tableName);
return ds.Tables[0];
}
catch
{
return null;
}
}
public static SqlDataReader GetReader(string sql)
{
try
{
if (_conn.State != ConnectionState.Open)
_conn.Open();
SqlCommand cmd = _conn.CreateCommand();
cmd.CommandText = sql;
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch
{
return null;
}
} public static object GetScalar(string sql)
{
try
{
if (_conn.State != ConnectionState.Open)
_conn.Open();
SqlCommand cmd = _conn.CreateCommand();
cmd.CommandText = sql;
return cmd.ExecuteScalar();
}
catch
{
return null;
}
finally
{
_conn.Close();
}
}
}
}
srt.append("");
带参数的拼接sql语句这样也是比较安全的
--注意:这是比较简单的方法
客户既然不需要,就不要加了,加了反而会成为鸡肋直接SqlHelper去操作SqlServer好了写在DAL里了,把存储过程名换为SQL语句