需要更正或更好的方式通过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
在某些情况下更有效。很多时候,我只读取单个/少数记录,不需要内存中的数据或多个表关系操作

  • 有没有更干净有效的阅读方法

  • 我可以用一种简单的方式将完整记录直接映射到代理类,而不必像现在这样解析每一列吗

  • 编辑:-我对ORMs进行了一些研究,并使用了一点Linq2SQL,但熟悉度曲线似乎有点陡峭,所以就到此为止。请建议.NET中可用的其他方法,而不是任何外部工具

    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
    命名空间数据层
    ''' 
    ''基类使用单个连接连接到数据库。
    '