各位大哥大姐大嫂大妹子们。。就是这段代码。。单独把sql语句拿出来查询没问题。。但是放到程序中就有问题。。问题在下面描述。。这里太短了。。
- C# code
public static DataTable GetAllData() { DataTable dt = new DataTable(); try { DataRow dr; string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= E:\Code\DriverExam\DriverExam\App_Data\db.mdb;"; OleDbConnection odcConnection = new OleDbConnection(strConn); odcConnection.Open(); OleDbCommand odCommand = odcConnection.CreateCommand(); odCommand.CommandText = "select * from ( select top 100 * from shiti2012 order by rnd(id) ) order by zhangjie,id"; //= "select top 100 * from shiti2012 where bmp is not null order by rnd(id)"; OleDbDataReader odrReader = odCommand.ExecuteReader(); for (int i = 0; i < odrReader.FieldCount; i++) { DataColumn dc; dc = new DataColumn(odrReader.GetName(i)); dt.Columns.Add(dc); } while (odrReader.Read()) { dr = dt.NewRow(); for (int i = 0; i < odrReader.FieldCount; i++) { dr[odrReader.GetName(i)] = odrReader[odrReader.GetName(i)].ToString(); } dt.Rows.Add(dr); } odrReader.Close(); odcConnection.Close(); return dt; } catch { return dt; } }
就是这段代码。。单独把sql语句拿出来查询没问题。。但是放到程序中就有问题。。
如果单独把这个sql拿到access里面用没有问题。。每次都能查到随机数据。。而且每次都不一样。。
- SQL code
select * from ( select top 100 * from shiti2012 order by rnd(id) ) order by zhangjie,id
但是如果把它放到程序中。。
每次茶道的随机数都是一样的。。
举个栗子:
如果我在access里面运行sql 。。运行了三次。。三次查到的数据分别是
第一次:1,2,3,5,6,8,15(后面省略)
第二次: 4, 6, 7, 9, 10, 11, 12, 15(后面省略)
第三次:2,6,5,9,4,7,8,9(后面省略)
如果把这个sql放到如上的程序中运行。。运行三次的话。。那么三次查到的数据会是
第一次:5,6,7,8,10,15,16,20,50(后面省略)
第二次: 5,6,7,8,10,15,16,20,50(后面省略)
第三次:5,6,7,8,10,15,16,20,50(后面省略)
而且。。
昨天查到是如上的数据。。今天查到的也是如上数据。。
你说你今天就变点数据根昨天不一样也行啊。。
你说你今天还这样你让我怎么整死你啊。。。
my dears.
pls help me to shoot it!
[解决办法]
odCommand.CommandText
= "select * from ( select top 100 * from shiti2012 order by rnd(id) ) order by zhangjie,id";
把上面这儿改成:
odCommand=new OleDbCommand("select * from ( select top 100 * from shiti2012 order by rnd(id) ) order by zhangjie,id",(这儿写上连接));
[解决办法]
你没有正确的连接到数据库
[解决办法]
在程序中,rnd的种子必须是一个负的single,你可以改成这样:select top 100 * from shiti2012 order by rnd(-rnd(id))。
[解决办法]
你试着把connection设置为静态,rnd本来就不是绝对随机,和vb里的rnd一样,每次程序启动,随机得到的数肯定一样,需要在开头添加randomize达到随机效果,至于你的程序运行每次都一样结果,我估计也是这个问题,因为你直接用语句到数据库里查询,连接用的是同一个,而你的代码,则每次都是新建一个连接来操作数据库。
还有,把数据填充到DataTable,没必要用循环把DataReader对象转过去,直接用OleDbDataAdapter对象Fill到一个DataTable里即可。
[解决办法]
或者你试试把代码改为:
- C# code
Random rnd = new Random();int r = rnd.Next();OleDbCommand odCommand = odcConnection.CreateCommand(); odCommand.CommandText = "select * from ( select top 100 * from shiti2012 order by rnd(" + r.ToString() + ")) order by zhangjie,id";
[解决办法]
你有试过,把你这个sql,直接放到access里执行,然后记录下结果,接着重新打开access,一样执行这个sql,比较2个结果是不是一样的。
[解决办法]
"select * from ( select top 100 * from shiti2012 order by rnd(time()-id) ) order by zhangjie,id";
这样重复概率估计会小点,不过效率不高。