SqlCeCommand.ExecuteScalar不返回表中第二行的值

时间:2014-01-06 20:44:10

标签: c#

我正在尝试一个简单的Windows窗体,它从SQL Server CE数据库中检索值。 name表格中有两列companyEmployee

行如下:

Name Company
XXX    ABC
YYY    DEF

我使用以下代码从db:

中检索数据
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
    {
    }

上面的代码适用于表格中的第1行,即当我在文本框中输入XXX时,ABC会显示在表格中。但是当我在文本框中输入YYY时,返回null。我是C#的业余爱好者。只是尝试一些简单的例子来学习。这个你能帮我吗。谢谢

事先提前。

3 个答案:

答案 0 :(得分:3)

这是设计。 SqlCeCommand.ExecuteScalar方法仅返回第1行。

来源:SqlCeCommand.ExecuteScalar MSDN Documentation

  

执行查询并返回第一行的第一列   查询返回的结果集。额外的列或行   被忽略了。

如果您希望并且需要在结果集中处理多于一行,请使用ExecuteReader()

答案 1 :(得分: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();

答案 2 :(得分:0)

尝试在SQL Management Studio中更新表格的XXX行:

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

然后再次尝试您的表单,看看它为XXX返回的值。如果它仍然是ABC,那么你没有连接到正确的数据库。

顺便说一下,我自己尝试了你的代码,并且它返回YYY行,所以我认为这可能是数据/连接问题。

(仅供参考,我不得不将此作为答案而不是评论,因为它不会让我发表评论。)