&n">
Maison base de données tutoriel mysql 开发自己的Data Access Application Block[上篇]

开发自己的Data Access Application Block[上篇]

Jun 07, 2016 pm 03:48 PM
access application data 开发 propre

经常在网上看到对ORM的讨论沸沸扬扬,我也来凑个热闹,谈谈我写的一个ORM。最近在做一项工作,把我们经常用到的一些业务逻辑抽象出来,写成一个个的Application Block,使之可以运用到不同的Application中,比如Data Access,Messaging,Auditing,Data bind

经常在网上看到对ORM的讨论沸沸扬扬,我也来凑个热闹,谈谈我写的一个ORM。最近在做一项工作,把我们经常用到的一些业务逻辑抽象出来,写成一个个的Application Block,使之可以运用到不同的Application中,比如Data Access,Messaging,Auditing,Data binding等等。现在先做一个Data access application block。由于时间仓促,没有进行什么优化和较多的测试,大家不必深究我所提供的Code ,我只希望为大家的ORM提供另一种想法。

这个application block应达到的目的:

  • 封装所有的Data Access操作。

  • 适合主流的DBMS:SQL Server(2000和2005),Oracle(9i和10g),DB2。

  • 尽量简化Developer的操作和提供最大的灵活性,在Data Retrieval方面,只要指定SQL或者Stored Procedure和相应的参数;在Data Update方面,既可以直接调用SQL和Stored Procedure,还可以把包含多个相互关联Data Table的Dataset通过一次调用实现数据的更新。此外,可以自由地选择使用SQL还是Stored procedure;可以使用Commander builder生成Command或者使用基于Mapped stored procedure生成的Command进行数据更新。

  • 实现泛型编程,使使用该AppBlock的代码能够适合所有的数据库。

  • 实现Transaction。

  • 提供可配置性,包括不同数据库的配置,不同Data Mapping的配置等等。

下面是该AppBlock使用到的Entity:
开发自己的Data Access Application Block[上篇]

  • Database:Abstract Class,封装了绝大部分和具体数据库无关的Data Access操作逻辑。通过两个Mapping:IDbParameterNameMapping和IStoredProcedureNameMapping,实现Dataset和Db的一个映射。比如Dataset中Data table name和Stored procedure name的Mapping,Data table中Field和Stored procedure中参数名的Mapping。这两个Mapping是可以配置的,你只需要实现提供的Interface编写适合你的Mapping provider就可以了。

  • SqlDatabase:封装基于SQL Server 的操作。ADO.NET 2.0在1.0的基础上作了很大的改善,主要的增加的大量的基类,为我们进行泛型编程,编写和具体Db无关的代码变得异常容易。所以我们把大多数Data Access的操作可以封装在Abstract Database类中,SqlDatabase中的内容实际上是很少的。

  • OracleDatabase:封装基于Oracle的操作。

  • IDbParameterNameMapping和IStoredProcedureNameMapping:我想大家都是这样的感受,实现ORM的本质就是实现内存中的数据(主要是Dataset)和数据库的一个映射。在Dataset和数据库中的Table相互Mapping方面,我觉得没有必要采用特殊的Mapping,直接和简单易行的就是Table和Dataset中的Data Table完全匹配(table name 和field name完全匹配)。所以重要的是实现Dataset和Stored procedure的Mapping:Table Name如何与进行Insert,Update,Delete的Stored procedure name匹配,不同Version(original & current)的Field如何与Stored procedure的Parameter name 匹配。而这样一个匹配应该是可配置的,因为每个Application在数据库设计时的命名都有各自的要求,所以我在这里采用的Provider的设计模式。用户可以实现这两个Interface编写适合自己的Mapping provider,通过我提供的Configuration block很容易地完成配置。同时,我写了一个默认的,简单的Mapping:SimpleDbParameterNameMapping和SimpleStoredProcedureNameMapping。

      有一点需要补充的是,要实现上面的Mapping,对Stored Procedure的命名有较高的要求,手工编写的方式已经不能适合我们的要求,所以我们需要一个生成Stored procedure的Generator,这个Generator也使用这两个可配置的Mapping接口。

  • DatabaseFactory: 一个静态的类,根据配置的信息创建你需要的具体的Database对象,实现泛型化编程。

  • DataAccessConfigurationCollection,DataAccessConfigurationElement,DataAccessConfigurationdiv 三个Configuration的Class。

为了使大家清楚地看出这个Application block所有的操作,我把所有的操作封装在一个IDatabase的interface中,不过需要注意的是,我采用的是基于Abstract class的编程,而不是基于Interface的编程,相信大家对这两种方式讨论得已经碰倒的太多了,孰优孰劣我就不想对说了。这个IDatabase 接口,只是展示所有Operation之用,并没有在我的代码中用到。

开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]namespace Artech.ApplicationBlock.DataAccess
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]    
public interface IDatabase
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Fill a System.Data.DataSet with retrieved data.#region Fill a System.Data.DataSet with retrieved data.
开发自己的Data Access Application Block[上篇]        
void FillDataSet(DataSet dataInfo, string commandText, IDictionarystringobject> parameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void FillDataSet(DataSet dataInfo, string tableName, string commandText, IDictionarystringobject> parameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void FillDataSet(DataSet dataInfo, string tableName, CommandType commandType, string commandText, IDictionarystringobject> parameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Save the changed data which is stored in a dataset into database.#region Save the changed data which is stored in a dataset into database.
开发自己的Data Access Application Block[上篇]        
void UpdateData(DataSet dataInfo);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void UpdateData(DataTable table);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void UpdateData(DataTable table, string insertCommandText, string updateCommandText, string deleteCommandText,
开发自己的Data Access Application Block[上篇]           Dictionary
stringobject> insertParameters, Dictionarystringobject> updateParameters, Dictionarystringobject> deleteParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]                
void UpdateData(DataTable table, CommandType commandType, string insertCommandText, string updateCommandText, string deleteCommandText,
开发自己的Data Access Application Block[上篇]            Dictionary
stringobject> insertParameters, Dictionarystringobject> updateParameters, Dictionarystringobject> deleteParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void UpdateData(DataTable table, DbCommand insertCommand, DbCommand updateCommand, DbCommand deleteCommand);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Execute a command and return the affect row count.#region Execute a command and return the affect row count.
开发自己的Data Access Application Block[上篇]        
int ExecuteNonQuery(CommandType commandType, string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
int ExecuteNonQuery(CommandType commandType, string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
int ExecuteNonQuery( string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
int ExecuteNonQuery( string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Execute a command and return the data in the form of data reader.#region Execute a command and return the data in the form of data reader.
开发自己的Data Access Application Block[上篇]        DbDataReader ExecuteReader(CommandType commandType, 
string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        DbDataReader ExecuteReader(CommandType commandType, 
string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        DbDataReader ExecuteReader(
string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        DbDataReader ExecuteReader(
string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Execute a command and return a scalar value.#region Execute a command and return a scalar value.
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
object ExecuteScalar(CommandType commandType, string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
object ExecuteScalar(CommandType commandType, string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
object ExecuteScalar(string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
object ExecuteScalar(string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Transaction based operation#region Transaction based operation
开发自己的Data Access Application Block[上篇]        
void BeginTransaction();
开发自己的Data Access Application Block[上篇]        
void Commit();
开发自己的Data Access Application Block[上篇]        
void RollBack();
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]    }

开发自己的Data Access Application Block[上篇]}

开发自己的Data Access Application Block[上篇]

这个列表和大部分ORM没有什么太大的区别,大家已经司空见惯,实现起来也不会有什么太大的困难。对于大部分操作,我不会做详细的介绍。接下来我们来简要地看看这样一个AppBlock是如何实现的。
1. Data Mapping

我们首先来看看Data Mapping:实现Dataset中Table name和Stored Procedure Name的Mapping,以及Dataset 中的Field 和Stored procedure的参Parameter name的Mapping。

IDbParameterNameMapping

开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]using System;
开发自己的Data Access Application Block[上篇]
using System.Collections.Generic;
开发自己的Data Access Application Block[上篇]
using System.Text;
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]
namespace Artech.ApplicationBlock.DataMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
/**//// 


开发自己的Data Access Application Block[上篇]    
/// IStoredProcedureNameMapping defines the mapping between the data table name and the name of stored procedures to perform insertion, modification and deletion operation.
开发自己的Data Access Application Block[上篇]    
/// 
开发自己的Data Access Application Block[上篇]    public interface IStoredProcedureNameMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the name of stored procedure to perform seletion operation.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The name of the database table.
开发自己的Data Access Application Block[上篇]        
/// The name of stored procedure to perform seletion operation

开发自己的Data Access Application Block[上篇]        string GetSelectStoredProcedureName(string tableName);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the name of stored procedure to perform insert operation.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The name of the database table.
开发自己的Data Access Application Block[上篇]        
/// The name of stored procedure to perform insertion operation

开发自己的Data Access Application Block[上篇]        string GetInsertStoredProcedureName(string tableName);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the name of stored procedure to perform modification operation.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The name of the database table.
开发自己的Data Access Application Block[上篇]        
/// The name of stored procedure to perform modification operation

开发自己的Data Access Application Block[上篇]        string GetModifyStoredProcedureName(string tableName);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the name of stored procedure to perform deletion operation.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The name of the database table.
开发自己的Data Access Application Block[上篇]        
/// The name of stored procedure to perform deletion operation

开发自己的Data Access Application Block[上篇]        string GetDeleteStoredProcedureName(string tableName);
开发自己的Data Access Application Block[上篇]    }

开发自己的Data Access Application Block[上篇]}

开发自己的Data Access Application Block[上篇]

IDbParameterNameMapping

开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]using System;
开发自己的Data Access Application Block[上篇]
using System.Collections.Generic;
开发自己的Data Access Application Block[上篇]
using System.Text;
开发自己的Data Access Application Block[上篇]
using System.Data;
开发自己的Data Access Application Block[上篇]
namespace Artech.ApplicationBlock.DataMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
/**//// 


开发自己的Data Access Application Block[上篇]    
/// IDbParameterNameMapping define the defult mapping between the source column name and the parameter name of the corresponding stored procedure.
开发自己的Data Access Application Block[上篇]    
/// 
开发自己的Data Access Application Block[上篇]    public interface IDbParameterNameMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the source column name based on the parameter name of the related stored procedure.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The parameter name of the corresponding stored procedure.
开发自己的Data Access Application Block[上篇]        
/// The source column name corresponding to the parameter name.

开发自己的Data Access Application Block[上篇]        string GetSourceCoulmnName(string patameterName);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the source parameter name based on the source column name.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The source column name corresponding to the parameter name.
开发自己的Data Access Application Block[上篇]        
/// The data row version of the source solumn conressponding to the parameter.
开发自己的Data Access Application Block[上篇]        
/// The parameter name of the corresponding stored procedure.

开发自己的Data Access Application Block[上篇]        string GetParameterName(string columnName, DataRowVersion rowVersion);
开发自己的Data Access Application Block[上篇]    }

开发自己的Data Access Application Block[上篇]}

开发自己的Data Access Application Block[上篇]

这两个Mapping主要用在通过Dataset跟新数据库的场景,利用IDbParameterNameMapping,我们通过Dataset中各个Table name获得对它进行Insert,Update,Delete操作的Stored procedure的name。利用IDbParameterNameMapping,我们可以为Stored procedure的Parameter指定对应的Source field.  

注:GetParameterName方法实际上是不需要的,我把使用在另一个AppBlock中。

接下来我们来写两个实现了上面连个Interface的默认的mapping:SimpleStoredProcedureNameMapping和SimpleDbParameterNameMapping。他实际上实现了这样的Mapping:比如Table name为T_ABC_DEF(我经常用的命名方式:以T开头代表Table,名称大写并一下划线连接),那么对应的Stored procedure name分别为:sp_abc_def_s(Select), sp_abc_def_i(Insert), sp_abc_def_u(Update), sp_abc_def_d(delete)。如果Field name为ABC_123,那么对于Original version的Parameter name为o_abc_123(o代表Original),Current version的Parameter name为p_abc_123(p代表一般意义的Parameter)。

开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]using System;
开发自己的Data Access Application Block[上篇]
using System.Collections.Generic;
开发自己的Data Access Application Block[上篇]
using System.Text;
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]
namespace Artech.ApplicationBlock.DataMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
/**//// 


开发自己的Data Access Application Block[上篇]    
/// IStoredProcedureNameMapping defines the mapping between the data table name and the name of stored procedures to perform insertion, modification and deletion operation.
开发自己的Data Access Application Block[上篇]    
/// 
开发自己的Data Access Application Block[上篇]    public class SimpleStoredProcedureNameMapping:IStoredProcedureNameMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment désactiver les applications en arrière-plan dans Windows 11_Tutoriel Windows 11 pour désactiver les applications en arrière-plan Comment désactiver les applications en arrière-plan dans Windows 11_Tutoriel Windows 11 pour désactiver les applications en arrière-plan May 07, 2024 pm 04:20 PM

1. Ouvrez les paramètres dans Windows 11. Vous pouvez utiliser le raccourci Win+I ou toute autre méthode. 2. Accédez à la section Applications et cliquez sur Applications et fonctionnalités. 3. Recherchez l'application que vous souhaitez empêcher de s'exécuter en arrière-plan. Cliquez sur le bouton à trois points et sélectionnez Options avancées. 4. Recherchez la section [Autorisations d'application en arrière-plan] et sélectionnez la valeur souhaitée. Par défaut, Windows 11 définit le mode d'optimisation de l'alimentation. Il permet à Windows de gérer le fonctionnement des applications en arrière-plan. Par exemple, une fois que vous avez activé le mode d'économie de batterie pour préserver la batterie, le système fermera automatiquement toutes les applications. 5. Sélectionnez [Jamais] pour empêcher l'application de s'exécuter en arrière-plan. Veuillez noter que si vous remarquez que le programme ne vous envoie pas de notifications, ne parvient pas à mettre à jour les données, etc., vous pouvez

Comment convertir le pdf Deepseek Comment convertir le pdf Deepseek Feb 19, 2025 pm 05:24 PM

Deepseek ne peut pas convertir les fichiers directement en PDF. Selon le type de fichier, vous pouvez utiliser différentes méthodes: documents communs (Word, Excel, PowerPoint): utilisez Microsoft Office, LibreOffice et d'autres logiciels à exporter sous forme de PDF. Image: Enregistrer sous le nom de PDF à l'aide d'une visionneuse d'image ou d'un logiciel de traitement d'image. Pages Web: Utilisez la fonction "Imprimer en PDF" du navigateur ou l'outil Web dédié à PDF. Formats peu communs: trouvez le bon convertisseur et convertissez-le en PDF. Il est crucial de choisir les bons outils et d'élaborer un plan basé sur la situation réelle.

Que signifie le champ en Java Que signifie le champ en Java Apr 25, 2024 pm 10:18 PM

En Java, un « champ » est un membre de données dans une classe ou une interface utilisée pour stocker des données ou un état. Les propriétés du champ incluent : le type (peut être n'importe quel type de données Java), les droits d'accès, statique (appartient à une classe plutôt qu'à une instance), final (immuable) et transitoire (non sérialisé). Le champ est utilisé pour stocker les informations d'état d'une classe ou d'une interface, telles que le stockage des données d'objet et la maintenance de l'état de l'objet.

Comment lire le fichier dbf dans Oracle Comment lire le fichier dbf dans Oracle May 10, 2024 am 01:27 AM

Oracle peut lire les fichiers dbf en suivant les étapes suivantes : créer une table externe et référencer le fichier dbf ; interroger la table externe pour récupérer les données dans la table Oracle ;

Comment le mécanisme de réflexion Java modifie-t-il le comportement d'une classe ? Comment le mécanisme de réflexion Java modifie-t-il le comportement d'une classe ? May 03, 2024 pm 06:15 PM

Le mécanisme de réflexion Java permet aux programmes de modifier dynamiquement le comportement des classes sans modifier le code source. En exploitant une classe via l'objet Class, vous pouvez créer des instances via newInstance(), modifier les valeurs des champs privés, appeler des méthodes privées, etc. La réflexion doit toutefois être utilisée avec prudence, car elle peut entraîner un comportement inattendu et des problèmes de sécurité, et entraîner une surcharge en termes de performances.

Types d'exceptions courants et leurs mesures de réparation dans le développement de fonctions Java Types d'exceptions courants et leurs mesures de réparation dans le développement de fonctions Java May 03, 2024 pm 02:09 PM

Types d'exceptions courants et leurs mesures de réparation dans le développement de fonctions Java Lors du développement de fonctions Java, diverses exceptions peuvent survenir, affectant l'exécution correcte de la fonction. Voici les types d'exceptions courants et leurs mesures de réparation : 1. NullPointerException Description : levée lors de l'accès à un objet qui n'a pas été initialisé. Correctif : assurez-vous de vérifier que l'objet n'est pas nul avant de l'utiliser. Exemple de code : try{Stringname=null;System.out.println(name.length());}catch(NullPointerExceptione){

Comment inter-domaines iframe dans vue Comment inter-domaines iframe dans vue May 02, 2024 pm 10:48 PM

Façons de résoudre les problèmes inter-domaines iframe dans Vue : CORS : activez la prise en charge de CORS dans le serveur backend et utilisez XMLHttpRequest ou l'API de récupération pour envoyer des requêtes CORS dans Vue. JSONP : chargez dynamiquement des scripts JSONP dans Vue à l'aide du point de terminaison JSONP sur le serveur backend. Serveur proxy : configurez un serveur proxy pour transférer les requêtes, utilisez une bibliothèque tierce (telle que axios) dans Vue pour envoyer des requêtes et définissez l'URL du serveur proxy.

Interprétation de Botanix : BTC L2 décentralisé pour la gestion des actifs réseau (avec tutoriel interactif) Interprétation de Botanix : BTC L2 décentralisé pour la gestion des actifs réseau (avec tutoriel interactif) May 08, 2024 pm 06:40 PM

Hier, BotanixLabs a annoncé avoir finalisé un financement total de 11,5 millions de dollars américains, avec la participation de Polychain Capital, Placeholder Capital et d'autres. Le financement sera utilisé pour construire l’équivalent EVM décentralisé de BTCL2Botanix. Spiderchain combine la facilité d'utilisation d'EVM avec la sécurité de Bitcoin. Depuis la mise en ligne du testnet en novembre 2023, il y a eu plus de 200 000 adresses actives. Odaily analysera le mécanisme caractéristique de Botanix et le processus d'interaction testnet dans cet article. Botanix Selon la définition officielle, Botanix est un L2EVM décentralisé et complet de Turing construit sur Bitcoin et se compose de deux composants principaux : Ethereum Virtual Machine

See all articles