C# 将数据从sql server compact 4.0检索到文本框

C# 将数据从sql server compact 4.0检索到文本框,c#,sql,sql-server,C#,Sql,Sql Server,我的winform中有两个文本框。我想在第一个文本框中输入一个userId,然后单击按钮在第二个文本框中正确显示用户名。数据存储在sql server compact中。表名为Users,此表包含两列UserID和UserName 使用这段代码,我可以打开一个连接并从UserName列中检索第一个值 SqlCeConnection cn = new SqlCeConnection(@"Data Source = D:\Database\Training.sdf"); try

我的winform中有两个文本框。我想在第一个文本框中输入一个userId,然后单击按钮在第二个文本框中正确显示用户名。数据存储在sql server compact中。表名为
Users
,此表包含两列
UserID
UserName

使用这段代码,我可以打开一个连接并从UserName列中检索第一个值

SqlCeConnection cn = new SqlCeConnection(@"Data Source = D:\Database\Training.sdf");
        try
        {
          cn.Open();
          SqlCeCommand cmd = new SqlCeCommand("SELECT   UserID, UserName from Users;", cn);
          TrainerNameBox.Text = cmd.ExecuteScalar().ToString();
          cn.Close();
       }
       catch
       { 
       }
返回第一行的第一列。忽略其他列或行

在您的例子中,第一列是
UserID
。这就是为什么会得到此列的第一个值

如果您想获得
用户名
值,您可能需要更改查询,如

SELECT UserName from Users
看起来您忘记了在查询中使用
WHERE
子句,因为您想从
UserID
获取
UserName
。您可能需要使用来处理
SqlCeConnection
SqlCeCommand

充分的例子

using(SqlCeConnection cn = new SqlCeConnection(@"Data Source = D:\Database\Training.sdf"))
using(SqlCeCommand cmd = cn.CreateCommand())
{
  cmd.CommandText = "SELECT UserName from Users WHERE UserID = @id";
  cmd.Parameters.AddWithValue("@id", (int)txtUserID.Text);
  cn.Open();
  TrainerNameBox.Text = cmd.ExecuteScalar().ToString();
}
试试这个:

    Dataset ds = cmd.ExecuteDataset().ToString();
    TrainerNameBox.Text = ds.tables[0].Rows[0][1].toString();
    TrainerIDBox.Text = ds.tables[0].Rows[0][0].toString();

缺少WHERE子句来隔离要显示的用户名

 int userID;
 if(!Int32.TryParse(txtUserID.Text, out userID))
 {
      MessageBox.Show("Invalid User ID number");
      return;
 }
 using(SqlCeConnection cn = new SqlCeConnection(@"Data Source = D:\Database\Training.sdf"))
 using(SqlCeCommand cmd = new SqlCeCommand("SELECT UserName from Users WHERE UserID=@id;", cn))
 {
     cn.Open();
     cmd.Parameters.AddWithValue("@id", userID);
     object result = cmd.ExecuteScalar();
     if(result != null)
         TrainerNameBox.Text = result.ToString();
     else
         MessageBox.Show("No user for ID=" + userID.ToString());

 }
请注意,
ExecuteScalar
返回第一行的第一列,因此需要从查询中删除UserID字段,如果找不到用户,则需要检查是否返回空值

如果用户键入无效id,直接将ToString()方法应用于ExecuteScalar可能会引发异常。验证用户输入也存在问题。如果为用户id键入非数值,转换将失败。在这种情况下,需要使用Int32.TryParse检查输入