2014-10-20 29 views
0

我的计划表有15个字段,使用ExecuteScalar似乎只抓取第一列的结果,我该如何指定我想要的列名?例如,当我运行下面的代码时,它会返回1,这是我的ID列中的值,但我需要plan_rate列。ExecuteScalar - 特定列

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["CustomerDataConnectionString"].ConnectionString)) 
{ 
    conn.Open(); 

    SqlCommand cmd = new SqlCommand("SELECT * FROM [dbo].[plans] WHERE age_group = @age_group AND coverage_type = @coverage_type", conn); 
    cmd.Parameters.AddWithValue("@age_group", dd_ageGroup.Text); 
    cmd.Parameters.AddWithValue("@coverage_type", dd_coverageType.Text); 

    Object result = cmd.ExecuteScalar(); 

    if (result != null) 
     Label1.Text = "Plan rate: $" + result.ToString(); 

    else 
     Label1.Text = "Plan is not available in this state."; 


} 

回答

1

the documentation第一行:

执行查询,并在查询返回的结果集返回第一行的第一列。其他列或行将被忽略。

如果你只想plan_rate您可以将您的查询更改为:

"SELECT plan_rate FROM [dbo].[plans]...

或使用ExecuteReader和阅读您从DataReader想要的列。

using(DataReader reader = cmd.ExecuteReader()) 
{ 
    while(reader.Read()) 
    { 
     ... 
     string plan_rate = reader["plan_rate"].ToString(); 
     ... 
    } 
} 
+0

如果你将'reader'放入''using'块,我会upvote。 – 2014-10-20 03:51:17

+0

@JohnSaunders这样做,并修正了一个错字。 – 2014-10-20 12:55:07

1

ExecuteScaler只能在您返回单个值时使用。这意味着您的查询只需要一列和一行。

所以你需要改变你的Select * fromSelect myColumn from

如果您需要第二快的执行并返回多个列,您可以使用ExecuteReader

SqlDataReader reader = command.ExecuteReader(); 
while (reader.Read()){ 
    Console.WriteLine(String.Format("{0}", reader[0]));//reader[0] column1, reader[1] column2,.. 
} 
+0

你会推荐我使用什么?重写上面的代码来完成列名的最好方法是什么?我不想为每列写10个ExecuteScalar代码。谢谢你,先生。 – user3345212 2014-10-20 01:53:26

+0

那么,你可以在返回多个列/行时使用它,但它只会返回第一列和第一行的值。 – 2014-10-20 01:54:06

+0

@ user3345212您可以使用'ExecuteReader' – Dalorzo 2014-10-20 01:54:37