是正确的编码方式

本文关键字:编码 方式 | 更新日期: 2023-09-27 18:03:55

我是新程序员。在我的公司,我是唯一的程序员。所以我有很多问题在我的脑海里。

在我的项目我使用下面的代码添加。

MySqlConnection connection = new MySqlConnection(MyConString);
MySqlCommand command = connection.CreateCommand();
MySqlDataReader Reader;
command.CommandText = "select * from " + datatable + " where code='" + textBox1.Text + "'";
connection.Open();
Reader = command.ExecuteReader();
while (Reader.Read())
{
    already = 1;
}
connection.Close();

这是正确的方式吗?或者是DAL,存储过程,三层架构哪个是最有效的。公司维护的标准代码是什么?

我正在做项目,也有解决方案。但我不知道这种方式是正确的还是错误的。

我想你们大多数人都明白我的问题。

Thanks in Advance....

是正确的编码方式

如何划分代码层更多的是个人喜好问题,而不是绝对必须的。通过至少将数据库代码与用户界面分离,您可以获得一些好处。例如,如果数据库代码与UI分离,您将很容易注意到在数据库查询中直接使用文本框中的文本的问题。

你的代码有一些严重的问题:

  • 您没有处理所有的一次性对象,这会浪费资源,并且从长远来看可能会导致错误。
  • 代码对SQL注入是开放的,你应该使用参数化查询。

:

  • 当您只需要知道是否有数据时,您正在获取表中的所有数据。
  • 永远不要使用select *,只获取你将要使用的字段。

释放连接和读取器会关闭它们,所以如果你使用using块来释放对象,你不必先关闭它们:

using (MySqlConnection connection = new MySqlConnection(MyConString)) {
  using (MySqlCommand command = connection.CreateCommand()) {
    command.CommandText = "select count(*) from " + datatable + " where code = @Code";
    command.Parameters.Add("@Code", dbType.VarChar, 50).Value = textBox1.Text;
    connection.Open();
    if ((int)(command.ExecuteScalar()) > 0) {
      already = 1;
    }
  }
}
  1. 保持你的连接字符串在全局范围内,所以如果它改变了,你不必在与数据库交互的每个方法中重新编写它。
  2. 您的命令对SQL注入攻击是可变的,您应该将其更改为:

    command.CommandText = "select * from @datatable where code=@code";
    command.Parameters.Add(new SqlParameter("datatable", datatable));
    command.Parameters.Add(new SqlParameter("code", textBox1.Text));
    
  3. 使用using或try/finally关闭连接,并对数据读取器执行此操作,因此:

    using (MySqlConnection connection = new MySqlConnection(MyConString))
    {
        //use the connection here
    }
    

    一般对所有实现IDisposable接口的对象都使用using语句,因此它们可能会被处理掉。当您使用try/finallyusing时,您可以确保即使出现错误,如抛出异常,您的对象也会被处理。

  4. 你应该保持你的数据库逻辑从UI分离。查看三层架构树的模式

要确保连接总是关闭的,在using块中打开连接。如下面的代码片段所示。这样做可以确保在代码退出块时自动关闭连接。

using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        // Do work here; connection closed on following line.
    }

这是连接池的一部分。这是做Sql连接的好方法之一