两件事:第一 无论你用哪个数据库的连接库 无论是mysql mssql ODBC 返回执行结果后 实际上传给程序的是一个stream (流)
第二这个流不可回退,不可遍历,所以你用一个方法来取值 注定只能取到第一个值。 而且需要将步值前进一步时候 一定要用到Read()方法 才能进入下一行。
这却写法是:
(mssql 是System.Data.SqlClient 以下范例使用mysql 只要替换 类库名即可,类库下的方法,属性等名称完全一致,odbc源 也是如此)
MySqlCommand mySqlCommand = new MySqlCommand(sqlstr, myconnect);//sql语句,已建立的连接
Stackresultid = new Stack (); //创建一个栈泛型,用来push进去得到的返回结果。因为我们的数据不需要回头,一路走下去所以栈的效率绝对最高。
Stackresultuser = new Stack ();
MySqlDataReader reader = mySqlCommand.ExecuteReader(); //创建流式读取器
while (reader.Read())
{
if (reader.HasRows)
{
resultid .Push(reader.GetInt64("ID")); //ID是你的列名 取回值并压入栈
resultuser .Push(reader.GetString("User"));
//reader.GetInt64(0);//如果不知道列名只知道第几列用int作为参数
//你处理数据的地方注意如果数据库中的数据是null 用 GetInt64等直接取回数据会出现异常,可以用IsDBNull方法先判断再取值
}
}
reader.Close();//最后要释放reader不然下一次调用reader一定会出现异常
mySqlCommand.Dispose(); //可根据实际需求选择是否释放资源
resultid .ToArray(); 最后将得到的结果转化为数组。接下来你就可以遍历这个数组进行输出或者其他处理了。
resultuser .ToArray();
当然 如果返回数据比较多列 你还可以自己建立个类然后 Stack
public class YourObject{
public long ID;
public string User;
public int Age;
public string Name;
} //
Stack
//在if(reader.HasRows)中改写为
if (reader.HasRows)
{
result.Push(new YourObject(){
ID = reader.GetInt64("ID"),
User= reader.GetString("User"),
Age= reader.GetInt32("Age"),
Name= reader.GetString("Name"),
});
}