내 응용 프로그램에서 원격 사이트의 서버에 기록 된 데이터를 보내려면 protobuf-net을 사용하고 있습니다. 여러 데이터 유형이 있습니다.이 중 하나의 샘플 메시지는 다음과 같습니다.Dapper로 프로토콜 버퍼 모델을 사용할 때 C# ticks를 PostgreSQL 타임 스탬프에 매핑하는 방법은 무엇입니까?
message Sample {
required int64 recording_time = 1; // UTC Timestamp in Ticks
required double x_position = 2;
required double y_position = 3;
required double x_velocity = 4;
required double y_velocity = 5;
}
서버에는 개체가 PostgreSQL 데이터베이스에 저장됩니다. 프로토콜 버퍼 (proto2
) 메시지의 모든 double
필드는 PostgreSQL의 double
필드에 매핑됩니다. 시간 소인 필드 uint64 recording_time
은 데이터베이스의 timestamp with time zone
필드에 맵핑되어야합니다.
동일한 C# 클래스 (ProtoContract
특성 사용)를 사용하여 클라이언트에서 Sample
을 직렬화하고 데이터베이스 작업 (예 : FastCRUD 등)이있는 경우 Dapper를 사용하여 직렬화하려고합니다. 및 timestamp with time zone
(C# 1 유형 : 날짜 시간)
이
는ticks
(긴
C# 1 형) 간의 맵핑/변환이 필요하다. 두 번째 클래스를 만들지 않고이를 구현하는 가장 좋은 방법은 무엇입니까? 이것은 내가 현재 데이터베이스 오브젝트를 작성하는 방법입니다 :
foreach (Sample sample in sampleList)
{
conn.Insert<Sample>(sample);
}
을 그리고 검색을 위해 해당 Query
방법을 사용하십시오
string sql = "COPY samples (recording_time, x_position, y_position, x_velocity, y_velocity) FROM STDIN (FORMAT BINARY)";
using (var writer = conn.BeginBinaryImport(sql))
{
foreach (Sample sample in sampleList)
{
writer.StartRow();
writer.Write(new DateTime(sample.RecordingTime, DateTimeKind.UTC), NpgsqlTypes.NpgsqlDbType.TimestampTZ);
writer.Write(sample.X_Position, NpgsqlTypes.NpgsqlDbType.Double);
writer.Write(sample.Y_Position, NpgsqlTypes.NpgsqlDbType.Double);
writer.Write(sample.X_Velocity, NpgsqlTypes.NpgsqlDbType.Double);
writer.Write(sample.Y_Velocity, NpgsqlTypes.NpgsqlDbType.Double);
}
}
이것은 내가 데이터베이스에 기록하는 방법이다.
그러나 여전히 데이터베이스에 값을 저장하기 위해 C# 코드를 사용할 것입니까? 그렇다면 C# DateTime 객체를 생성하여 데이터베이스 호출에서 사용할 수 있습니다. – Evk
@Evk 예, 현재 DateTime 개체를 만들고 Npgsql을 통해 데이터베이스에 쓰고 있습니다. 그러나 Dapper (또는 유사한 ORM)를 사용하여 쿼리에서 'Sample'개체를 검색하고 싶습니다. 이 변환을 Dapper 구성/초기화에 쓰는 방법이 있습니까? – Abir