Dapper with Oracle 给出 ORA-00936: missing expression error

Dapper with Oracle give ORA-00936: missing expression error

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

中检索所有记录
//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();
            }
        }
    }
}

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

解释了错误的根本原因here:

Cause
You tried to execute a SQL statement but you omitted a part of the syntax.

这可能是因为 ORM 正在生成不正确的查询。这可能是因为您没有正确设置 Dialect。详情请参考 and 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。