반응형
.NET MySql 커넥터를 사용하여 mariadb에서 DELMITER를 사용하는 방법은 무엇입니까?
MariaDB 10.2.12를 사용하고 있으며 .NET MySQL 커넥터를 사용하여 연결하고 있습니다.MySQL Workbench에서는 다음 트리거가 제대로 작동합니다.
DELIMITER //
CREATE TRIGGER update_last_modified
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
DECLARE miscdataWithDate JSON;
IF JSON_CONTAINS_PATH(NEW.miscdata, 'all', '$.v1.lastModified2') THEN
SET NEW.miscdata = JSON_REPLACE(NEW.miscdata, '$.v1.lastModified2', UTC_TIMESTAMP());
ELSE
SET miscdataWithDate = JSON_SET('{"v1": {}}', '$.v1.lastModified2', UTC_TIMESTAMP());
SET NEW.miscdata = JSON_MERGE(NEW.miscdata, miscdataWithDate);
END IF;
END; //
DELIMITER ;
C#/에서 명령을 실행합니다.NET, 저는 다음을 사용했습니다.라이브러리가 세미콜론을 추가할 경우를 대비하여 최종 세미콜론을 포함하거나 포함하지 않고 시도했습니다.
using (var cmd = new MySqlCommand(@"CREATE TRIGGER update_last_modified
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
DECLARE miscdataWithDate JSON;
IF JSON_CONTAINS_PATH(NEW.miscdata, 'all', '$.v1.lastModified') THEN
SET NEW.miscdata = JSON_REPLACE(NEW.miscdata, '$.v1.lastModified', UTC_TIMESTAMP());
ELSE
SET miscdataWithDate = JSON_SET('{""v1"": {}}', '$.v1.lastModified', UTC_TIMESTAMP());
SET NEW.miscdata = JSON_MERGE(NEW.miscdata, miscdataWithDate);
END IF;
END; //
DELIMITER ;", connection))
{
await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
}
트리거가 정의된 경우(호출되지 않음) 오류는 다음과 같습니다.
Unhandled Exception: System.AggregateException: One or more errors occurred. (You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '//
DELIMITER' at line 1) ---> MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '//
DELIMITER' at line 1
쿼리를 단순화하여 필요하지 않은 경우DELIMITER
세트, 작동합니다.그러나 사용자 지정 구분 기호가 있는 매우 간단한 트리거도 실패합니다.
다른 사람들이 .NET의 MySQL/MariaDB로 구분 기호를 성공적으로 사용한 방법을 검색했을 때 다음 기사를 발견했습니다. https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-mysqlscript-delimiter.html
주어진 예는 사용됩니다.MySqlScript
대신에MySqlCommand
그래서 나는 믿습니다.MySqlCommand
구분 기호를 지원하지 않습니다.다음은 정상적으로 작동하는 업데이트된 코드입니다.
MySqlScript script = new MySqlScript(connection, @"CREATE TRIGGER update_last_modified
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
DECLARE miscdataWithDate JSON;
IF JSON_CONTAINS_PATH(NEW.miscdata, 'all', '$.v1.lastModified') THEN
SET NEW.miscdata = JSON_REPLACE(NEW.miscdata, '$.v1.lastModified', UTC_TIMESTAMP());
ELSE
SET miscdataWithDate = JSON_SET('{""v1"": {}}', '$.v1.lastModified', UTC_TIMESTAMP());
SET NEW.miscdata = JSON_MERGE(NEW.miscdata, miscdataWithDate);
END IF;
END; //");
script.Delimiter = "//";
await script.ExecuteAsync().ConfigureAwait(false);
언급URL : https://stackoverflow.com/questions/52437944/how-to-use-delimiter-in-mariadb-using-the-net-mysql-connector
반응형
'prosource' 카테고리의 다른 글
테이블의 외부 키 관계 쿼리 (0) | 2023.07.07 |
---|---|
Python을 공유 라이브러리에 연결하기 위해 Cython 사용 (0) | 2023.07.07 |
Apache POI, 새 셀 작성이 행 스타일을 재정의합니다. (0) | 2023.07.07 |
mongodb에 색인을 만들 수 없습니다. "키가 너무 커서 색인화할 수 없습니다." (0) | 2023.07.07 |
PL-SQL의 contains()는 어떻게 작동합니까? (0) | 2023.07.07 |