使用带有SELECT的Command.Prepare,我是否需要将SELECT列指定为输出参数?

时间:2010-06-19 16:09:42

标签: .net sql ado.net

我正在尝试将Command.Prepare与具有单个输入参数的CommandType.Text查询一起使用。 SELECT有几个列,我用DataReader提取。在调用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 个答案:

答案 0 :(得分:1)

不,您不需要输出参数。您只需以正常方式从阅读器中获取结果。

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

答案 1 :(得分:0)

Linq的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,但传递给{0}的{​​{1}}最终成为真正的SQL参数。

相关问题