【问题标题】:Dapper with Oracle give ORA-00936: missing expression errorDapper 与 Oracle 给出 ORA-00936:缺少表达式错误
【发布时间】:2020-11-05 02:28:14
【问题描述】:

我正在使用 Dapper、Dapper.Extensions 和 Dapper.SimpleCRUD。以下代码在针对 MYSQL 数据库运行时可以正常工作。但是,当我对 oracle 使用相同的表运行相同的代码时,我得到 ORA-00936: missing expression 错误。我不确定为什么会收到此错误,因为我只是想从表中检索所有记录。

//MYSQL DDL
CREATE TABLE app_config(
    `app_config_id` int AUTO_INCREMENT  NOT NULL,
    `user_name` nvarchar(100) NULL,     
    `program_location` nvarchar(400) NULL,      
    CONSTRAINT PK_tk_app_config_id PRIMARY KEY (app_config_id)    );  

//ORACLE DDL
CREATE TABLE app_config(
    app_config_id number(10)  NOT NULL,
    user_name nvarchar2(100) NULL,      
    program_location nvarchar2(400) NULL,       
    CONSTRAINT PK_tk_app_config_id PRIMARY KEY (app_config_id));

CREATE SEQUENCE app_config_seq START WITH 1 INCREMENT BY 1;

CREATE OR REPLACE TRIGGER app_config_seq_tr
 BEFORE INSERT ON app_config FOR EACH ROW
 WHEN (NEW.app_config_id IS NULL)
BEGIN
 SELECT app_config_seq.NEXTVAL INTO :NEW.app_config_id FROM DUAL;
END;
/

//C# Code    
using System;
using System.Linq;
using System.Data.SqlClient;
using Dapper;

namespace RetrieveAll
{
    public class app_config
        {
            [Key]
            public int app_config_id { get; set; }
            public string user_name { get; set; }
            public string program_location { get; set; }


        }

 public static IDbConnection getDBConnection(string dbtype)
        {
            switch (dbtype)
            {
                default:                
                case "MYSQL":
                    return new MySqlConnection("userid=uid;password=pwd;server=localhost;database=test");
                case "ORACLE":
                    return new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=tempdb)));User ID=uid;Password=pwd;");


            }
        }

    class Program
    {
        static void Main(string[] args)
        {
              using (var connection = dbConnector.getDBConnection("ORACLE"))
            {

              var ac = connection.GetList<app_config>().ToList();
            }
        }
    }
}

【问题讨论】:

    标签: dapper dapper-extensions dapper-simplecrud


    【解决方案1】:

    我在您的代码中没有看到您指示您的 ORM 您正在使用哪个 RDBMS。

    错误根源解释here:

    原因
    您尝试执行 SQL 语句,但省略了部分语法。

    这可能是因为 ORM 生成了不正确的查询。这可能是因为您没有正确设置Dialect。详情请参考this和this。

    使用 Dapper Extensions,您需要设置 SqlDialect 如下:

    //Synchronous
    DapperExtensions.DapperExtensions.SqlDialect = 
        new DapperExtensions.Sql.MySqlDialect();//or OracleDialect
    
    //Asynchronous
    DapperExtensions.DapperAsyncExtensions.SqlDialect = 
        new DapperExtensions.Sql.MySqlDialect();//or OracleDialect
    

    同样,对于 Simple CRUD,您将 Dialect 设置如下:

       SimpleCRUD.SetDialect(SimpleCRUD.Dialect.PostgreSQL);
        
       SimpleCRUD.SetDialect(SimpleCRUD.Dialect.MySQL);
    

    这告诉 ORM 您正在使用哪个 RDBMS。它会相应地生成查询。

    我从未使用过 SimpleCRUD,但查看支持的方言,不支持 Oracle:

    //
    // Summary:
    //     Database server dialects
    public enum Dialect
    {
        SQLServer = 0,
        PostgreSQL = 1,
        SQLite = 2,
        MySQL = 3
    }
    

    GitHub 上有一个名为 Dapper.SimpleCRUD-with-Oracle- 的单独存储库。您可能需要将它用于 Oracle。

    【讨论】:

    • 我在 NuGet 中没有找到 Dapper.SimpleCrud-with-Oracle-。我是否必须将来自 github 的源代码添加到我的项目中才能正常工作?
    • @WestonGoodwin:不确定,我从没用过。但无论如何,您始终可以添加源代码。顺便说一句,为什么你使用两个 ORM(Dapper Extensions 和 SimpleCRUD),它们具有相同的目的?我认为你可以避免 SimpleCRUD 并且只使用 Dapper Extensions。对于任何复杂的场景,回退到 Dapper。
    • 我对应该使用什么感到困惑,所以我全部使用了它们。我将继续使用普通的 Dapper。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多