C# 通过C在SQL Server中准备语句

C# 通过C在SQL Server中准备语句,c#,php,sql-server,prepared-statement,sqlcommand,C#,Php,Sql Server,Prepared Statement,Sqlcommand,我发现mysqli_stmt_prepare函数在PHP中使用prepared语句。 在SQL Server的C语言中是什么样子的? 我发现这个代码示例使用参数化命令。这就是我要找的吗 SqlConnection conn = new SqlConnection(); SqlCommand com = new SqlCommand(); SqlDataAdapter dap = new SqlDataAdapter(); DataT

我发现mysqli_stmt_prepare函数在PHP中使用prepared语句。 在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。
至少感谢SQL Server,通过SqlClient使用命名参数。该代码确实将执行参数化查询,但需要注意:

它还没有正式准备好,但你几乎不需要这样做 其中一些对象是可识别的;你应该对它们有用处 DataTable和adapter等将起作用,但在IMO看来,随着首选映射类,这种情况正在下降 在同一方法中看到DataGridView和SqlCommand可能意味着您的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中。

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

使用与否有什么区别。准备与否?@ahoo现在查询计划缓存/重用非常好,老实说,这不是很多;但是,如果要在循环中的同一连接上执行相同的命令,它将删除查询计划查找。坦白说,现在几乎是零了。这样说吧:我不用它。这在过去更为重要。谢谢,但是如何使用字符“?”而不是在命令文本中写入@id呢?我的意思是没有占位符的“?”占位符name@ahoo对我要告诉你的是,在SqlClient中它不是这样工作的;它使用命名参数。