我有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
在大多数情况下,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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句