【问题标题】:C# | SQL | Change string concatenation to parametersC# | SQL |将字符串连接更改为参数
【发布时间】:2020-05-12 20:55:05
【问题描述】:

在本网站上一个问题中,有人告诉我不应该使用字符串连接,但我不知道如何使用。因为我真的很想了解这一点,所以我想我应该在这个网站上提出这个问题,以便从你们编程之神那里得到答案。

这是我的数据层的代码:

namespace DAL
{
    public class Class2
    {
    }
    public class ClsDataLayer
    {
        SqlConnection SqlConn = new SqlConnection("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=3tireexample;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False");
        public void InsertData(string _name, string _city, string _email)
        {
            SqlDataAdapter SqlAdp = new SqlDataAdapter("Insert into Usermst values ('" + _name + "','" + _city + "','" + _email + "')", SqlConn);
            DataTable DT = new DataTable();
            SqlAdp.Fill(DT);
        }
        public object SelectData()
        {
            SqlDataAdapter SqlAdp = new SqlDataAdapter("Select * from Usermst", SqlConn);
            DataTable DT = new DataTable();
            SqlAdp.Fill(DT);
            return DT;
        }
        public void DeleteData(string _name, string _city, string _email)
        {
            SqlDataAdapter SqlAdp = new SqlDataAdapter("Delete top 1  from UserMst, SqlConn);
            DataTable DT = new DataTable();
            SqlAdp.Fill(DT);
        }


    }
}

业务层:

namespace BLL
{
    public class Class1
    {
    }
    public class CLSBussLayer
    {
        ClsDataLayer objDal = new ClsDataLayer();
        public void InsertUser(string _name, string _city, string _email)
        {
            objDal.InsertData(_name, _city, _email);
        }
        public object SelectUser()
        {
            return objDal.SelectData();
        }
        public void DeleteUser(string _name, string _city, string _email)
        {
            objDal.DeleteData(_name, _city, _email);
        }
    }
}

我的用户界面层:

namespace Individueel_projectV2
{
    public partial class Pagina1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnsave_Click(object sender, EventArgs e)
        {
            CLSBussLayer objBLL = new CLSBussLayer();
            objBLL.InsertUser(txtname.Text, txtcity.Text, txtemail.Text);

            GridView1.DataSource = objBLL.SelectUser();
            GridView1.DataBind();

        }

        protected void btndelete_Click(object sender, EventArgs e)
        {
            CLSBussLayer objBLL = new CLSBussLayer();
            objBLL.DeleteUser(txtname.Text, txtcity.Text, txtemail.Text);

            GridView1.DataSource = objBLL.SelectUser();
            GridView1.DataBind();
        }
    }
}

我该如何更改? 我不要求你重写我的整个代码,但只是一小部分,所以我可以看到我必须做什么。 最好解释一下你为什么要做你所做的事情(请简单),这样我就可以从中学习。 提前致谢!

【问题讨论】:

标签: c# sql architecture


【解决方案1】:

如何

有关如何进行参数绑定的更多信息,请参阅SqlCommand.Parameters。例如,在您的情况下,您会这样做

string commandText = "Insert into Usermst values (@name, @city, @email)";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.Add("@name", SqlDbType.Varchar);
    command.Parameters["@name"].Value = name;

由于您使用的是SqlDataAdapter

SqlAdp.Parameters.Add("@name",
        SqlDbType.NVarChar, "Josse", "Name");

为什么

  • 防止SQL Injection
  • 参数绑定还提高了性能,因为数据库引擎可以使用和执行缓存的查询,而不是再次解析查询,如果您使用字符串连接,就会发生这种情况。

【讨论】:

  • @Rahul 代码应该进入 DAL 层还是 BLL 层?
  • @Josse 这由你决定,但由于代码直接与 DB 交互,我会将这个逻辑放在 DAL 中
  • 当我尝试这样做时,我在最后一行得到错误:当前内容中不存在“名称”。我该怎么办?
  • @Rahull 我应该删除我的 DAL 文件的哪一部分并用您的代码替换?
【解决方案2】:

您的主要问题得到了答案。我可以向您展示一些您可以使用的改进。

  1. 在您的 DAL 中,您可以在方法之外拥有共同的变量,这样就不需要再次定义这些变量。
  2. 您使用的文本,放入变量中,用作 CommandText
  3. 不要硬编码表名称等(它们是业务规则),而是将它们设为通用,以便它们可以接受准备好的命令文本。
  4. 在前端,保留一个方法为DataBind(),以保留多次使用的代码
  5. 不要使用单独的数据元素,而是使用需要的属性创建 BLL 类,并且在数据传输时,使用适当的参数实例化类并传递它。
  6. 您需要处理异常(可能需要记录这些异常)
  7. 您可能不需要在插入/删除方法中将 DT 值分配给适配器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多