代码之家  ›  专栏  ›  技术社区  ›  AJ.

使用命令。使用select进行准备,是否需要将select列指定为输出参数?

  •  0
  • AJ.  · 技术社区  · 14 年前

    我想用 Command.Prepare 用一个 CommandType.Text 具有单个输入参数的查询。select有几个列,我正在用DataReader提取它们。在调用之前,是否需要将每个select列指定为输出参数? Command.Prepare() ?即使我不需要指定它们,如果我这样做,性能会提高吗?

    示例代码:

    using(var connection = new SqlConnection("connection string")
    {
        connection.Open();
        using(var cmd = new SqlCommand(null, Connection))
        {
            cmd.CommandText = "SELECT COLUMN1, COLUMN2, COLUMN3 " + 
                              "FROM TABLE1 WHERE COLUMN4 = @thing";
            cmd.Parameters.Add(new SqlParameter
                                   {
                                       ParameterName = "@thing",
                                       DbType = SqlDbType.Int,
                                       Value = 1
                                    });
            //should I add output parms for COLUMN1, COLUMN2, COLUMN3?
            cmd.Prepare();
            using(var reader = cmd.ExecuteReader())
            {
                //get stuff out of reader
            }
        }
    }
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Jon Skeet    14 年前

    不,您不需要输出参数。你只需以正常的方式从读者那里得到结果。

    事实上,将列作为输出参数是没有意义的,因为每列都有一个值。 每行 而不仅仅是整个调用的一个值。

        2
  •  0
  •   Andomar    14 年前

    林克 DataContext 提供了一种比 SqlCommand :

    class MyRow { public string Name { get; set; } }
    
    class Program
    {
        static void Main(string[] args)
        {
            var dataContext = new System.Data.Linq.DataContext(
                "Data Source=localhost\\sqlexpress;" +
                "Initial Catalog=testdb;Integrated Security=SSPI;");
            var rows = dataContext.ExecuteQuery<MyRow>(
                "select * from testtable where name = {0}",
                "Joe");
            foreach (var r in rows)
                Console.WriteLine(r.Name);
        }
    }
    

    尽管语法看起来像 string.Format , the {0} 传递给 ExecuteQuery 最终成为一个真正的SQL参数。