gpt4 book ai didi

c# - 如何将参数子字符串转换为 C# 中的列类型?

转载 作者:太空宇宙 更新时间:2023-11-03 12:10:50 25 4
gpt4 key购买 nike

我有一个带有一个 VARCHAR 参数的 INSERT。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 列是 TIMESTAMPFLAG 列是 INTEGER。在实际应用程序中,INSERT 中会有几行,而不仅仅是一行。还会有更多的列,所以我想尽可能减少一行的参数数量。
如果我运行这段代码,它会给我:
抛出异常:FirebirdSql.Data.FirebirdClient.dll 中的“System.FormatException”

如果我这样更改命令:

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

最佳答案

在大多数情况下,Firebird 无法推断选择列表中参数的数据类型(也有异常(exception),但这不是其中之一)。您将需要显式转换它以定义数据类型和长度。请注意,这仅适用于 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)

关于c# - 如何将参数子字符串转换为 C# 中的列类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52387796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com