【问题标题】:How to execute sql query in different database如何在不同的数据库中执行sql查询
【发布时间】:2014-08-05 08:06:03
【问题描述】:

我正在向 EA 编写插件,我想在存储库中创建新表,但我不想向每种数据库类型编写查询,而且我不知道如何编写一个查询,因为 eq. AUTO_INCREMENT 在 MySQL 中存在,但在 PostgreSQL 中不存在。所以你有什么建议?我应该使用 nHibernate 还是其他?

这是 PostgreSQL 中的查询,我需要重写到其他数据库:

CREATE OR REPLACE FUNCTION create_history ()
  RETURNS void AS
$_$
BEGIN

IF EXISTS (
    SELECT *
    FROM   pg_catalog.pg_tables 
    WHERE  schemaname = 'public'
    AND    tablename  = 't_history'
    ) THEN
   RAISE NOTICE ' ';
ELSE
   CREATE TABLE t_history
(
  id integer NOT NULL DEFAULT nextval(('"object_id_seq"'::text)::regclass),
  object_id integer NOT NULL,
  object_type character varying(255),
  diagram_id integer DEFAULT 0,
  name character varying(255),
  alias character varying(255),
  author character varying(255),
  ch_author character varying(255),
  version character varying(50) DEFAULT '1.0'::character varying,
  note text,
  package_id integer DEFAULT 0,
  stereotype character varying(255),
  ntype integer DEFAULT 0,
  createddate timestamp without time zone DEFAULT now(),
  status character varying(50),
  abstract character(1),
  tagged integer DEFAULT 0,
  pdata1 character varying(255),
  pdata2 text,
  pdata3 text,
  pdata4 text,
  pdata5 character varying(255),
  concurrency character varying(50),
  visibility character varying(50),
  persistence character varying(50),
  cardinality character varying(50),
  gentype character varying(50),
  genfile character varying(255),
  header1 text,
  header2 text,
  phase character varying(50),
  scope character varying(25),
  genoption text,
  genlinks text,
  classifier integer,
  ea_guid character varying(40),
  parentid integer,
  runstate text,
  classifier_guid character varying(40),
  tpos integer,
  isroot integer DEFAULT 0,
  isleaf integer DEFAULT 0,
  isspec integer DEFAULT 0,
  isactive integer DEFAULT 0,
  stateflags character varying(255),
  packageflags character varying(255),
  multiplicity character varying(50),
  styleex text,
  actionflags character varying(255),
  eventflags character varying(255),
  CONSTRAINT t_history_pkey PRIMARY KEY (id)
);
END IF;

END;
$_$ LANGUAGE plpgsql;

SELECT create_history();

编辑

更改的查询

MySQL

CREATE TABLE IF NOT EXISTS t_history
(
  id integer NOT NULL AUTO_INCREMENT,
  object_id integer NOT NULL,
  name character varying(255),
  author character varying(255),
  ch_author character varying(255),
  version character varying(50) DEFAULT '1.0',
  note text,
  package_id integer DEFAULT 0,
  stereotype character varying(255),
  createddate timestamp DEFAULT now(),
  pdata1 character varying(255),
  pdata2 text,
  pdata3 text,
  pdata4 text,
  phase character varying(50),
  CONSTRAINT t_history_pkey PRIMARY KEY (id)
);

MSSQL

if not exists (select * from sys.tables where name = 't_history' and type = 'U')
CREATE TABLE t_history
(
  id integer NOT NULL IDENTITY PRIMARY KEY,
  object_id integer NOT NULL,
  name character varying(255),
  author character varying(255),
  ch_author character varying(255),
  version character varying(50) DEFAULT '1.0',
  note text,
  package_id integer DEFAULT 0,
  stereotype character varying(255),
  createddate datetime DEFAULT getdate(),
  pdata1 character varying(255),
  pdata2 text,
  pdata3 text,
  pdata4 text,
  phase character varying(50)
);

【问题讨论】:

  • 您能否更新一下您是如何设法实施您得到的答案的?谢谢!

标签: c# sql nhibernate enterprise-architect


【解决方案1】:

鉴于您的脚本很小,它可能是手动将其“翻译”到 Oracle/MySQL/您需要的任何数据库系统的最佳方法。只需几分钟,您就可以充分利用查找/替换功能。

例如像这样:

Find: character varying
Replace with: VARCHAR2 

Find: text
Replace with: CLOB

除非你已经有一个大的 C# 应用程序。在这种情况下,您可以只使用 nHibernate(我假设它就像 Java 的 Hibernate)并实现适当的类、函数和注释/配置。如果您计划在未来使用更多的 SQL 脚本,这种方法也很有意义。

如果这是您将使用的唯一脚本,那么 Hibernate 就有点过分了。与简单地将脚本“翻译”成各种其他 SQL 方言相比,它会产生巨大的开销并花费更多的时间来设置。仅当您要与数据库进行大量事务时才真正有意义。

【讨论】:

    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 2021-06-30
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多