2014-10-20 32 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