2
votes

hello I downloaded the solution nopCommerce an e-commerce open source which achievement operate and install without problems with MSSQLSERVER database however I would like to implement with ORACLEdatabase

Official Site http://www.nopcommerce.com/

I have been guiding me this post http://www.nopcommerce.com/boards/t/17712/mysql-support.aspx

I have tried to follow the steps indicated for mysql and adapt to oracle yet one of the first things that tells me is the creation of two classes

OracleConnectionFactory:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity.Infrastructure;
using System.Data.Common;
using Oracle.DataAccess.Client;



namespace Nop.Data
{
public class OracleConnectionFactory : IDbConnectionFactory
{
    private readonly string _baseConnectionString;
    private Func<string, DbProviderFactory> _providerFactoryCreator;

    public OracleConnectionFactory()
    {
    }

    public OracleConnectionFactory(string baseConnectionString)
    {
        this._baseConnectionString = baseConnectionString;
    }

    public DbConnection CreateConnection(string nameOrConnectionString)
    {

        string connectionString = nameOrConnectionString;

        bool treatAsConnectionString = nameOrConnectionString.IndexOf('=') >= 0;

        if (!treatAsConnectionString)
        {
            OracleConnectionStringBuilder builder = new OracleConnectionStringBuilder(this.BaseConnectionString);
            //MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(this.BaseConnectionString);

            //builder.Server = nameOrConnectionString;
            connectionString = builder.ConnectionString;
        }

        DbConnection connection = null;

        try
        {
            connection = this.ProviderFactory("Oracle.DataAccess.Client").CreateConnection();
            connection.ConnectionString = connectionString;
        }
        catch
        {
            //connection = new MySqlConnection(connectionString);
            connection = new OracleConnection(connectionString);
        }
        return connection;
    }

    public string BaseConnectionString
    {
        get
        {
            return this._baseConnectionString;
        }
    }

    internal Func<string, DbProviderFactory> ProviderFactory
    {
        get
        {
            Func<string, DbProviderFactory> func1 = this._providerFactoryCreator;
            return delegate(string name)
            {
                return DbProviderFactories.GetFactory(name);
            };
        }
        set
        {
            this._providerFactoryCreator = value;
        }
    }
 }
}

OracleProvider :

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.SqlClient;
using System.IO;
using System.Text;
using System.Web.Hosting;
using Nop.Data.Initializers;
using Oracle.DataAccess.Client;
using Nop.Core.Data;


namespace Nop.Data
{
public class OracleDataProvider : IDataProvider
{
    #region Utilities

    protected virtual string[] ParseCommands(string filePath, bool throwExceptionIfNonExists)
    {
        if (!File.Exists(filePath))
        {
            if (throwExceptionIfNonExists)
                throw new ArgumentException(string.Format("Specified file doesn't exist - {0}", filePath));
            else
                return new string[0];
        }


        var statements = new List<string>();
        using (var stream = File.OpenRead(filePath))
        using (var reader = new StreamReader(stream))
        {
            var statement = "";
            while ((statement = readNextStatementFromStream(reader)) != null)
            {
                statements.Add(statement);
            }
        }

        return statements.ToArray();
    }

    protected virtual string readNextStatementFromStream(StreamReader reader)
    {
        var sb = new StringBuilder();

        string lineOfText;

        while (true)
        {
            lineOfText = reader.ReadLine();
            if (lineOfText == null)
            {
                if (sb.Length > 0)
                    return sb.ToString();
                else
                    return null;
            }

            //MySql doesn't support GO, so just use a commented out GO as the separator
            if (lineOfText.TrimEnd().ToUpper() == "-- GO")
                break;

            sb.Append(lineOfText + Environment.NewLine);
        }

        return sb.ToString();
    }



    #endregion

    #region Methods

    public virtual void InitConnectionFactory()
    {
        //var connectionFactory = new SqlConnectionFactory();
        var connectionFactory = new OracleConnectionFactory();
        //TODO fix compilation warning (below)
        #pragma warning disable 0618
        Database.DefaultConnectionFactory = connectionFactory;
    }

    /// <summary>
    /// Initialize database
    /// </summary>
    public virtual void InitDatabase()
    {
        InitConnectionFactory();
        SetDatabaseInitializer();
    }

    /// <summary>
    /// Set database initializer
    /// </summary>
    public virtual void SetDatabaseInitializer()
    {
        //pass some table names to ensure that we have nopCommerce 2.X installed
        var tablesToValidate = new[] { "Customer", "Discount", "Order", "Product", "ShoppingCartItem" };

        //custom commands (stored proedures, indexes)

        var customCommands = new List<string>();
        //use webHelper.MapPath instead of HostingEnvironment.MapPath which is not available in unit tests
        customCommands.AddRange(ParseCommands(HostingEnvironment.MapPath("~/App_Data/Install/SqlServer.Indexes.sql"), false));
        //use webHelper.MapPath instead of HostingEnvironment.MapPath which is not available in unit tests
        customCommands.AddRange(ParseCommands(HostingEnvironment.MapPath("~/App_Data/Install/SqlServer.StoredProcedures.sql"), false));

        var initializer = new CreateTablesIfNotExist<NopObjectContext>(tablesToValidate, customCommands.ToArray());
        Database.SetInitializer(initializer);
    }

    /// <summary>
    /// A value indicating whether this data provider supports stored procedures
    /// </summary>
    public virtual bool StoredProceduredSupported
    {
        get { return true; }
    }

    /// <summary>
    /// Gets a support database parameter object (used by stored procedures)
    /// </summary>
    /// <returns>Parameter</returns>
    public virtual DbParameter GetParameter()
    {
        //return new SqlParameter();
        return new OracleParameter();
    }

    #endregion
 }
}

also i installed the managed nuget package like this link said http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/CodeFirst/index.html

oracle odp.net managed driver

in nop.data and nop.web

I appreciate any help freshened up the steps I need to do or that I may be going

one of the first thing i trying is the Oracle provider recognize and achieve connect to my database

1
There is no question here... - DavidG
sorry if I did not explain well my question is what nopCommerce would need to install with Oracle and if the class i create so far are fine - JPCS
In that case, your question is probably too broad. - DavidG

1 Answers

2
votes

It was an interesting question. Using nop commerce with Oracle is technically possible, but it would be a very wild ride for you.

Good news first. Nop Commerce is architectured based on repository pattern. Basically Nop.Data abstracts all the SQL Server related data access. You would need to re-write this almost entirely.

Not so good news next. Search, Paging, Catalog listing uses a stored procedure in SQL Server. You may need to re-write it completely. And most of the time, you are on your own. Unless if you are confident with Oracle and .Net EF, it would be a really wild ride.

I would say, its less problem if you want to stick with SQL Server. I understand sometime you may not make technical decision. So you can explain clearly about complexity and effort needed to migrate to the person makes that decision.

Source: NopCommerce developer for last 2.5years.