【问题标题】:Prepared Statements in SQL-Server through C#通过 C# 在 SQL-Server 中准备语句
【发布时间】:2011-08-12 18:35:50
【问题描述】:

我发现 mysqli_stmt_prepare() 函数在 PHP 中使用准备好的语句。 SQL-Server 的 C# 中是什么样的? 我找到了这个代码示例(使用参数化命令)。这就是我要找的吗?

        SqlConnection conn = new SqlConnection();
        SqlCommand com = new SqlCommand();
        SqlDataAdapter dap = new SqlDataAdapter();
        DataTable tbl = new DataTable();
        SqlParameter param = new SqlParameter();
        conn.ConnectionString = @"Data Source=...";
        com.Connection = conn;
        com.CommandText = "select * from tbl1 where id<@id";
        com.Parameters.AddWithValue("@id",4);
        com.CommandType = CommandType.Text;
        dap.SelectCommand = com;
        conn.Open();
        dap.Fill(tbl);
        conn.Close();
        dataGridView1.DataSource = tbl;

如果不是,那是什么?
如果是,请告诉我如何使用字符“?”而不是在命令文本中写入@id。
谢谢

【问题讨论】:

    标签: c# php sql-server prepared-statement sqlcommand


    【解决方案1】:

    是的,但是不能使用'?'标记。

    【讨论】:

      【解决方案2】:

      SQL Server(至少,通过 SqlClient)使用命名参数。该代码确实会执行参数化查询,但有几点需要注意:

      • 尚未正式“准备”(请参阅​​ .Prepare()),但您几乎不需要这样做
      • 其中几个对象是IDisposable;你应该有usings 给他们
      • DataTable(和适配器等)将工作,但正在下降(首选映射类,IMO)
      • 在同一方法中看到DataGridViewSqlCommand 可能意味着您的UI 代码与数据访问代码过于接近;我个人会把数据访问的东西推低一个层次

      例如:

      DataTable tbl = new DataTable();
      using(var conn = new SqlConnection(@"Data Source=..."))
      using(var com = conn.CreateCommand())
      {
          com.CommandText = "select * from tbl1 where id<@id";
          com.Parameters.AddWithValue("@id",4);
          com.CommandType = CommandType.Text;        
      
          SqlDataAdapter dap = new SqlDataAdapter();   
          dap.SelectCommand = com;
          conn.Open();
          dap.Fill(tbl);
          conn.Close();     
      }
      return tbl;
      

      (并将其绑定到 UI 上的 DataGridView

      当然,如果参数值始终为4,您可以直接将其编码到 TSQL 中。

      【讨论】:

      • 使用 .Prepare() 有什么区别?
      • @ahoo 现在查询计划缓存/重用非常好,说实话不是很多;但是如果您要在循环中对同一连接执行相同的命令,它会切断查询计划查找。坦率地说,无论如何现在几乎为零。这么说吧:我不使用它。在过去,它曾经更重要。
      • 谢谢,但是如何使用字符'?'而不是在命令文本中写@id
      • 我的意思是“?”无名占位符
      • @ahoo 是的;我告诉你 它不能那样工作 SqlClient;它使用命名参数。
      猜你喜欢
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2010-10-14
      相关资源
      最近更新 更多