2014-01-06 38 views
4

我正在嘗試一個簡單的窗體從SQL Server CE數據庫中檢索值。在Employee表中有2列namecompanySqlCeCommand.ExecuteScalar不會從表中的第二行返回值

的行是如下:

Name Company 
XXX ABC 
YYY DEF 

我用下面的代碼來從數據庫取回數據:

private void button1_Click(object sender, EventArgs e) 
{ 
    string conn = ConfigurationManager.ConnectionStrings["con"].ConnectionString; 
    SqlCeConnection con = new SqlCeConnection(conn); 

    SqlCeCommand cmd = new SqlCeCommand("select company from EMPLOYEES where name = @name", con); 
    cmd.Parameters.AddWithValue("@name",textBox1.Text); 

    con.Open(); 

    try 
    { 
     object obj = new object(); 
     obj = cmd.ExecuteScalar(); 
     label1.Text = (string)obj; 
    } 
    finally 
    { 
    } 

上面的代碼正常工作的第一行中的表即當我在文本框中給出XXX,ABC顯示在表格中。但是當我在文本框中輸入YYY時,返回null。我是C#的業餘愛好者。試試幾個簡單的例子來學習。這個你能幫我嗎。謝謝

提前。

+0

您是否100%確定輸入或數據庫值中沒有空格? –

+0

感謝您的回覆。是。當我在SQL管理工作室中運行相同的查詢時,會爲所有行檢索結果。 – Partha

+0

確保在你最後關閉你的con對象。泄露..... –

回答

0

嘗試更新表的XXX排在SQL Management Studio中:

update EMPLOYEES set Company = 'ZYX' where Name = 'XXX' 

然後再次嘗試的形式,看看它返回什麼樣的價值爲XXX。如果它仍然是ABC,那麼你沒有連接到正確的數據庫。

順便說一句,我自己試過你的代碼,它返回YYY行很好,所以我認爲這可能是一個數據/連接問題。

(僅供參考,我不得不做出這樣的回答,而不是評論,因爲它不會讓我評論。)

1

的ExecuteScalar()被設計爲返回一個標值(單個值)。這通常用於Count(*)以返回行數。

從你的代碼看起來你試圖返回多於一行。如果你想通過一個數據集進行迭代,那麼你應該利用SqlCeDataReader

SqlCeCommand cmd = new SqlCeCommand("select company from EMPLOYEES where name = @name"); 
cmd.Parameters.AddWithValue("@name",textBox1.Text); 

cmd.Connection = con; 
con.Open(); 

SqlCeDataReader dr = selectSQL.ExecuteReader(); 
while (dr.Read()) 
    { 
    label1.Text = dr["ColumnName"].ToString(); 
    } 
dr.Close(); 
con.Close(); 
3

這是由設計。 SqlCeCommand.ExecuteScalar方法只返回第一行。

來源:SqlCeCommand.ExecuteScalarMSDN Documentation

執行查詢和 返回第一行的第一列由查詢返回的結果集。額外的列或行 被忽略。

如果您期望並需要在結果集中處理多於一行的數據,請使用ExecuteReader()