Как преобразовать параметры подстроки в тип столбца в C #? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть INSERT с одним параметром VARCHAR.SQL выглядит так:

INSERT INTO FLAGS (TIME_STAMP, FLAG) 
SELECT SUBSTRING(@s1 FROM 1 FOR 23), SUBSTRING(@s1 FROM 24 FOR 2) 
FROM RDB$DATABASE;

И способ отправки выглядит следующим образом:

using (FbConnection connection = new FbConnection(ConnectionString))
{
    try
    {
        connection.Open();
        var transaction = connection.BeginTransaction();
        var command = new FbCommand(sqlCommand, connection, transaction);
        command.Parameters.Add("@s1", "2018-09-12 08:37:51.00083");
        command.ExecuteNonQuery();
        transaction.Commit();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

Столбец TIME_STAMP равен TIMESTAMP, а столбец FLAG равен INTEGER.В реальном приложении в INSERT будет несколько строк, а не одна.Также будет больше столбцов, поэтому я хотел бы, чтобы количество параметров для одной строки было как можно меньше.
Если я запускаю этот код, он дает мне:
Exception thrown: 'System.FormatException' in FirebirdSql.Data.FirebirdClient.dll

Если яизмените команду следующим образом:

INSERT INTO FLAGS (TIME_STAMP, FLAG) 
SELECT SUBSTRING(@s1 FROM 1 FOR 23), CAST(SUBSTRING(@s1 FROM 24 FOR 2) AS INTEGER) 
FROM RDB$DATABASE;

Это дает мне эту ошибку:

Exception thrown: 'FirebirdSql.Data.FirebirdClient.FbException' in 
FirebirdSql.Data.FirebirdClient.dll
Dynamic SQL Error
SQL error code = -804
Data type unknown

FWIR это должно быть возможно.По крайней мере, это работает в FlameRobin (версия с CAST также работает):

SET TERM ^ ; 
EXECUTE BLOCK AS 
DECLARE s1 VARCHAR(25) = '2018-09-12 08:37:51.00083'; 
BEGIN 
INSERT INTO FLAGS (TIME_STAMP, FLAG) 
SELECT SUBSTRING(:s1 FROM 1 FOR 23), SUBSTRING(:s1 FROM 24 FOR 2) 
FROM RDB$DATABASE;
END^ 
SET TERM ; ^

Может кто-нибудь направить меня в правильном направлении?

РЕДАКТИРОВАТЬ
Результат должен быть:

TIME_STAMP              | FLAG
------------------------+-----
2018-09-12 08:37:51.000 | 83

1 Ответ

0 голосов
/ 18 сентября 2018

Firebird не может определить тип данных параметра в списке выбора в большинстве ситуаций (есть исключения, но это не одно из них).Вам нужно будет явно привести его, чтобы определить тип данных и длину.Обратите внимание, что это работает только с Firebird 2.5 или выше.

Вам нужно будет использовать:

INSERT INTO FLAGS (TIME_STAMP, FLAG) 
SELECT SUBSTRING(cast(@s1 as varchar(25)) FROM 1 FOR 23), CAST(SUBSTRING(cast(@s1 as varchar(25)) FROM 24 FOR 2) AS INTEGER) 
FROM RDB$DATABASE

Однако было бы гораздо лучше использовать эту сторону клиента и просто использовать обычный insert into .. values (..,..) использование соответствующих типов, чем использование строковых типов.

Причина, по которой он работает в execute block, заключается в том, что вы уже определили s1 как varchar(25)

...