c# - DataRow 列和字符串值比较

标签 c# .net datarow

我有以下问题。我将值作为 XML(如字符串)进行传递,并且不会为数字列传递默认值,例如 false 或 0。因此,我创建了一个字典,其中键是列名,值是传递的值。

这是我当前的代码

foreach (KeyValuePair<String, String> kvp in rowValues)
     {
        String passedValue = kvp.Value.Trim();
        String rowValue = bookingRow[kvp.Key].ToString().Trim();
        if (passedValue != rowValue)
        {
           // code here
        }
     }

问题出在默认值上。通过调试我的测试用例,我可以看到 passedValue 为空,rowValue 为 0(列为整数类型)。所以,我的问题是——我应该如何重写上面的代码以正确地将我传递的值转换为列的类型。换句话说,我不需要将它们都转换为字符串,而是需要将传递的值转换为正确类型的 DataRow 列。

传递值的示例 - “”。

rowValue = ""的示例(具有列长度的空字符串)

或者另一个例子:

passedValue = ""的示例

对应rowValue = 0(表中值为Integer)

这两种情况都应视为相同的值 - 无需写入历史记录。

感谢您的回答,我现在正在测试这段代码:

String passedValue = kvp.Value.Trim();
        var rowValue = bookingRow[kvp.Key];
        if (Convert.ChangeType(passedValue, rowValue.GetType()) != rowValue)
        {
           String rowValueString = rowValue.ToString().Trim();
           if (rowValueString!=passedValue) // Double check to prevent cases of "" vs. "          "
              this.SaveToBookingHistory(booking_id, "M", kvp.Key, rowValueString, passedValue, ref messageText, ref statusCode);
        }

最佳答案

我没有你所有的代码,所以这可能不完全正确;但你应该能够做这样的事情......

foreach (KeyValuePair<String, String> kvp in rowValues)
{
    var rowValue = bookingRow[kvp.Key];
    var passedValue = Convert.ChangeType(kvp.Value.Trim(), bookingRow[kvp.Key].GetType());
    // or, if your bookingRow comes from a table
    var passedValue = Convert.ChangeType(kvp.Value.Trim(), table.Columns[kvp.Key].DataType);
    if (passedValue.Equals(rowValue) == false)
    {
        // code here
    }
}

编辑:您将遇到一些问题。您需要使用 .Equals 方法(我更改了上面的代码),因为 ChangeType 返回一个对象;和 != 进行引用比较。这将处理 rowValue 为 0 且 passedValue 为 0 装箱为对象的情况。

但是,这不会解决您有 ""和 ""的情况。这两件事不一样,也不相等;而且,如果不检查它们是字符串的值,您将不知道。因此,我建议您编写一些函数来手动执行比较。

关于c# - DataRow 列和字符串值比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17558617/

相关文章:

c# - 在列值的时间序列中 - 如果行值为空,我如何使用以前的可用值。 c#(数据表/数据行)

c# - 获取具有名称的 DataTable 列的索引

c# - 以编程方式关闭进程后立即结束 Outlook 进程?

c# - 我需要固定匿名代表吗?

c# - MVC 从另一个 MVC 应用程序渲染 (RenderPartial, RenderAction) Html

c# - 实现 ICollection<T> 时无法同时实现 GetEnumerator 返回 IEnumerator 和 IEnumerator<T>

c# - 在 native C++ 中处理 .NET 类

.net - 在 .Net DataSets 上使用列名或列索引更好吗?

仅在调试时捕获 C# 异常?

.net - 希望 .NET 泛型可以继承其中一种泛型参数类型的充分理由是什么?