惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - ddrsql

从“黑盒”到“全景”:在.NET中拥抱OpenTelemetry与SigNoz的可观测工具 关于git分支堆叠 记录团队使用git合并代码丢失 记一次对老服务改造 国产麒麟(Kylin-Server-10)系统无外网环境安装docker vue3学习之axios、mockjs、nswag vue3学习之tabler组件Layout布局 vue3学习之BootstrapVueNext Framework升级到Core以及Dapper支持达梦数据库 Avalonia集成Prism与Abp Linux中使用原生Wpf之Avalonia WPF通过wine适配统信uos系统 单体仓库下通过helm优雅的将微服务部署到k8s DevOps 前端项目(angular、vue、react)打包静态资源生成一份Docker镜像支持部署不同环境 VS使用IIS调试(非附加进程).net core、.net framework程序 k8s集群通过nginx-ingress做tcp、udp 4层网络转发 DevOps .net core Jenkins持续集成Linux、Docker、K8S swaggerui集成oauth implicit redis cluster集群web管理工具 relumin Jenkins配置AD域认证
Avalonia中使用EF增删改查DM数据库
ddrsql · 2023-02-08 · via 博客园 - ddrsql

达梦客户端

下载地址 选择X86平台

#下载文件 dm8_20220714_x86_win_64_ent.zip

docker方式安装数据库服务

dm-docker安装
大小写问题

#下载文件 dm8_20220822_rev166351_x86_rh6_64_ctm.tar
#加载镜像
docker load -i dm8_20220822_rev166351_x86_rh6_64_ctm.tar

#启动 忽略大小写-e CASE_SENSITIVE=0
docker run -d -p 5236:5236 --restart=always --name dm8_01 --privileged=true -e CASE_SENSITIVE=0 -e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e INSTANCE_NAME=dm8_01 -v /data/dm8_01:/opt/dmdbms/data dm8_single:v8.1.2.128_ent_x86_64_ctm_pack4

#1.如果使用 docker 容器里面的 disql,进入容器后,先执行 source /etc/profile 防止中文乱码。
#2.新版本 Docker 镜像中数据库默认用户名/密码为 SYSDBA/SYSDBA001。

#1 为大小写敏感,0 为大小写不敏感
SELECT SF_GET_CASE_SENSITIVE_FLAG();

国外数据库排名
国产数据库排行

简单使用

达梦属于Oracle系,很多基础资料可以查看Oracle
在逻辑结构中,Oracle从大到下,分别是如下的结构:数据库实例 -> 表空间 -> 数据段(表) -> 区 -> 块

二、创建表空间

CREATE tablespace test datafile 'test.dbf' size 64;
-- 查询当前用户拥有的所的有表空间
SELECT * FROM user_tablespaces;

三、创建用户并指定表空间,并为其授予权限

--创建用户并指定表空间
CREATE user ddrsql identified BY pwd123456 DEFAULT tablespace test;
--赋予用户DBA权限
GRANT resource,dba TO ddrsql;
--修改表空间
ALTER user ddrsql DEFAULT tablespace main;

--删除用户没有相关数据
DROP user test
--删除用户下有数据
DROP user test cascade

四、创建表(数据段)

--在test表空间下创建dog表
CREATE TABLE dog
(
    name varchar(12),
    age varchar(12)
)
tablespace test;

--跨用户查询表
SELECT * FROM DDRSQL."Blogs";
-- 查看TEST表空间下的所有表
SELECT tablespace_name, table_name FROM user_tables
WHERE tablespace_name = 'TEST';
-- 组装删除表空间下表语句
SELECT CONCAT('drop table DDRSQL."',table_name,'" cascade;') FROM user_tables WHERE tablespace_name = 'TEST';

常用

 --查询当前数据库名
SELECT * FROM v$database;
--查询当前数据库实例名
SELECT * FROM v$instance;

--查看表空间数据文件信息
SELECT * FROM dba_data_files;
--查看数据文件空闲信息
SELECT * FROM dba_free_space;
--表空间创建
CREATE tablespace TEST datafile 'C:\dmdbms\data\DAMENG\TEST.DBF' size 128 autoextend ON NEXT 4 maxsize 10240;
--增加数据文件:	
ALTER tablespace TEST ADD datafile 'C:\dmdbms\data\DAMENG\TEST01.DBF'	size 128;
--修改数据文件大小:		
ALTER tablespace TEST	resize datafile 'TEST01.DBF' TO 256;	
--修改文件扩展属性:		
ALTER tablespace TEST datafile 'TEST01.DBF' autoextend OFF;
ALTER tablespace TEST datafile 'TEST01.DBF' autoextend ON NEXT 4	maxsize 1024;
--普通表空间可以在脱机状态下修改数据文件路径和文件名,修改数据文件路径时需保证修改后的数据文件路径存在。
--将表空间置为脱机状态
ALTER tablespace TEST OFFLINE;
--修改数据文件路径
ALTER tablespace TEST rename datafile 'TEST02.dbf' TO 'C:\dmdbms\data\DAMENG\TEST01.DBF';
--表空间联机状态下支持重命名表空间,脱机状态下不支持重命名表空间。用户自定义表空间可以重命名,SYSTEM、ROLL、TEMP、MAIN和HMAIN表空间不支持重命名操作。
--将表空间置为联机状态
ALTER tablespace TEST ONLINE;
rename tablespace TEST TO TEST01;
--对于不在使用的表空间,可以选择删除(已经使用的表空间不能删除)。删除表空间之前, 需清除表空间中的表和数据,否则会删除失败。
--SYSTEM、ROLL、TEMP、MAIN和HMAIN表空间不允许删除
DROP tablespace TEST;

数据迁移参考

MySql-->DM
DM数据迁移工具

Avalonial中使用EF增删改查DM数据库

dmdbms目录在安装客户端后创建,此处使用EFCore.Dm5.0下包

界面代码

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30"></RowDefinition>
        <RowDefinition Height="10"></RowDefinition>
        <RowDefinition Height="30"></RowDefinition>
        <RowDefinition Height="10"></RowDefinition>
        <RowDefinition Height="100"></RowDefinition>
        <RowDefinition Height="100"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="120"></ColumnDefinition>
        <ColumnDefinition Width="120"></ColumnDefinition>
        <ColumnDefinition Width="120"></ColumnDefinition>
        <ColumnDefinition Width="120"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    
    <StackPanel Orientation="Horizontal" Grid.ColumnSpan="4">
        <TextBlock Text="DM数据库:"/>
        <Button Name="BtnDMInsert" Command="{Binding DMInsertAsync}">DMInsert</Button>
        <Button Name="BtnDMDelete" Command="{Binding DMDeleteAsync}">DMDelete</Button>
        <Button Name="BtnDMUpdate" Command="{Binding DMUpdateAsync}">DMUpdate</Button>
        <Button Name="BtnDMSelect" Command="{Binding DMSelectAsync}">DMSelect</Button>
    </StackPanel>
    
    <StackPanel Grid.Row="4" Grid.ColumnSpan="4">
        <TextBlock FontSize="16" Text="Simple Bindings"/>
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Height="100">
            <TextBox Watermark="Two Way" UseFloatingWatermark="True"  Text="{Binding Path=StringValue}" Name="first"/>
        </ScrollViewer>
        <!--FontFamily="Microsoft YaHei,Simsun,微软雅黑,苹方-简,宋体-简"-->

        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Height="100">
            <TextBox Watermark="One Way" UseFloatingWatermark="True" Text="{Binding Path=StringValue, Mode=OneWay}"/>
        </ScrollViewer>
        
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Height="100">
            <TextBox Watermark="One Time" UseFloatingWatermark="True" Text="{Binding Path=StringValue, Mode=OneTime}"/>
        </ScrollViewer>
    </StackPanel>
</Grid>

连接字符串

//配置DM连接字符串
optionsBuilder.UseDm("Server=192.168.x.xx;User ID=ddrsql;PWD=qwe123456;PORT=5236;");

增删改查

public async Task DMInsertAsync()
{
    using (var db = new DMBloggingContext())
    {
        await db.Blogs.AddAsync(new Blog { Url = "http://blogs.msdn.com/adonet", CreateTime = DateTime.Now,Price = 1.2M });
        var count = await db.SaveChangesAsync();
        Console.WriteLine("{0} records saved to database", count);

        Console.WriteLine();
        Console.WriteLine("All blogs in database:");
        var temp = string.Empty;
        foreach (var blog in db.Blogs)
        {
            Console.WriteLine(" - {0}", blog.Url);
            temp += DateTime.Now + JsonConvert.SerializeObject(blog) + "\r";
        }
        StringValue = temp;
    }
}

public async Task DMDeleteAsync()
{
    using (var db = new DMBloggingContext())
    {
        var url = "http://blogs.msdn.com/adonet";
        var blog = await db.Blogs.Where(p => p.Url == url).AsNoTracking().FirstOrDefaultAsync();
        if (blog != null)
        {
            db.Blogs.Remove(blog);
            await db.SaveChangesAsync();
            await DMSelectAsync();
        }
    }
}

public async Task DMUpdateAsync()
{
    using (var db = new DMBloggingContext())
    {
        var url = "http://blogs.msdn.com/adonet";
        var blog = await db.Blogs.Where(p => p.Url == url).AsNoTracking().FirstOrDefaultAsync();
        if(blog != null)
        {
            blog.Url = "123";
            db.Blogs.Update(blog);
            await db.SaveChangesAsync();
            await DMSelectAsync();
        }
    }
}

public async Task DMSelectAsync()
{
    var temp = string.Empty;
    using (var db = new DMBloggingContext())
    {
        var blog = await db.Blogs.AsNoTracking().ToListAsync();
        foreach(var item in blog)
        {
            temp += DateTime.Now + JsonConvert.SerializeObject(item) + "\r";
        }
    }
    StringValue = temp;
}

示例代码

问题

事务级别问题

使用 Abp UnitOfWork 由于默认事务级别是 ReadUncommitted 会出现如下问题

An exception occurred in the database while saving changes for context type 'xxDbContext'.
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.ArgumentException: Parameter '__EF_FILTER__xx_0' not found in the collection.
   at Dm.DmParameterCollection.do_GetParameter(String parameterName)
   at Dm.DmCommand.BindParameters(Int32& rowCount, DmDataReader rd, CommandBehavior behavior)
   at Dm.DmCommand.do_ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)

DM数据事务隔离级别为ReadCommitted,设置即可解决

Configuration.UnitOfWork.IsolationLevel = IsolationLevel.ReadCommitted;