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

达梦客户端

下载地址 选择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;
posted @ 2023-02-08 21:27  ddrsql  阅读(322)  评论(0编辑  收藏  举报