2

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

//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();
            }
        }
    }
}
4

1 回答 1

3

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

这里解释了错误的根本原因:

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

这可能是因为 ORM 生成了不正确的查询。这可能是因为您没有Dialect正确设置。有关详细信息,请参阅此。

使用 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。

于 2020-11-05T07:08:21.310 回答