【问题标题】:install nopcommerce with oracle使用 oracle 安装 nopcommerce
【发布时间】:2015-05-29 16:05:20
【问题描述】:

你好,我下载了解决方案 nopCommerce 一个电子商务开源软件,它可以在 MSSQLSERVER 数据库中运行和安装,但我想用 ORACLEdatabase 来实现

官网http://www.nopcommerce.com/

我一直在指导我这篇文章 http://www.nopcommerce.com/boards/t/17712/mysql-support.aspx

我已尝试按照 mysql 指示的步骤并适应 oracle 但告诉我的第一件事是创建两个类

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;
        }
    }
 }
}

Oracle 提供者:

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
 }
}

我也安装了这个链接说的托管 nuget 包 http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/CodeFirst/index.html

oracle odp.net 托管驱动程序

在 nop.data 和 nop.web 中

感谢任何帮助我更新我需要做的或我可能要做的步骤

我尝试的第一件事是 Oracle 提供商识别并实现连接到我的数据库

【问题讨论】:

  • 这里没有问题...
  • 抱歉,如果我没有解释清楚,我的问题是 nopCommerce 需要与 Oracle 一起安装,以及我创建的类是否正常
  • 那么,你的问题可能太宽泛了。

标签: oracle nopcommerce


【解决方案1】:

这是一个有趣的问题。使用 Oracle 的 nop commerce 在技术上是可行的,但对您来说这将是一次非常疯狂的旅程。

首先是好消息。 Nop Commerce 是基于存储库模式构建的。基本上 Nop.Data 抽象了所有与 SQL Server 相关的数据访问。您几乎需要完全重写它。

接下来不是那么好消息。搜索、分页、目录列表使用 SQL Server 中的存储过程。您可能需要完全重写它。大多数时候,你都是靠自己的。除非您对 Oracle 和 .Net EF 有信心,否则这将是一次非常疯狂的旅程。

我想说,如果您想坚持使用 SQL Server,那么问题就更少了。我理解有时您可能不会做出技术决定。因此,您可以清楚地解释迁移到做出该决定的人所需的复杂性和工作量。

资料来源:过去 2.5 年的 NopCommerce 开发人员。

【讨论】:

  • 好吧,我一直在寻找同样的东西,但如果你有 2.5 年的 NC 经验,这意味着我应该停止考虑更改代码 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
相关资源
最近更新 更多