我正在尝试从我的数据库中获取有关特定用户的信息:
public string GetUserData()
{
string conString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(conString))
{
SqlCommand com = new SqlCommand("SELECT lastName , phoneNo , creditCardNo , dateOfBirth FROM UserExtendedDataSet WHERE UserId = @UserId", con);
com.Parameters.Add("@UserId", SqlDbType.NVarChar).Value = getUserId();
con.Open();
string result = Convert.ToString(com.ExecuteScalar());
StatusLabel.Text = result;
return result;
}
}
问题是它只返回第一个表数据(在本例中为lastName),我知道我可以为每个字段编写单独的查询,但我认为这不会真正有效。
有没有用一个查询获取这些数据?
答案 0 :(得分:3)
您需要在命令上调用ExecuteReader并使用命令返回的SqlDataReader实例。 ExecuteScalar只返回第一行的第一列。
using(SqlDataReader reader = com.ExecuteReader())
{
if(reader.Read()
{
StatusLabel.Text = reader[0].ToString() + " " + reader[1].ToString();
.... other labels for other fields
}
}
而是在调用Read方法之后,ExecuteReader在第一行(如果有的话)上移动,然后读取器的每一列都可以作为索引数组使用。 (在应用任何转换之前,请注意空值,如ToString())
顺便说一下,你的标签是MySql
,但你在名称空间SqlClient
中使用了Sql Server类?
答案 1 :(得分:0)
原因是因为您只执行查询而ExecuteScalar返回数据库的第一行。
string result = Convert.ToString(com.ExecuteScalar());
您可以尝试使用 ExecuteReader ,而不是这样:
using(SqlDataReader reader = com.ExecuteReader())
{
if(reader.Read())
{
//your code here
}
}
MSDN说ExecuteScalar method:
执行查询,并返回第一行的第一列 查询返回的结果集。其他列或行是 忽略。