我有一个应用程序循环通过固定宽度的文本文件,将每一行读取到一个字符串变量并使用.Substring()方法查找给定字段的数据.对于给定的字段,它检查内容是否只是空格,或者其中是否存在实际的"数据",即除了空格之外的任何内容.例如,如果存在数据,并且该数据表示日期,则对该数据运行DateTime.Parse()并将其传递到C#DataTable中的datetime类型的字段; 但是,如果没有数据 - 只是空格,我想简单地将空值传递给该字段.以下是一段代码来说明:
var dataTable = new DataTable();
dataTable.Columns.Add("Application_Date").DataType = Type.GetType("System.DateTime");
while (!sr.EndOfStream)
{
string row = sr.ReadLine();
if (row.Substring(0, 1) == "2" && row.Substring(42, 1) == "T")
{
DataRow dr = dataTable.NewRow();
dr["Application_Date"] = row.Substring(124, 8) != " " ?
DateTime.Parse(row.Substring(124, 4) +
"-" + row.Substring(128, 2) + "-" +
row.Substring(130, 2)) :
null as DateTime?;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我尝试运行它时,它会抛出一个错误,说它想要一个DBNull(Cannot set Column 'Application_Date' to be null. Please use DBNull instead.)
但是当我尝试简单地传递一个DBNull时,它告诉我它无法在DateTime和DBNull(Type of conditional expression cannot be …
我有两个DataTables,我想从第一个中选择第二个不存在的行
例如:
Table A id column 1 data1 2 data2 3 data3 4 data4 Table B id column 1 data10 3 data30
我希望结果如下:
Table C id column 2 data2 4 data4
我通过非常简单的代码进行研究,并且一直看到数据表的dispose()结果
以下是代码
DataTable dt= new Datatable();
SqlCommand Cmd = new SqlCommand("sp_getData",SqlCon);
SqlCommand.CommandType= CommandType.StroedProcedure;
SqlCon.Open();
sqlDataReader dr= cmd.ExecuteReader();
dt.Load(dr);
SqlCon.Close();
grdView.DataSource =dt;
dt.Dispose() // Here I dispose the table as it is no use for me & wanna memory free from this
Run Code Online (Sandbox Code Playgroud)
但在处理掉数据表之后我仍然发现它仍然显示RowCount = 10k.
Dispose()方法是不是释放内存并使对象为null?
我怎样才能使它成为null或释放这个对象占用的内存?
这是一个"让我们看看它是否可以完成"运动比什么都重要.
假设我有一个包含多个列的DataTable.使用linq,是否可以选择表的行,使得结果将是匿名类型的序列,其中匿名类型的每个属性根据DataTable的列名命名,并且每个属性的类型都设置为适当.
所以,如果我的DataTable有三列如下:
Name = "Column1", DataType = string
Name = "Column2", DataType = integer
Name = "Column3", DataType = bool
Run Code Online (Sandbox Code Playgroud)
然后我想选择DataTable的所有行,使匿名类型有三个属性:
DataSet ds = functionThatGetsADataSet();
var seq = ds.Tables[0].AsEnumerable().Select( r => **** MAGIC HERE ****)
foreach (var s in seq)
{
Console.WriteLine(s.Column1);
Console.WriteLine(s.Column2);
Console.WriteLine(s.Column3);
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
DataSet ds = functionThatGetsADataSet();
var seq = ds.Tables[0].AsEnumerable().Select( r =>
new
{
Column1 = r.Field<string>("Column1"),
Column2 = r.Field<int>("Column2"),
Column3 = r.Field<bool>("Column3"),
}
)
foreach (var s in seq)
{
Console.WriteLine(s.Column1);
Console.WriteLine(s.Column2);
Console.WriteLine(s.Column3);
} …Run Code Online (Sandbox Code Playgroud) 我有一个DataTable不同类型的列.我想要的是DataTable具有相同列名但所有值都是字符串的.也就是说,如果这是第一个:
Name Age
-----------
John 31
Alice 27
Marge 45
Run Code Online (Sandbox Code Playgroud)
其中Name是一String列,Age是一Int32列,我想要的是:
Name Age
-----------
John 31
Alice 27
Marge 45
Run Code Online (Sandbox Code Playgroud)
其中,姓名和年龄是两个字符串列.输出表必须包含与输入表相同的值,但每个值都必须转换为字符串.任何人都可以提供有关如何做到这一点的任何见解吗?我想过可能会做类似的事情
foreach (DataColumn col in inputTable.Columns)
{
outputTable.Columns.Add(col.ColumnName, typeof(string));
foreach (DataRow row in inputTable.Rows)
{
...??
}
}
Run Code Online (Sandbox Code Playgroud)
或者可能有更好或更有效的方法?任何指导将不胜感激.
这个问题涉及泛型和类型以及数据表.
以下代码片段在此处和网络周围,并基于泛型类型创建数据表:
public static DataTable ListToDataTable<T>(List<T> list)
{
DataTable dt = new DataTable();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
}
foreach (T t in list)
{
DataRow row = dt.NewRow();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
row[info.Name] = info.GetValue(t, null);
}
dt.Rows.Add(row);
}
return dt;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用优秀的FileHelpers库将批量记录导入SQL Server.要使用SqlBulkCopy,我需要一个包含给定类型列的数据表.Filehelpers可以在运行时读取.cs文件并基于此创建您的类型.例如:
System.Type userType = null;
userType = ClassBuilder.ClassFromSourceFile("myclassfile.cs");
Run Code Online (Sandbox Code Playgroud)
我想改变上面的方法,所以它只是在传递一个类型时为我创建列(例如'userType').即方法签名将是这样的:
public static DataTable TypeToDataTable<T>(<T> myType)
Run Code Online (Sandbox Code Playgroud)
并将返回一个包含列的空数据集,准备添加userType行.
我尝试了各种方法 - 任何想法?
由于没有多大意义的原因(阅读:不是我的决定)我需要在DataTable中保留大量的行,大约~90,000,我没有使用数据库的选项.
我需要能够有效地搜索DataTable以查找符合某些基本条件的行.例如,我可能正在查看两个特定列中值为2的行.
做这个的最好方式是什么?
编辑:请查看http://chat.stackoverflow.com/transcript/message/62648#62648了解更多详情; 在我完成这项工作后,我将尝试从聊天中总结额外的细节,并提供我的解决方案.
我有以下场景:
表 A 有 50 条记录,表 B 有 2 条记录。
我需要定义一个新表,比如 TableDiff,它应该包含表 A 中不存在于表 B 中的 48 条记录
我的问题是表 A 和表 B 不相同,但我有rowId两个表中存在的字段,我需要使用它进行比较。
我已经从C#.Net中的多个xml文件填充了数据集。结果,我有了一个包含多个DataTables的数据集。它们全部都有两列,分别是“ ID”和“ Name”。这些数据表可以包含相同ID的行,而不是所有表。
例如:
DataTable 1
------------
ID Name1
1 S1
2 S2
4 S4
DataTable 2
------------
ID Name2
1 D1
2 D2
3 D3
Run Code Online (Sandbox Code Playgroud)
我的目标是将所有数据组合到一个数据表中,如下所示
FinalTable
-----------
ID Name1 Name2
1 S1 D1
2 S2 D2
3 D3
4 S4
Run Code Online (Sandbox Code Playgroud)
有什么办法可以做到这一点?可能正在使用关系,DataViews ...只是猜测。
提前致谢..