DataTable中的Clone以及Select用法

本文介绍了一种在现有评论系统中实现特定用户(如社区主任)评论自动置顶的方法。通过在DataTable中新增置顶字段,并根据该字段对评论进行排序,确保了官方回复的可见性。

在做的项目中有评论功能,要求是如果是社区主任的回复,就自动置顶,代表是官方的回复,原来的数据库中没的这个置顶字段,所以就想到 了在New出来的DataTable中来实现这个功能。

    /// <summary>
    /// 加载评论信息
    /// </summary>
    private void LoadData()
    {
        string strSql = ViewState["strSql"].ToString();
        //Response.Write(strSql);
        DataTable myDt = myDbAccess.GetTable(strSql);

        DataTable DT = new DataTable();
       
        DT.Columns.Add("NickName");
        DT.Columns.Add("HeadPhoto");
        DT.Columns.Add("UserNo");
        DT.Columns.Add("CommentDate");
        DT.Columns.Add("CommentContent");
        DT.Columns.Add("IfTop",typeof(Int16));//如果是社区主任回复的,就自动置顶=1,代表官方回复

        for (int i = 0; i < myDt.Rows.Count; i++)
        {
            string strHeadPhoto, strSex;
            DataRow dr = DT.NewRow();
            dr["CommentDate"] = myDt.Rows[i]["cDatetime"].ToString();
            dr["CommentContent"] = myDt.Rows[i]["cContent"].ToString();
            dr["NickName"] = myDt.Rows[i]["NickName"].ToString();
            //dr["UserNo"] = myDt.Rows[i]["UserNO"].ToString();
            //加密用户名  2014年2月19日12:30:26   小马
            dr["UserNo"] =CryptoHelper.Encrypt(myDt.Rows[i]["UserNO"].ToString(),"ABCDEFGHIJKLMNOP");
            strHeadPhoto = myDt.Rows[i]["HeadPhoto"].ToString();
            strSex = myDt.Rows[i]["Sex"].ToString();

            if (myDbAccess.FileExists(strHeadPhoto))
            {
                dr["HeadPhoto"] = strHeadPhoto;
            }
            else
            {
                dr["HeadPhoto"] = MyCheck.FormatUserPic(strHeadPhoto, strSex);
            }
            if (myDbAccess.CheckSNSHead(myDt.Rows[i]["UserNO"].ToString()))
            {
                dr["IfTop"] = 1;
            }
            else {
                dr["IfTop"] = 0;
            }
            DT.Rows.Add(dr);
        }

        //2014年3月24日10:43:04  小马   如果是社区主任回复的就置顶,代表官方回复 
      DataRow[] sortrows= DT.Select("1=1","IfTop DESC");//根据置顶来排序(第一个参数是where ,第二个参数是排序字段以及排序规则)
      DataTable SortDT = new DataTable();//创建新表
      SortDT = DT.Clone();//把上面的DT表结构复制到 新表中
      foreach (DataRow row in sortrows) {//为新表填充数据
          SortDT.Rows.Add(row.ItemArray);
      }


DataTable的Select()方法类似于我们用sql语句,这里用两个参数的方法是表示:第一个参数是需要传入的where条件,但是where不用写,第二个参数代表你需要排序的字段,直接写上排序字段名称和排序规则就可以了,不需要写order by.

Clone方法是把原来表中的定义好的列名这些复制到 新的表中 ,也就是复制表结构到 新表。


欢迎加入.net技术交流群.Net技术交流


在 C# 中,`DataTable.Select` 方法用于根据指定的筛选条件和排序规则从 `DataTable` 中检索数据行。如果筛选条件没有匹配到任何数据,`DataTable.Select` 方法不会抛出错误或异常,而是返回一个空的 `DataRow[]` 数组。因此,开发者需要主动检查返回的数组是否为空或长度为零,以避免后续操作中出现错误。 ### 如何处理没有匹配结果的情况 当使用 `DataTable.Select` 方法时,可以通过检查返回的 `DataRow[]` 数组的长度来判断是否有匹配的结果。如果没有匹配结果,可以采取以下几种方式处理: - **忽略操作**:直接跳过后续的数据处理逻辑。 - **显示提示信息**:向用户反馈未找到匹配数据。 - **提供默认数据**:例如创建一个新的空 `DataTable` 或填充默认值。 #### 示例代码 以下是一个处理 `DataTable.Select` 无结果的示例: ```csharp DataRow[] rows = dataTable.Select("ColumnName = 'SomeValue'"); if (rows.Length == 0) { // 没有找到匹配的数据 Console.WriteLine("没有找到匹配的结果。"); // 可以选择创建一个空的 DataTable 或显示提示信息 } else { // 处理找到的数据 foreach (DataRow row in rows) { Console.WriteLine(row["ColumnName"]); } } ``` ### 使用 `DataTable.Clone()` 创建空表结构 如果需要在没有匹配数据时返回一个空的 `DataTable`,可以使用 `DataTable.Clone()` 方法复制原表的结构,但不包含数据: ```csharp DataTable filteredTable = dataTable.Clone(); // 复制表结构 DataRow[] rows = dataTable.Select("ColumnName = 'SomeValue'"); if (rows.Length > 0) { foreach (DataRow row in rows) { filteredTable.ImportRow(row); // 将匹配的行导入新表 } } // 绑定到数据源或继续处理 filteredTable ``` ### 异常处理机制 虽然 `DataTable.Select` 本身不会抛出异常,但如果筛选表达式格式错误(如列名错误或语法错误),则会在运行时抛出 `EvaluateException`、`SyntaxException` 或其他相关异常。此时应使用 `try-catch` 块捕获异常: ```csharp try { DataRow[] rows = dataTable.Select("InvalidColumnName = 'SomeValue'"); } catch (Exception ex) { Console.WriteLine("筛选数据时发生错误:" + ex.Message); } ``` ### 小结 - `DataTable.Select` 在没有匹配数据时返回空数组,不会引发错误。 - 开发者应主动检查返回数组的长度。 - 可以结合 `DataTable.Clone()` 和 `ImportRow()` 方法来处理无匹配数据的情况。 - 如果筛选表达式存在问题,应使用 `try-catch` 捕获异常。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值