各位大哥大姐大嫂大妹子们。。就是这段代码。。单独把sql语句拿出来查询没问题。。但是放到程序中就有问题。。问题在下面描述。。这里太短了。。

No_0425044 2012-03-07 11:01:59


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里面用没有问题。。每次都能查到随机数据。。而且每次都不一样。。

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!
...全文
335 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
xnlm2005 2012-03-07
  • 打赏
  • 举报
回复
在程序中,rnd的种子必须是一个负的single,你可以改成这样:select top 100 * from shiti2012 order by rnd(-rnd(id))。
allen0118 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ymq_2012 的回复:]
string strConn
= @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
E:\Code\DriverExam\DriverExam\App_Data\db.mdb;";
改写成string strConn
= @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
E:\Co……
[/Quote]

+1
wh521t 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 no_0425044 的回复:]
C# code


public static DataTable GetAllData()
{
DataTable dt = new DataTable();
try
{
DataRow dr;
string strConn
……
[/Quote]
  • 打赏
  • 举报
回复
string strConn
= @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
E:\Code\DriverExam\DriverExam\App_Data\db.mdb;";
改写成string strConn
= @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
E:\Code\DriverExam\DriverExam\App_Data\db.mdb;Extended Properties ='Excel 8.0'";
cjh200102 2012-03-07
  • 打赏
  • 举报
回复
楼上正解
叶子 2012-03-07
  • 打赏
  • 举报
回复
你没有正确的连接到数据库
mengting0917 2012-03-07
  • 打赏
  • 举报
回复
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",(这儿写上连接));
java-yu 2012-03-07
  • 打赏
  • 举报
回复
同意七楼说的
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 no_0425044 的回复:]
会不会跟版本有关系。。
[/Quote]
如果你的office是2007的话,把4.0和8.0都改写成12.0
ziyouli 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 no_0425044 的回复:]
引用 22 楼 ziyouli 的回复:

"select * from ( select top 100 * from shiti2012 order by rnd(time()-id) ) order by zhangjie,id";

这样重复概率估计会小点,不过效率不高。


time()

这个是时间函数把。。

为什么用时间好使加随机数不行呢。。
[/Quote]

access的随机函数问题,和vb里的一个样。
No_0425044 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ziyouli 的回复:]

"select * from ( select top 100 * from shiti2012 order by rnd(time()-id) ) order by zhangjie,id";

这样重复概率估计会小点,不过效率不高。
[/Quote]

time()

这个是时间函数把。。

为什么用时间好使加随机数不行呢。。
ziyouli 2012-03-07
  • 打赏
  • 举报
回复
"select * from ( select top 100 * from shiti2012 order by rnd(time()-id) ) order by zhangjie,id";

这样重复概率估计会小点,不过效率不高。
No_0425044 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ziyouli 的回复:]

你有试过,把你这个sql,直接放到access里执行,然后记录下结果,接着重新打开access,一样执行这个sql,比较2个结果是不是一样的。
[/Quote]

确实是啊。。
是一样的。。。

我先去调代码。。
ziyouli 2012-03-07
  • 打赏
  • 举报
回复
你有试过,把你这个sql,直接放到access里执行,然后记录下结果,接着重新打开access,一样执行这个sql,比较2个结果是不是一样的。
No_0425044 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ziyouli 的回复:]

或者你试试把代码改为:
C# code
Random rnd = new Random();
int r = rnd.Next();
OleDbCommand odCommand = odcConnection.CreateCommand();
odCommand.CommandText
= "select * from……
[/Quote]

谢了亲。。刚试过。。问题还是一样。。
No_0425044 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 liujintaozyc 的回复:]

你别叫的这么老,18素材:你要学会单步调试看看什么问题,连接问题
server=;database
[/Quote]

亲。。我这里网络限制。。只能上csdn。。。

so。。

能不能给点具体的代码。。
ziyouli 2012-03-07
  • 打赏
  • 举报
回复
或者你试试把代码改为:
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";
No_0425044 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 candymanping 的回复:]

引用 3 楼 maco_wang 的回复:

你没有正确的连接到数据库

好像是这么回事
[/Quote]

呃。。是说连接字符串不对么。。
Joel_L 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 maco_wang 的回复:]

你没有正确的连接到数据库
[/Quote]
好像是这么回事
ziyouli 2012-03-07
  • 打赏
  • 举报
回复
你试着把connection设置为静态,rnd本来就不是绝对随机,和vb里的rnd一样,每次程序启动,随机得到的数肯定一样,需要在开头添加randomize达到随机效果,至于你的程序运行每次都一样结果,我估计也是这个问题,因为你直接用语句到数据库里查询,连接用的是同一个,而你的代码,则每次都是新建一个连接来操作数据库。

还有,把数据填充到DataTable,没必要用循环把DataReader对象转过去,直接用OleDbDataAdapter对象Fill到一个DataTable里即可。
加载更多回复(3)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧