以前用的三层都是UI、DAL、BLL再加上Model辅助,所有的增删改查都是执行的数据库的存储过程。现在客户要求不要使用存储过程,用SQL语句。
请问把SQL写在哪里,要不要单独写在一个文件里,还是写在BLL,UI,DAL中的某一个,写在哪里比较好,比较妥当容易维护

解决方案 »

  1.   

    写在DAL   里面有个SQLHELP  其实这和你的存储过程写法基本一样的 你的存储过程要穿参数  而SQL防止SQL注入 也要用参数化查询  以前你是传一个 存储过程名字  这次只不过是一个SQL语句 ~~
      

  2.   

     SQL要写在UI层,一般人我不告诉他的
      

  3.   

    设置你的 CommandType 为 CommandType.Text 这是执行SQL语句的~~ 
      

  4.   

    sqlhelper类一般DAL层就是操作数据库的,sqlhelper这个类网上很多,里面是很多执行各种SQL语句和存储过程的方法,比如你现在要写一句select * from Users 查询所有的用户,那么你在DAL这个层里面建一个代表Users各种数据库操作的类,里面通过传入各种SQL语句调用sqlhelper这个类,然后返回各种你要的东西,然后BLL层就是调用了,这个你应该都懂了吧
      

  5.   


    恩,也就是原来是执行存储过程,现在是执行SQL语句。不过存储过程执行,要传递参数,而SQL基本不需要了吧,在SQL中直接写死,这样做怎么样???怎样防SQL注入???
      

  6.   

    引用 5 楼 swde125 的回复:sqlhelper类一般DAL层就是操作数据库的,sqlhelper这个类网上很多,里面是很多执行各种SQL语句和存储过程的方法,比如你现在要写一句select * from Users 查询所有的用户,那么你在DAL这个层里面建一个代表Users各种数据库操作的类,里面通过传入各种SQL语句调用sqlhelper这个类,然后返回各种你要的东西,然后BLL层就是调用了,这个你应该都懂了吧……
    恩,也就是原来是执行存储过程,现在是执行SQL语句。不过存储过程执行,要传递参数,而SQL基本不需要了吧,在SQL中直接写死,这样做怎么样???怎样防SQL注入???
      

  7.   

    你SQL语句是不用参数的?难道你要where的时候不通过web层取到页面输入你就能知道用户要where什么?
      

  8.   

    防止SQL注入,我目前知道的就三种,一种是通过你自己写的类过滤掉危险字符再传入SQL里面,一种就是存储过程,一种就是通过SqlParameter参数化
      

  9.   

    我觉得你该去看看基础的在做。。
    SQL注入可以过滤关键字。
      

  10.   

    DAL啊在DAL里面加一个 sqlhelper然后 写方法 
      

  11.   

    DAL BLL 都可以 习惯写哪就写哪  
    你可以在dal只做sql执行 打开连接什么的  bll写一些业务逻辑方法 把sql传过去 
    也可以把sql写在dal  bll只去调用  都无所谓
      

  12.   

    就楼主所说的三层,sql语句当然应该放在dal层建议楼主了解下为什么使用分层,就不会问这种问题了
      

  13.   

    写个XML配置文件里封装起来。。DAL也可以
      

  14.   

    我一般吧T-SQL 写在逻辑层   数据层 貌似就一个SqlHelp.cs 了
      

  15.   

    请问把SQL写在哪里,要不要单独写在一个文件里,还是写在BLL,UI,DAL中的某一个,写在哪里比较好,比较妥当容易维护
    ---------------
    推荐SQL写在一个单独的文件里面,甚至调用存储过程的语句都可以写在一个单独的文件里面,还可以开发一个工具根据这个SQL文件自动生成DAL代码,这就是SQL-MAP思想。
    PDF.NET数据开发框架实现了这个思路,开发非常方便,想用SQL语句,存储过程,甚至ORM都由你。
    再给楼主一些参考:
    关于三层架构,不得再说一说
    不使用DalFactory和IDAL,支持多种数据库应用的架构 
     
      

  16.   

    SQL你可以写在DAL里,针对Model的部分你也可以写在Model里,将字段映射一下
    BLL应该只操作实体(强类型)比较好
    防SQL注入用SqlCommand+SqlParameter传参就好了
      

  17.   

    建议建一个SqlHelper公共类,在DAL层调用
      

  18.   

    SQL版DBHelp
    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();
    }
    }
    }
    }
      

  19.   

    在DAL里面用数据库的拼接  StringBuilder str;
    srt.append("");
    带参数的拼接sql语句这样也是比较安全的
      

  20.   

    SQL注入攻击防止:(1)不要全表查询数据(2)不要建立索引(3)分区查询(4)显示必要字段
    --注意:这是比较简单的方法
      

  21.   

    NHibernate还不如直接linq to sql来得快
      

  22.   

    DAL层,一个简单的方法把你的存储过程复制出来就
      

  23.   

    http://social.msdn.microsoft.com/Forums/zh-CN/2212/thread/b43087e2-4071-4949-b24e-5d12bdb14516
      

  24.   

    大家说说,还是用三层+工厂模式,来扩展使用多种数据库吗?客户是要用SqlServer的,并没有移植到Oracle等的打算
      

  25.   


    客户既然不需要,就不要加了,加了反而会成为鸡肋直接SqlHelper去操作SqlServer好了写在DAL里了,把存储过程名换为SQL语句