有没有办法在不使用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上做这样的事情。
答案 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}},int
,decimal
,money
,byte
,guid
等。
您可以将每个数据库中的每一列都设置为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(请参见下面的链接),您应该能够使用现有的强类型数据集。请注意,我还没有尝试过,但这是我应该研究现有代码库的主题。