需要更正或更好的方式通过SQL ADO.NET读取数据吗
目前我使用需要更正或更好的方式通过SQL ADO.NET读取数据吗,.net,ado.net,.net,Ado.net,目前我使用DataSet从ADO.NET SQL provider读取数据,但我了解到DataReader在某些情况下更有效。很多时候,我只读取单个/少数记录,不需要内存中的数据或多个表关系操作 有没有更干净有效的阅读方法 我可以用一种简单的方式将完整记录直接映射到代理类,而不必像现在这样解析每一列吗 编辑:-我对ORMs进行了一些研究,并使用了一点Linq2SQL,但熟悉度曲线似乎有点陡峭,所以就到此为止。请建议.NET中可用的其他方法,而不是任何外部工具 public override Ag
DataSet
从ADO.NET SQL provider读取数据,但我了解到DataReader
在某些情况下更有效。很多时候,我只读取单个/少数记录,不需要内存中的数据或多个表关系操作
public override Agent GetAgentByAgentId(string agentId)
{
Agent agent;
try
{
ArrayList paramList = new ArrayList();
paramList.Add(_dbUtilities.CreateSqlParamater("@agent_id", SqlDbType.VarChar, 10, ParameterDirection.Input, agentId));
// Query the database for an agent with given agentId
DataSet ds = _dbLib.ExecuteProcedureDS("sp_dbc_agentsSelect", paramList);
if (ds != null && ds.Tables != null && ds.Tables.Count > 0)
{
DataTable dt = ds.Tables[0];
if (dt.Rows.Count > 0)
{
agent = new Agent();
DataRow dr = dt.Rows[0];
// Get the agent data
agent.IsActive = bool.Parse(dr["is_active"].ToString());
agent.UserId = dr["user_id"].ToString();
....
}
}
您可以使用ORM,例如。
它们将自动生成SQL并将属性复制到业务对象。您可以使用ORM,例如。
它们将自动生成SQL并将属性复制到业务对象。从ORM回到纯SQL和ADO,启发我创建一种简单的数据提取方法,而不是您现在的方法(以及我以前的方法) 这里有很多代码要展示,但我将简要介绍如何处理这些代码 创建一个继承自
属性的列
类
在您的代理
课程中,按如下方式装饰您的物业:
[Column("is_active")]
public bool IsActive { get; set; }
[Column("user_id")]
public int UserId { get; set; }
从这一点上,您应该能够从类属性中获取这些自定义属性,并获取列并设置属性值:
property.SetValue(t, value, null);
如果你做对了,你应该得到如下结果:
agent = dt.Rows[0].ExtractAs<Agent>();
agent=dt.Rows[0].ExtractAs();
如果该方法的签名可以是:
public static T ExtractAs<T>(this DataRow row) where T : class, new()
{
/* map columns to properties */
}
publicstatict提取器(这个数据行),其中T:class,new()
{
/*将列映射到属性*/
}
从ORM回到纯SQL和ADO,启发我创建了一种简单的数据提取方法,而不是您现在的方式(以及我以前的方式)
这里有很多代码要展示,但我将简要介绍如何处理这些代码
创建一个继承自属性的列
类
在您的代理
课程中,按如下方式装饰您的物业:
[Column("is_active")]
public bool IsActive { get; set; }
[Column("user_id")]
public int UserId { get; set; }
从这一点上,您应该能够从类属性中获取这些自定义属性,并获取列并设置属性值:
property.SetValue(t, value, null);
如果你做对了,你应该得到如下结果:
agent = dt.Rows[0].ExtractAs<Agent>();
agent=dt.Rows[0].ExtractAs();
如果该方法的签名可以是:
public static T ExtractAs<T>(this DataRow row) where T : class, new()
{
/* map columns to properties */
}
publicstatict提取器(这个数据行),其中T:class,new()
{
/*将列映射到属性*/
}
首先,我想推荐SLak的答案。这确实是你问题的答案。我理解您对使用大型工具集(如EF)的担忧,但它确实是正确的解决方案,没有您想象的那么多学习曲线。再也没有什么理由直接使用DataReader
之类的东西了。EF是.NET的一部分,我无法鼓励您使用它
同样地,不要使用装饰和自动代码生成之类的方法来创建自己的ORM。做不做信息技术最后,你将花费与你的业务逻辑一样多的时间来维护它,并且你会因为没有使用许多比我聪明得多的人的工作而责备自己,也许你也一样;)(当然不是冒犯)。如果你在寻找又快又脏的东西,那么你就需要去又快又脏的地方
也就是说,使用DataReader
是从数据库读取数据的最轻量级方法
我不知道如何准确回答你的第一个问题,只是给你举一个在C#中使用DataReader
的例子
while
语句将对从读卡器检索到的每一行执行,不过如果需要,您当然可以短路该循环,而不是解析整个结果集。首先,我建议使用SLak的答案。这确实是你问题的答案。我理解您对使用大型工具集(如EF)的担忧,但它确实是正确的解决方案,没有您想象的那么多学习曲线。再也没有什么理由直接使用DataReader
之类的东西了。EF是.NET的一部分,我无法鼓励您使用它
同样地,不要使用装饰和自动代码生成之类的方法来创建自己的ORM。做不做信息技术最后,你将花费与你的业务逻辑一样多的时间来维护它,并且你会因为没有使用许多比我聪明得多的人的工作而责备自己,也许你也一样;)(当然不是冒犯)。如果你在寻找又快又脏的东西,那么你就需要去又快又脏的地方
也就是说,使用DataReader
是从数据库读取数据的最轻量级方法
我不知道如何准确回答你的第一个问题,只是给你举一个在C#中使用DataReader
的例子
while
语句将对从读卡器检索到的每一行执行,不过如果需要,您当然可以缩短该循环,而不是解析整个结果集。我目前使用的是一个n层环境进行开发。我有一个核心数据类,我的所有数据层类都继承自该类,即单个数据库连接。它具有执行存储过程或t-sql的方法。这些方法可以返回业务对象用于加载变量的sqlreader对象。我将发布一些示例。我希望这有帮助
这是我的核心数据类:
Imports System.Data
Imports System.Data.SqlClient
Namespace Datalayer
''' <summary>
''' Base class to connect to a database using a single connection.
''' </summary>
''' <remarks>
''' jwames - 12/20/2010 - original code
''' </remarks>
Public Class CoreDataClass
Implements IDisposable
#Region "attributes"
Private _connection As SqlConnection
Private _connectionString As String = My.Settings.PowerNetPricingDB()
Private _disposedValue As Boolean
Private _pool As Boolean
#End Region
#Region "constructor"
''' <summary>
''' Initialize the connection string
''' </summary>
''' <remarks>
''' jwames - 12/20/2010 - original code
''' </remarks>
Public Sub New()
_connection = New SqlConnection(_connectionString)
_disposedValue = False
_pool = False
End Sub
#End Region
#Region "functions"
''' <summary>
''' IDisposable implementation
''' </summary>
''' <param name="disposing"></param>
''' <remarks>
''' jwames - 12/10/2010 - original code
''' </remarks>
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not _disposedValue Then
If disposing Then
If _connection Is Nothing = False Then _connection.Dispose()
End If
_connectionString = Nothing
End If
_disposedValue = True
End Sub
''' <summary>
''' Dispose of the database connection objects
''' </summary>
''' <remarks>
''' jwames - 12/20/2010 - original code
''' </remarks>
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
''' <summary>
''' Base function used to execute queries that return results
''' </summary>
''' <remarks>
''' jwames - 12/20/2010 - generated by original code
''' </remarks>
Protected Function GetDataReader(ByRef cmd As SqlCommand) As SqlDataReader
Try
cmd.CommandType = CommandType.StoredProcedure
If Me.Connection.State = ConnectionState.Closed Then Me.Connection.Open()
If _pool Then
Return cmd.ExecuteReader()
Else
Return cmd.ExecuteReader(CommandBehavior.CloseConnection)
End If
Catch ex As SqlException
Throw ex
End Try
End Function
''' <summary>
''' Base function used to execute dynamic queries that return results
''' </summary>
''' <remarks>
''' jwames - 12/20/2010 - original code
''' </remarks>
Protected Function GetDataReader(ByVal sql As String) As SqlDataReader
Try
Dim cmd As New SqlCommand(sql, Me.Connection)
cmd.CommandType = CommandType.StoredProcedure
If Me.Connection.State = ConnectionState.Closed Then Me.Connection.Open()
If _pool Then
Return cmd.ExecuteReader()
Else
Return cmd.ExecuteReader(CommandBehavior.CloseConnection)
End If
Catch ex As SqlException
Throw ex
End Try
End Function
''' <summary>
''' Base function that will execute a procedure
''' </summary>
''' <remarks>
''' jwames - 12/20/2010 - original code
''' </remarks>
Protected Sub ExecuteCommand(ByVal cmd As SqlCommand)
Try
cmd.CommandType = CommandType.StoredProcedure
If Me.Connection.State = ConnectionState.Closed Then Me.Connection.Open()
cmd.ExecuteNonQuery()
If _pool = False Then
Me.Connection.Close()
Me.Connection.Dispose()
End If
Catch ex As SqlException
Throw ex
End Try
End Sub
''' <summary>
''' Base function that will execute a procedure
''' </summary>
''' <remarks>
''' jwames - 12/20/2010 - original code
''' </remarks>
Protected Sub ExecuteCommand(ByVal sql As String)
Try
Dim cmd As New SqlCommand(sql, Me.Connection)
cmd.CommandType = CommandType.StoredProcedure
If Me.Connection.State = ConnectionState.Closed Then Me.Connection.Open()
cmd.ExecuteNonQuery()
If _pool = False Then
Me.Connection.Close()
Me.Connection.Dispose()
End If
Catch ex As SqlException
Throw ex
End Try
End Sub
#End Region
#Region "properties"
Public Property Connection() As SqlConnection
Get
Return _connection
End Get
Set(ByVal value As SqlConnection)
_connection = value
End Set
End Property
''' <summary>
''' Use the same connection to run multiple queries
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks>
''' jwames - 12/20/2010 - original code
''' </remarks>
Public Property PoolConnections() As Boolean
Get
Return _pool
End Get
Set(ByVal value As Boolean)
_pool = value
End Set
End Property
#End Region
End Class
End Namespace
导入系统数据
导入System.Data.SqlClient
命名空间数据层
'''
''基类使用单个连接连接到数据库。
'