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。
我正在使用 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
。详情请参考
使用 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。