Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当原始数据表被截断时,为什么数据表副本被截断?_C#_Asp.net_Sql - Fatal编程技术网

C# 当原始数据表被截断时,为什么数据表副本被截断?

C# 当原始数据表被截断时,为什么数据表副本被截断?,c#,asp.net,sql,C#,Asp.net,Sql,我试图保留原始数据表的一个副本,同时尝试出于其他目的截断原始数据表。但是当我截断原始文件时,副本也会被截断 using (SqlCommand cmd = new SqlCommand(sqlSelect, conn)) { //Set Time to minute and a half, should not take longer than that! cmd.CommandTimeout = 90; DataTable dt = new DataTable();

我试图保留原始数据表的一个副本,同时尝试出于其他目的截断原始数据表。但是当我截断原始文件时,副本也会被截断

using (SqlCommand cmd = new SqlCommand(sqlSelect, conn))
{
    //Set Time to minute and a half, should not take longer than that!
    cmd.CommandTimeout = 90;
    DataTable dt = new DataTable();
    DataTable copyDt = new DataTable();

    //Check the state of the database connection. If closed, then open it.
    if (conn.State != ConnectionState.Open)
        conn.Open();

    dt.Load(cmd.ExecuteReader());
    copyDt = dt.Copy();

    if (Session["ServiceRequestSearch"] != null)
    {
        ((DataTable)Session["ServiceRequestSearch"]).Clear();
        ((DataTable)Session["ServiceRequestSearch"]).Dispose();
        Session.Remove("ServiceRequestSearch");
    }

    Session["ServiceRequestSearch"] = copyDt;

    if (dt.Rows.Count > take)
        for (int i = take; i < dt.Rows.Count; i++)
            dt.Rows[i].Delete();

    dt.AcceptChanges();
    TextBox.Text = dt.Rows.Count + "";
    TextBox2.Text = ((DataTable)Session["ServiceRequestSearch"]).Rows.Count + "";



    //Close SQL data connection if it is still open.
    if (conn.State != ConnectionState.Closed)
        conn.Close();
}
使用(SqlCommand cmd=newsqlcommand(sqlSelect,conn))
{
//将时间设置为一分半,不应超过该时间!
cmd.CommandTimeout=90;
DataTable dt=新的DataTable();
DataTable copyDt=新DataTable();
//检查数据库连接的状态。如果已关闭,请将其打开。
如果(连接状态!=连接状态打开)
conn.Open();
dt.Load(cmd.ExecuteReader());
copyDt=dt.Copy();
if(会话[“ServiceRequestSearch”]!=null)
{
((DataTable)会话[“ServiceRequestSearch”]).Clear();
((DataTable)会话[“ServiceRequestSearch”]).Dispose();
删除(“ServiceRequestSearch”);
}
会话[“ServiceRequestSearch”]=copyDt;
如果(dt.Rows.Count>take)
for(int i=take;i

它们都显示相同的行数,即使副本应该更高。

我不知道您将
take
设置到哪里或什么位置,但就在循环之前,您正在检查行数是否大于
take
,然后在for循环中设置
I=take
。如果
take
与行数相同,则不会删除任何行

这看起来像是罪魁祸首,我建议您仔细检查代码并验证
dt.Rows[I].Delete()触发断点

检查if
dt.Rows.Count>take
似乎也有点多余。for循环已经限制了需要删除的正确行数。根据
take
设置的内容,该检查可能会失败

编辑: 事实上,再看看你的代码,我想我意识到了你犯的错误

你想要的是这样的东西:

if (dt.Rows.Count > take)
    for (int i = dt.Rows.Count - 1; i > take; i--)
        dt.Rows[i].Delete();
不确定take是否应该只删除第一个项目,但希望这能让您正确地删除行

编辑2:
我已经更新了for循环,在它被捕获到应该反向删除项目之后。谢谢@YuriyGalanter

我尝试了以下代码。 从原始数据表中删除记录后,在索引处没有行,这是因为它从表中删除了行,计数器的行数将与原始表的行数相同,因此您需要实现一些算法来控制从数据表中删除记录时循环的计数器长度,它不会影响复制版本

    DataTable dt = new DataTable();
    DataTable dtCopy = new DataTable();


    dt.Columns.Add("Test1");
    for (int counter = 0; counter < 10; counter++)
    {
        DataRow dr = dt.NewRow();
        dr[0] = counter.ToString();
        dt.Rows.Add(dr);
    }


    dtCopy = dt.Copy();

    int counterLength = 10;
    for (int counter = 0; counter < counterLength; counter++)
    {
        if (Convert.ToInt32(dt.Rows[counter][0]) > 6)
        {
            dt.Rows[counter].Delete();
            counterLength--;
        }
    }
    dt.AcceptChanges();
DataTable dt=newdatatable();
DataTable dtCopy=新DataTable();
dt.列。添加(“测试1”);
用于(整数计数器=0;计数器<10;计数器++)
{
DataRow dr=dt.NewRow();
dr[0]=计数器.ToString();
dt.Rows.Add(dr);
}
dtCopy=dt.Copy();
int计数器长度=10;
用于(int计数器=0;计数器<计数器长度;计数器++)
{
如果(转换为32行[计数器][0])>6)
{
dt.Rows[counter].Delete();
对长--;
}
}
dt.AcceptChanges();

尝试复制每个值,如

copyDt = dt.Clone();
foreach(DataRows row in dt.Rows)
{
    copyDt.Rows.Add(row.ItemArray);
}

您确定要从原始数据表中删除行吗?如果您只是尝试从内存中的数据表中删除行,而不是从基础数据库中删除行,您可能会看到使用Remove()而不是delete()时发生的情况。您还可以尝试一些Linq代码,比如foreach(varrow in Rows.Cast().Skip(take)){row.Remove();}。这并不能解释为什么
copyDt
会变得越来越复杂truncated@YuriyGalanter对。但是,没有证据表明任何实际行正在被删除。如果他回来说两个表中最初都有X行,最后有Y行,我会继续删除答案。没有太多的信息可供参考,看看MSDN,Copy()听起来像是对原件或副本所做的更改不应影响其他内容。我的观点是正确的。我被“应该有更多行”甩了,没有考虑到可能没有删除的事实。顺便说一句,我会开始从最高的行索引中删除
I--
,否则在较低的行之后可能就没有更高的行可以删除了deleted@YuriyGalanter说得好。我甚至没想过。我会更新答案。