Преобразовать функцию sql в логический метод С#C#

Место общения программистов C#
Ответить
Anonymous
 Преобразовать функцию sql в логический метод С#

Сообщение Anonymous »

Итак, по сути, у меня есть требование передать дату и время и получить конкретную дату и время организации.
ниже функция Sql работает отлично.
Это работает, даже если я вызываю функцию sql из C#.
Но я хочу реализовать ту же логику в C#. Я хочу избавиться от функции sql и напрямую реализовать логику на C# с помощью встроенных запросов.
ALTER FUNCTION [dbo].[fnGetConvertDateTimeWithTimeZoneOffset]
(
@OrganizationID INT,
@LocationID INT,
@Date DATETIME
)
RETURNS DATETIME
AS
BEGIN

DECLARE @TimeOffset INT = 0,
@ConvertedDateTime DATETIME ,
@DayLightSavingHour INT = 60,
@IsDayLight CHAR(1) = 'N'
SELECT @ConvertedDateTime = @Date

IF NOT EXISTS(SELECT 1 FROM dbo.Organization_TimeZone WHERE OrganizationID = @OrganizationID AND LocationId = @LocationID AND @LocationID > 0)
BEGIN
SELECT @LocationID = 0
END
SELECT @TimeOffset = ISNULL(TimeOffsetValue,0), @IsDayLight = ISNULL(IsDayLight,'N')
FROM dbo.Organization_TimeZone WITH (NOLOCK)
WHERE OrganizationID = @OrganizationID
AND (ISNULL(LocationId,0) = @LocationID)
AND IsActive = 'Y'

IF(@TimeOffset 0)
BEGIN
SELECT @TimeOffset =
CASE WHEN @IsDayLight = 'Y' AND @TimeOffset > 0
THEN @TimeOffset - @DayLightSavingHour
WHEN @IsDayLight = 'Y' AND @TimeOffset < 0
THEN @TimeOffset + @DayLightSavingHour
ELSE @TimeOffset
END
SELECT @ConvertedDateTime = DATEADD(MINUTE,@TimeOffset,@Date)
END

RETURN @ConvertedDateTime
END

это функция sql, вызываемая C#.
сейчас она работает нормально.
но когда я реализую ту же логику через С#. это не работает. почему?
вот мой пример кода, который я получил отchatgpt:
using System;

using System.Data.SqlClient;

public class TimeZoneConversion
{
public static DateTime ConvertDateTimeWithTimeZoneOffset(int organizationId, int locationId, DateTime inputDate)
{
// Initialize necessary variables
int timeOffset = 0;
DateTime convertedDateTime = inputDate;
int dayLightSavingHour = 60;
char isDayLight = 'N';

bool hasLocation = CheckIfLocationExists(organizationId, locationId);

if (!hasLocation)
{
locationId = 0;
}

GetTimeZoneAndDaylightSavingInfo(organizationId, locationId, ref timeOffset, ref isDayLight);

if (timeOffset != 0)
{
if (isDayLight == 'Y')
{
timeOffset = AdjustForDaylightSaving(timeOffset, dayLightSavingHour);
}

convertedDateTime = convertedDateTime.AddMinutes(timeOffset);
}

return convertedDateTime;
}

private static void GetTimeZoneAndDaylightSavingInfo(int organizationId, int locationId, ref int timeOffset, ref char isDayLight)
{
string connectionString = "your_connection_string_here"; // Update with your actual DB connection string
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = @"
SELECT TimeOffsetValue, IsDayLight
FROM dbo.Organization_TimeZone
WHERE OrganizationID = @OrganizationID
AND (ISNULL(LocationId, 0) = @LocationID)
AND IsActive = 'Y'";

using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.Parameters.AddWithValue("@OrganizationID", organizationId);
cmd.Parameters.AddWithValue("@LocationID", locationId);

connection.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
timeOffset = reader.IsDBNull(0) ? 0 : reader.GetInt32(0); // Default to 0 if null
isDayLight = reader.IsDBNull(1) ? 'N' : reader.GetString(1)[0]; // Default to 'N' if null
}
else
{
timeOffset = 0;
isDayLight = 'N';
}
}
}
}
}

private static int AdjustForDaylightSaving(int timeOffset, int dayLightSavingHour)
{
if (timeOffset > 0)
{
return timeOffset - dayLightSavingHour;
}
else if (timeOffset < 0)
{
return timeOffset + dayLightSavingHour;
}
return timeOffset;
}

private static bool CheckIfLocationExists(int organizationId, int locationId)
{
string connectionString = "your_connection_string_here"; // Update with your actual DB connection string
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = @"
SELECT 1
FROM dbo.Organization_TimeZone
WHERE OrganizationID = @OrganizationID
AND LocationId = @LocationID
AND IsActive = 'Y'";

using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.Parameters.AddWithValue("@OrganizationID", organizationId);
cmd.Parameters.AddWithValue("@LocationID", locationId);

connection.Open();
var result = cmd.ExecuteScalar();
return result != null;
}
}
}
}

class Program
{
static void Main()
{
DateTime inputDate = new DateTime(2024, 11, 18, 14, 0, 0); // Example input date (UTC)
DateTime convertedDateTime = TimeZoneConversion.ConvertDateTimeWithTimeZoneOffset(811, 1, inputDate);
Console.WriteLine("Converted DateTime: " + convertedDateTime);
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... gic-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»