國產瀚高資料庫簡單實踐 及 authentication method 13 not supported 錯誤解決方法

来源:https://www.cnblogs.com/longware/archive/2023/11/10/17824640.html
-Advertisement-
Play Games

近幾年IT界軟硬體“國產化”搞得很密集,給很多公司帶來了商機。但是有些公司拿國外的代碼改改換個皮膚,就是“自主知識產權”的國產軟體,光明正大賣錢,這個有點...,還經常有醜聞露出,譬如某星瀏覽器、C某-IDE... 話不多說,最近有個項目需要國產化改造,業主方推薦了國產資料庫 瀚高資料庫,我們原來用 ...


近幾年IT界軟硬體“國產化”搞得很密集,給很多公司帶來了商機。但是有些公司拿國外的代碼改改換個皮膚,就是“自主知識產權”的國產軟體,光明正大賣錢,這個有點...,還經常有醜聞露出,譬如某星瀏覽器、C某-IDE...

話不多說,最近有個項目需要國產化改造,業主方推薦了國產資料庫---瀚高資料庫,我們原來用的是MySQL社區版,業主方不認可。我去看了下,這個瀚高資料庫就是拿開源的postgresql資料庫改的,加了點三權分立、國密SM3/SM4啥的。

  • 安裝

到官網登記試用,然後幾天內轉了幾個人,最後終於拿到安裝包介質 hgdb-see_4.5.8-db43858_amd64.deb ,按照官方安裝文檔,有很多安裝參數需要設置,那是為了伺服器環境準備的,我們開發測試環境,就無所謂了。

在國產操作系統銀河麒麟linux上 sudo dpkg -i hgdb-see_4.5.8-db43858_amd64.deb 即可安裝。預設安裝目錄是 /opt/highgo/。

安裝完成後,記得安裝jdk(有了就忽略),一會啟動配置助手,需要jdk。

下一步,配置新實例,選擇server安裝的目錄、data存放的目錄,然後一直下一步到結束,中間的參數,可以拷貝出來另外,以備不時之需。

主要記住埠5866,三個用戶sysdba/syssao/syssso設置同一個口令,否則容易忘記(生產環境切勿)。

結束後,要給linux的root用戶和經常用的操作用戶設置環境變數,否則很多操作不方便。

命令是 vi  ~/.bashrc ,加入以下幾行,保存退出,然後 source ~/.bashrc 或重登錄,讓其生效。

export HGDB_HOME=/opt/highgo/hgdb-see-4.5.8
export PGDATA=/root/data
export PATH=$PATH:$HGDB_HOME/bin
  • 啟停資料庫

啟停需要sudo操作,或者直接用root用戶操作。

通過服務啟動。
[root@hgdb ~]$ systemctl start hgdb-see-4.5.8.service

通過服務停止。
[root@hgdb ~]$ systemctl stop hgdb-see-4.5.8.service

通過資料庫命令啟動。
[root@hgdb ~]$ pg_ctl start -D /root/data

通過資料庫命令停止。
[root@hgdb ~]$ pg_ctl stop -D /root/data

  • 本機基本管理操作

瀚高資料庫自帶了一個sql developer,進入目錄 /opt/highgo/hgdbdeveloper/bin,sudo ./hgdbdeveloper即可啟動GUI界面,可以進行創建資料庫、建立用戶、建表、查詢等操作。 

 

在這之前,我用了跨平臺的dbeaver來連接hgdb,用的postgre預設的jdbc jar都連不上,可能是hgdb改了jdbc的認證方式(比如加了sm3 、sm4)。他自帶驅動在這裡。

root@longware-ubuntu:/opt/highgo/hgdb-see-4.5.8/etc/drivers# ls
DotNET  JDBC  ODBC

 

  •  本機SQL操作

因為有了環境變數,可以直接psql口令登錄,不知道命令可以help求助,可以直接各種SQL操作,select、create、alter、delete等,忘記了SQL語法可以看這裡。

longware@longware-ubuntu:~$ psql -U sysdba longware
用戶 sysdba 的口令:
註意:  
-------------------------------------------
Login User: sysdba 
Login time: 2023-11-10 17:12:11.142098+08 
Login Address: [local] 
Last Login Status: SUCCESS 
Login Failures: 0 
Valied Until: 2023-11-16 20:40:51+08 
-------------------------------------------

psql (4.5.8)
輸入 "help" 來獲取幫助信息.

longware=# \d
                    關聯列表
 架構模式 |        名稱        |  類型  | 擁有者 
----------+--------------------+--------+--------
 public   | company            | 數據表 | sysdba
 public   | hg_t_audit_log     | 數據表 | syssao
 public   | pg_buffercache     | 視圖   | sysdba
 public   | pg_stat_statements | 視圖   | sysdba
 public   | t1                 | 數據表 | sysdba
(5 行記錄)

longware=# \d t1
                   數據表 "public.t1"
  欄位   |       類型        | 校對規則 | 可空的 | 預設 
---------+-------------------+----------+--------+------
 column1 | character varying |          |        | 
 column2 | "char"[]          |          |        | 

longware=# select * from t1;
  column1   | column2 
------------+---------
 aaaaaa     | {b}
 aaaafdasaa | {c}
 aaa中國aa  | {d}
(3 行記錄)

longware=# 
  • windows上PHP遠程連接hgdb資料庫

編輯php.ini,找到ext dll區域,將pgsql、pdo_pgsql前面的分號去掉,保存,重啟web服務,

 查看phpinfo里是否有pgsql

 

要想遠程連接資料庫,需要開通遠程連接許可權,如果你連接db時程式報錯無許可權,

[10-Nov-2023 19:15:25 Asia/Shanghai] PHP Warning:  pg_connect(): Unable to connect to PostgreSQL server: 致命錯誤:  沒有用於主機 "192.168.2.180", 用戶 "sysdba", 資料庫 "longware", SSL 關閉 的 pg_hba.conf 記錄 in D:\UPUPW_ANK_W32\WebRoot\Vhosts\local-php74\hgdb_pgsql.php on line 11

則編輯/root/data/pg_hba.conf,在末尾增加以下內容(192.x.x.x為我windows內網ip),保存退出,重載配置。如果不報錯,可忽略。

root@longware-ubuntu:~# vi ./data/pg_hba.conf

host    all    all    192.168.2.180/32    sm3

root@longware-ubuntu:~# pg_ctl reload
2023-11-10 19:10:55.840 CST [40163] 日誌:  接收到 SIGHUP, 重載配置文件
伺服器進程發出信號

改成“host    all     all     0.0.0.0/0       sm3”支持任意ip連接,但有風險。

如果php連接hgdb報以下錯誤信息:

Warning: pg_connect(): Unable to connect to PostgreSQL server: authentication method 13 not supported in D:\Workspace\wwwroot\hgdb\hgdb_pgsql.php on line 11

則表示已經連接到hgdb了,但是用戶名和密碼驗證發生問題。pg_hba.conf里可以設置sm3、md5、scram-sha-256、cert等驗證方式,更改這裡當然可以,但是其他的系統可能就會發生問題,最好是從連接發起端解決問題。

我的思路是:瀚高改了postgre的代碼,驗證方式可能也有變更;但是他們官網說是可以直接用php自帶的postgre dll,但是php自帶的postgre dll可能沒有瀚高改的東西,所以問題應該就在這。

我咨詢了瀚高的技術人員,聊了大半天,沒有得到有效解決。網路搜了半天,大概也說是這個原因,但是沒看到有效的方法。在和瀚高的技術人員溝通過程中,聊到了libpq,我讓他們發一個windows libpq dll給我,經過測試無效。

於是我去deb安裝包里找,果然有收穫。deb安裝包里自帶的sql developer的目錄里,除了linux的可執行文件,還有windows的exe,有exe那就有dll,果然有。點此下載可用的libpq.dll

 將libpq.dll拷貝到php目錄(我的有D:\UPUPW_ANK_W32\Modules\PHPX\PHP56 和 D:\UPUPW_ANK_W32\Modules\PHPX\PHP74),測試php程式,都能成功連接hgdb。

 show me your code !

 1 <?php
 2    $host        = "host=192.168.2.114";
 3    $port        = "port=5866";
 4    $dbname      = "dbname=longware";
 5    $credentials = "user=sysdba password=Aa123!";
 6 
 7    $db = pg_connect("$host $port $dbname $credentials");
 8    if(!$db){
 9        echo "Error : Unable to open database <br/>";
10    } else {
11        echo "Opened database successfully <br/>";
12    }
13 
14    //創建數據表
15    $sql ="CREATE TABLE IF NOT EXISTS COMPANY (".
16           "ID INT PRIMARY KEY NOT NULL,".
17           "NAME TEXT NOT NULL,".
18           "AGE INT NOT NULL,".
19           "ADDRESS CHAR(50)," .
20           "SALARY REAL".
21         ");";
22 
23    $ret = pg_query($db, $sql);
24    if(!$ret){
25        echo pg_last_error($db);
26        exit;
27    } else {
28        echo "Table created successfully <br/>";
29    }
30 
31    //插入數據
32    $sql ="INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)".
33          "VALUES (1, 'Paul', 32, 'California', 20000.00 );".
34          "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)".
35          "VALUES (2, 'Allen', 25, 'Texas', 15000.00 );".
36          "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)".
37          "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );".
38          "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)".
39          "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
40 
41     $ret = pg_query($db, $sql);
42     if(!$ret){
43         echo pg_last_error($db);
44         exit;
45     } else {
46         echo "Records created successfully <br/>";
47     }
48 
49     //查詢數據
50     $sql ="SELECT * from COMPANY;";
51 
52     $ret = pg_query($db, $sql);
53     if(!$ret){
54         echo pg_last_error($db);
55         exit;
56     }
57     while($row = pg_fetch_row($ret)){
58       echo "ID = ". $row[0] . "\n";
59       echo "NAME = ". $row[1] ."\n";
60       echo "ADDRESS = ". $row[2] ."\n";
61       echo "SALARY =  ".$row[4] ."<br/>";
62     }
63    echo "Operation done successfully<br/>";
64    pg_close($db);
65 ?>
View Code

PHP使用PDO操作hgdb

<?php
header("content-type:text/html;charset=utf-8");

//連接屬性
$dbms='pgsql';     //資料庫類型
$host='192.168.2.114'; //資料庫主機名
$dbName='longware';    //使用的資料庫
$user='sysdba';      //資料庫連接用戶名
$pass='Aa123!';   //對應的密碼
$port='5866';
$dsn="$dbms:host=$host;port=$port;dbname=$dbName";

try {
    //初始化一個PDO對象
    $pdo = new PDO($dsn, $user, $pass); //初始化一個PDO對象
    echo "成功連接到資料庫伺服器!<br>";

} catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "<br>");
}

/*
CREATE SEQUENC Estudent_id_seq
INCREMENT 1
MINVALUE 1
NO MAXVALUE
START 1
CACHE 10;

CREATE TABLE student (
id INT PRIMARY KEY DEFAULT nextval('student_id_seq'),
name VARCHAR(255),
age int,
birthday date);
*/

// 預編譯插入語句
$sql = 'INSERT INTO student(id, name, age, birthday) VALUES(DEFAULT, :name, :age, :birthday)';
$stmt = $pdo->prepare($sql);

// 綁定參數值
$name = 'tony';
$age=19;
$birthday = '2020-06-01 20:11:11';
$stmt->bindValue(':name', $name);
$stmt->bindValue(':age', $age);
$stmt->bindValue(':birthday', $birthday);
$stmt->execute();// 執行插入操作

// 返回id
$id = $pdo->lastInsertId('student_id_seq');
echo '插入數據成功,用戶id:' . $id . '<br>';

// 綁定參數值
$name = 'david';
$age=23;
$stmt->bindValue(':name', $name);
$stmt->bindValue(':age', $age);
$stmt->bindValue(':birthday', date("Y-m-d H:i:s"));
$stmt->execute();// 執行插入操作

// 返回id
$id = $pdo->lastInsertId('student_id_seq');
echo '插入數據成功,用戶id:' . $id . '<br>';

// 執行查詢語句
$stmt = $pdo->query('SELECT * FROM student');
$students = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $students[] = [
        'id' => $row['id'],
        'name' => $row['name'],
        'age' => $row['age'],
        'birthday' => $row['birthday']
    ];
}
?>
<!DOCTYPE html>
<html>
<head>
    <style>
        table {
            font-family: arial, sans-serif;
            border-collapse: collapse;
            width: 100%;
        }

        td, th {
            border: 1px solid #dddddd;
            text-align: left;
            padding: 8px;
        }

        tr:nth-child(even) {
            background-color: #00bb00;
        }
    </style>
    <title>php_conn</title>
</head>
<body>
<h2>學生列表</h2>
<table>
    <thead>
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Age</th>
        <th>Birthday</th>
    </tr>
    </thead>
    <tbody>
    <?php foreach ($students as $student) : ?>
        <tr>
            <td><?php echo htmlspecialchars($student['id']) ?></td>
            <td><?php echo htmlspecialchars($student['name']); ?></td>
            <td><?php echo htmlspecialchars($student['age']); ?></td>
            <td><?php echo htmlspecialchars($student['birthday']); ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>
</body>
</html>
View Code

自帶的sql developer的bin目錄里,雙擊exe,也能順利打開,連接hgdb。

 

  • windows上Java遠程連接hgdb資料庫

 Java其實很簡單,從/opt/highgo/hgdb-see-4.5.8/etc/drivers/JDBC目錄拿到jdbc driver文件hgjdbc-6.1.0.jar,在eclipse建立一個java project,將jar加入build path,寫幾行測試代碼,即可連通。

 1 package hgdb;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.Statement;
 7 
 8 public class testhighgo {
 9 
10     public static void main(String[] args) {
11         Connection ct = null;
12         Statement sm = null;
13         ResultSet rs = null;
14         try {
15             // 載入HighGo DB的驅動
16             Class.forName("com.highgo.jdbc.Driver");
17             ct = DriverManager.getConnection("jdbc:highgo://192.168.2.114:5866/longware", "sysdba", "Aa123!");
18             sm = ct.createStatement();
19             // 執行查詢語句
20             String sql = "select * from t1 order by 1";
21             System.out.println("sql=====" + sql);
22             rs = sm.executeQuery(sql);
23             // 迴圈結果,並列印
24             while (rs.next()) {
25                 System.out.println("====" + rs.getString(2) + "====" + rs.getString(1));
26             }
27             // 拋出異常
28         } catch (Exception e) {
29             e.printStackTrace();
30         } finally {
31             // 關閉資料庫連接
32             try {
33                 if (rs != null) {
34                     rs.close();
35                 }
36                 if (sm != null) {
37                     sm.close();
38                 }
39                 if (ct != null) {
40                     ct.close();
41                 }
42             } catch (Exception ex) {
43                 ex.printStackTrace();
44             }
45         }
46     }
47 
48 }
View Code

其實,我是先用java測試連接的,java沒有報錯,因為瀚高官方jdbc driver裡面有相關的認證處理,裡面還有SM3的代碼。

  •  在Linux本機用PHP連接hgdb資料庫

用apt命令安裝好apache、php7.4,將info.php和前面的2個php腳本拷貝到/var/www/html之下,用瀏覽器訪問或命令行執行,仍然報錯 authentication method 13 not supported 

因為知道是libpq的問題,那麼看看有哪些libpq庫文件就知道問題了。

 1 root@longware-ubuntu:/# locate libpq.so      -----查找文件,發現文件主要在hgdb lib和操作系統的usr lib
 2 /opt/highgo/hgdb-see-4.5.8/etc/drivers/ODBC/psqlODBC/lib/libpq.so.5
 3 /opt/highgo/hgdb-see-4.5.8/lib/libpq.so
 4 /opt/highgo/hgdb-see-4.5.8/lib/libpq.so.5
 5 /opt/highgo/hgdb-see-4.5.8/lib/libpq.so.5.12
 6 /opt/highgo/hgproxy/lib/libpq.so
 7 /opt/highgo/hgproxy/lib/libpq.so.5
 8 /opt/highgo/hgproxy/lib/libpq.so.5.12
 9 /usr/lib/x86_64-linux-gnu/libpq.so.5
10 /usr/lib/x86_64-linux-gnu/libpq.so.5.14
11 
12 root@longware-ubuntu:/# ll /usr/lib/x86_64-linux-gnu/libpq.* -l       ------看看具體文件,是真實文件,還是鏈接,發現1真1鏈
13 lrwxrwxrwx 1 root root     13  8月  9 20:01 /usr/lib/x86_64-linux-gnu/libpq.so.5 -> libpq.so.5.14
14 -rw-r--r-- 1 root root 329912  8月  9 20:01 /usr/lib/x86_64-linux-gnu/libpq.so.5.14
15 
16 root@longware-ubuntu:/# ll /opt/highgo/hgdb-see-4.5.8/lib/libpq* -l           ------看看具體文件,是真實文件,還是鏈接,發現2真2鏈
17 -rw-r--r-- 1 root root 360738  7月  8  2022 /opt/highgo/hgdb-see-4.5.8/lib/libpq.a
18 lrwxrwxrwx 1 root root     13  7月  8  2022 /opt/highgo/hgdb-see-4.5.8/lib/libpq.so -> libpq.so.5.12*
19 lrwxrwxrwx 1 root root     13  7月  8  2022 /opt/highgo/hgdb-see-4.5.8/lib/libpq.so.5 -> libpq.so.5.12*
20 -rwxr-xr-x 1 root root 362560  7月  8  2022 /opt/highgo/hgdb-see-4.5.8/lib/libpq.so.5.12*
21 
22 root@longware-ubuntu:/# cd /usr/lib/x86_64-linux-gnu/   --------於是思路來了,狸貓換太子,將os的lib換成hgdb的lib,先備份,再軟鏈接
23 root@longware-ubuntu:/usr/lib/x86_64-linux-gnu# mv libpq.so.5  bak-libpq.so.5
24 root@longware-ubuntu:/usr/lib/x86_64-linux-gnu# mv libpq.so.5.14  bak-libpq.so.5.14 
25 
26 root@longware-ubuntu:/usr/lib/x86_64-linux-gnu# ln -s  /opt/highgo/hgproxy/lib/libpq.so.5.12   libpq.so.5
27 root@longware-ubuntu:/usr/lib/x86_64-linux-gnu# ln -s  /opt/highgo/hgproxy/lib/libpq.so.5.12   libpq.so.5.14 
28 
29 root@longware-ubuntu:/usr/lib/x86_64-linux-gnu# ll /usr/lib/x86_64-linux-gnu/libpq.* -l        ---------查看,再確認一下
30 lrwxrwxrwx 1 root root 37 11月 10 23:00 /usr/lib/x86_64-linux-gnu/libpq.so.5 -> /opt/highgo/hgproxy/lib/libpq.so.5.12*
31 lrwxrwxrwx 1 root root 37 11月 10 23:01 /usr/lib/x86_64-linux-gnu/libpq.so.5.14 -> /opt/highgo/hgproxy/lib/libpq.so.5.12*
32 
33 root@longware-ubuntu:/usr/lib/x86_64-linux-gnu# systemctl restart apache2    ----------重啟apache

重啟apache之後,php在本機就可以連接hgdb了。

如果伺服器是共用的,有多個應用在跑,那麼不建議直接換lib,因為可能會導致其他應用掛掉。 對於獨占或開發測試機,那就隨便折騰了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天記一個支付寶報錯“無效的AppID參數”的問題排查解決過程,希望可以幫到大家。 報錯產生 今天在測試支付寶用戶信息授權 換取授權訪問令牌 的時候,遇到了一個報錯:“無效的AppID參數”,本來以為是個簡單的問題,結果還是花了一點時間去找原因,找到最後發現是自己腦子瓦特了=。= 報錯截圖如下: 在 ...
  • Python中的 *號是一個特殊的符號,在其他編程語言中,它最廣為人知的用途就是作為乘法運算的符號。而在Python中,它的用途遠不止如此。 本文總結了Python中*號的所有用途,以供參考。 1. 算術運算 號用來做算術運算幾乎是所有編程語言採用的方法,在Python中,號可作為乘法運算和指數運算 ...
  • 分散式的思想在大量的數據處理操作方案中涌現了很多的解決方式。Java 是 90 年代出現的語言,在嵌入式移動領域和 web 系統 PC 端占據著較大的市場。移動安卓以及現在的企業H5 小程式,在企業的數字化轉型中起著十分重要的作用。 分散式微服務實現的框架是在 2017 年 springboot 開 ...
  • 常用的包 import torch import torchvision from torch import nn from torch.utils.data import DataLoader from torch.nn import Conv2d, MaxPool2d, Flatten, Lin ...
  • 在使用事務的時候需要添加@EnableTransactionManagement註解來開啟事務,Spring事務底層是通過AOP來實現的,所以啟用事務後,同樣會向容器中註入一個代理對象創建器,AOP使用的是AnnotationAwareAspectJAutoProxyCreator,事務使用的是In ...
  • 前言: 繼上篇:Taurus .Net Core 微服務開源框架:Admin 插件【4-3】 - 配置管理 - Mvc【Plugin-MicroService 微服務】 本篇繼續介紹下一個內容: 系統配置節點:Mvc - Plugin - CORS 跨域界面: 界面如下: 跨域功能相關配置說明如下: ...
  • 目錄 Welcome to YARP - 1.認識YARP並搭建反向代理服務 Welcome to YARP - 2.配置功能 2.1 - 配置文件(Configuration Files) 2.2 - 配置提供者(Configuration Providers) 2.3 - 配置過濾器(Confi ...
  • 前言 由於業務需要,需要多台雲伺服器,但是公有雲的帶寬價格不菲,所以不可能給所有的雲伺服器都配上公網IP,一方面是成本的問題,另一方面也是公網安全的問題。 所以通過其它的方式使用無公網的雲伺服器來來實現對外資源的訪問。 一、操作步驟 至少需要有一臺具有公網IP的雲伺服器! 1、開啟ECS的路由轉發功 ...
一周排行
    -Advertisement-
    Play Games
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 前言 今天給大家推薦一個超實用的開源項目《.NET 7 + Vue 許可權管理系統 小白快速上手》,DncZeus的願景就是做一個.NET 領域小白也能上手的簡易、通用的後臺許可權管理模板系統基礎框架。 不管你是技術小白還是技術大佬或者是不懂前端Vue 的新手,這個項目可以快速上手讓我們從0到1,搭建自 ...
  • 第1章:WPF概述 本章目標 瞭解Windows圖形演化 瞭解WPF高級API 瞭解解析度無關性概念 瞭解WPF體繫結構 瞭解WPF 4.5 WPF概述 ​ 歡迎使用 Windows Presentation Foundation (WPF) 桌面指南,這是一個與解析度無關的 UI 框架,使用基於矢 ...
  • 在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 第3章:佈局 本章目標 理解佈局的原則 理解佈局的過程 理解佈局的容器 掌握各類佈局容器的運用 理解 WPF 中的佈局 WPF 佈局原則 ​ WPF 視窗只能包含單個元素。為在WPF 視窗中放置多個元素並創建更貼近實用的用戶男面,需要在視窗上放置一個容器,然後在這個容器中添加其他元素。造成這一限制的 ...
  • 前言 在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。 FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。 此外 ...
  • 目錄Blazor 組件基礎路由導航參數組件參數路由參數生命周期事件狀態更改組件事件 Blazor 組件 基礎 新建一個項目命名為 MyComponents ,項目模板的交互類型選 Auto ,其它保持預設選項: 客戶端組件 (Auto/WebAssembly): 最終解決方案裡面會有兩個項目:伺服器 ...
  • 先看一下效果吧: isChecked = false 的時候的效果 isChecked = true 的時候的效果 然後我們來實現一下這個效果吧 第一步:創建一個空的wpf項目; 第二步:在項目裡面添加一個checkbox <Grid> <CheckBox HorizontalAlignment=" ...
  • 在編寫上位機軟體時,需要經常處理命令拼接與其他設備進行通信,通常對不同的命令封裝成不同的方法,擴展稍許麻煩。 本次擬以特性方式實現,以兼顧維護性與擴展性。 思想: 一種命令對應一個類,其類中的各個屬性對應各個命令段,通過特性的方式,實現其在這包數據命令中的位置、大端或小端及其轉換為對應的目標類型; ...