我的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
{
}
答案 0 :(得分:1)
ExecuteScalar
会返回第一行的第一列。其他列或行将被忽略。
在您的情况下,您的第一列是UserID
。这就是为什么你得到这个专栏的第一个价值。
如果您想获得UserName
值,则可能需要更改查询,如
SELECT UserName from Users
看起来您忘记在查询中使用WHERE
子句,因为您希望从UserName
获取UserID
。您可能需要使用using
statement来处置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();
}
答案 1 :(得分:0)
您缺少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可能会引发异常。验证用户输入也存在问题。如果为用户标识键入非数字值,则转换将失败。在这种情况下,您需要使用Int32.TryParse检查输入
答案 2 :(得分:-1)
试试这个:
Dataset ds = cmd.ExecuteDataset().ToString();
TrainerNameBox.Text = ds.tables[0].Rows[0][1].toString();
TrainerIDBox.Text = ds.tables[0].Rows[0][0].toString();