【发布时间】:2018-09-18 13:33:01
【问题描述】:
我有一个 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
【问题讨论】:
-
我建议考虑类似stackoverflow.com/questions/17882366/… 并单独指定每个参数。
-
其实我在
EXECUTE BLOCK中有多次插入,但是在速度和内存消耗方面存在问题,所以我正在寻找其他一些可能更有效的解决方案。 -
“也会有更多的列,所以我想将一行的参数数量保持在尽可能低的水平”——一个非常奇怪的想法。为了模糊启发式和没有保证,您想删除类型安全和确定性行为。出于晦涩的原因,您想将自己射入脚中。好吧,你刚刚做到了。
-
@Arioch'当 OP 使用 FirebirdSql.Data.FirebirdClient 时,链接到 IBProvider 文档不正确,并且该驱动程序确实支持在参数名称中使用
@(如 System.Data. SqlClient for SQL Server) -
@Arioch'The 这不是我的意思。您根据其他驱动程序的文档提出了不正确的声明。
标签: c# casting substring firebird firebird2.5