.NET Core 2.0强类型DataRows

时间:2017-08-25 23:52:32

标签: c# strongly-typed-dataset .net-core-2.0

有没有办法在不使用EF或任何ORM的情况下在C#.NET Core 2.0中强类型DataRow?我在vb.net上使用了数据集,但它看起来还没有。此外,看起来SqlCommandBuilder也不可用。

我在vb.net中使用了类似的东西:

Public Sub EntityToDataSet(ByRef entity As User, ByRef dataset As MyDataSet)
Dim dr As MyDataSet.UsersRow
dr = dataset.Users.NewUsersRow()
dr.Address = entity.Address
dr.Name = entity.Name
_dataAdapterUsers.Update(dataSet)
End Sub

如您所见,数据集提供强类型行。我希望能够在.NET Core上做这样的事情。

2 个答案:

答案 0 :(得分:0)

即使使用.NET核心堆栈和ADO.NET strongly typed DataSets可以使用which they are not,DataRows等,我认为您今天会在.NET核心社区中发现它会很少完全使用DataRow或DataSet,当然不能强制执行强类型,for example。这种概念"强类型" ADO.NET提供的开箱即用的一些关键对象,如DataTable,DataRow,Dataset是一种古老的学校心态。如果你想在这个时代使用强类型解决方案,你只需定义你的类型并在尝试不正确的类型转换时抛出异常,或者甚至不抛出异常,C#将为你抛出无效的强制转换异常。

我认为使用强类型DataRow / DataSet实现让人联想到大约1999-2005的ASP.NET Web Forms堆栈可能会实现的实现也是有道理的。如果我没记错的话ADO.NET DataTable和DataSet开箱即用的开箱即用的强类型功能。但是今天,最好的做法总是让事情变得非常简单和干净,没有微软曾经提供的开箱即用的魔力,这种魔力几乎总是导致单片,难以维护的软件架构。

我相信下面的代码是"强类型"解决方案,使用.NET Core 2.0,ADO.NET并且不使用EF或任何其他ORM,如果您不专注于强类型" DataRow"这个要求让我感到困惑,这是大学的要求,我猜测使用DataRow是你希望实现的,因为你从过去的代码中熟悉它。

请记住,MySQL,SQL Server,Oracle数据库可以设计为"强类型",并且实际上不能以任何其他方式轻松设计,因为列的类型如下:varchar,{ {1}},intdecimalmoneybyteguid等。

您可以将每个数据库中的每一列都设置为blob或byte,然后认为数据库是动态类型的,但这有点愚蠢。

C#是一种强类型"语言。

所以尽管如此,只要大学没有明确要求您使用DataRow或DataSet来强制执行强类型,那么这个解决方案可能符合要求,因为它仍然使用ADO.NET:

nvarchar

对于将引发无效类型转换异常的优秀public class AddressModel { public string Address1 { get; set; } //this is a strongly typed property public int Zip { get; set; } //this is a strongly typed property } public List<AddressModel> GetAddress(int addressId) { List<AddressModel> addressList = new List<AddressModel>(); cmd.CommandText = @"SELECT Address1, Zip FROM [dbo].[Address]"; using (SqlDataReader data = cmd.ExecuteReader()) { while (data.Read()) { AddressModel temp = new AddressModel(); temp.Address1 = Sql.Read<String>(data, "Address1"); temp.Zip = Sql.Read<Int32>(data, "Zip"); } } return addressList; } public static class Sql { public static T Read<T>(DbDataReader DataReader, string FieldName) { int FieldIndex; try { FieldIndex = DataReader.GetOrdinal(FieldName); } catch { return default(T); } if (DataReader.IsDBNull(FieldIndex)) { return default(T); } else { object readData = DataReader.GetValue(FieldIndex); if (readData is T) { return (T)readData; } else { try { return (T)Convert.ChangeType(readData, typeof(T)); } catch (InvalidCastException) { return default(T); } } } } } 扩展方法,信用转到this answer

答案 1 :(得分:0)

强类型数据集只是可视工作室设计人员使用ADO.net数据集生成的c#类。因此,如果支持ADO.net(请参见下面的链接),您应该能够使用现有的强类型数据集。请注意,我还没有尝试过,但这是我应该研究现有代码库的主题。

https://blogs.msdn.microsoft.com/devfish/2017/05/15/exploring-datatable-and-sqldbadapter-in-asp-net-core-2-0/