C# 仅向DataTable添加一定百分比的行

C# 仅向DataTable添加一定百分比的行,c#,random,datatable,C#,Random,Datatable,因此,我正在制定一个计划,随机审计我们的一些员工。我正试图制作一个程序来扫描我们的Access数据库并提取一定比例的订单。但我想随机选择订单,我不想只选择前5%或其他什么 static DataTable RandomSelect(double errPercentage,string User) { OleDbConnection conn = new OleDbConnection(strAccessConn); string query = "SEL

因此,我正在制定一个计划,随机审计我们的一些员工。我正试图制作一个程序来扫描我们的Access数据库并提取一定比例的订单。但我想随机选择订单,我不想只选择前5%或其他什么

static DataTable RandomSelect(double errPercentage,string User)
    {
        OleDbConnection conn = new OleDbConnection(strAccessConn);
        string query = "SELECT ControlNumber FROM Log WHERE User ='" + User + "' AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');";


        OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
        DataTable dt = new DataTable();
        DataTable dtRandomRows = new DataTable();

        try
        {
            adapter.Fill(dt);


            //dtRandomRows = dt.Clone();
            Random rDom = new Random();
            int i = 0;
            for (int ctr = 1; ctr <= dt.Rows.Count; ctr++)
            {
               i = rDom.Next(1, dt.Rows.Count);
               //dtRandomRows.Rows.Add(dt.Rows[i]);
                dtRandomRows.ImportRow(dt.Rows[i]);
            }
            dtRandomRows.AcceptChanges();
        }
        catch (OleDbException ex)
        {

        }

        return dtRandomRows;

    }
静态数据表随机选择(双错误百分比,字符串用户)
{
OLEDB连接连接=新的OLEDB连接(STRACCESCONN);
string query=“从日志中选择ControlNumber,其中User=”+User+”,Log.EndStatus位于('Needs Review'、'Check Search'、'Vision Delivery'、'CA Review'、'1TSI To Delivery');”;
OleDbDataAdapter=新的OleDbDataAdapter(查询,连接);
DataTable dt=新的DataTable();
DataTable dtRandomRows=新DataTable();
尝试
{
适配器填充(dt);
//dtRandomRows=dt.Clone();
随机rDom=新随机();
int i=0;
对于(int ctr=1;ctr
Random rand=new Random();
//将每行标记为尚未选定。
int[]nonSelectedRows=新的int[dt.Rows.Count];
对于(int i=0;i0)
{
dtRandomRows.ImportRow(dt.Rows[row]);
nonSelectedRows[row]=-1;//将此行标记为选中。
numSelected++;
努姆勒夫特--;
}
//我们已经找到了足够的数据来匹配我们的targetNum。
如果(numSelected>=targetNum)
打破
}
}

使用
using
语句正确处理sql对象,否则如果发生异常,连接不会关闭(坏)。此外,使用sql参数,您的代码容易受到sql注入的攻击。是否运行
for
循环,从1到
dt.Rows.Count*errPercentage
执行您想要的操作?此代码工作正常,目前为止似乎还不错。但是,即使它捕获订单,它也是随机的。我希望函数始终捕获订单的“errPercentage”。
Random rand = new Random();

// Mark every row as not selected yet.
int[] nonSelectedRows = new int[dt.Rows.Count];
for(int i = 0; i < dt.Rows.Count; i++)
    nonSelectedRows[i] = 1;

int numSelected = 0;
int numLeft = dt.Rows.Count;
int targetNum = dt.Rows.Count * errPercentage;
while(numSelected < targetNum)
{
    for (int row = 0; row < dt.Rows.Count; row++)
    {
       // Each record has a 1/numleft chance of getting selected.
       boolean isSelected = rand.Next(numLeft) == 0; 

       // Check to make sure it hasn't already been selected.
       if(isSelected && nonSelectedRows[row] > 0)
       {
           dtRandomRows.ImportRow(dt.Rows[row]);
           nonSelectedRows[row] = -1; // Mark this row as selected.
           numSelected++;
           numLeft--;
       }

       // We've already found enough to match our targetNum.
       if(numSelected >= targetNum)
           break;
    }
}