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

Artholl

我有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_STAMPTIMESTAMP和列FLAGINTEGER在实际的应用程序中,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,是因为您已经将其定义s1varchar(25)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在C#中将字节数组的子范围转换为字符串

如何在C#中将字符串(ASCII类型)转换为UTF-8

在C#中将字符串转换为类型

如何在Spark中将数据框的列类型从字符串转换为(数组和结构)

如何在熊猫中将列的数据类型从字符串转换为列表?

如何在配置单元中将字符串数据类型列转换为日期格式

如何在C ++中将字符串数组转换为字符串类型,如将每个元素连接成一个字符串,并在字符串上使用子字符串?

如何在C#字符串中将上标字符转换为普通文本

如何在C#中将char字符串转换为字符

如何在C中将字符串转换为复数?

如何在C中将字符串转换为整数?

如何在C中将整数转换为字符串?

如何在C中将int转换为字符串?

如何在C ++中将字符串转换为int?

如何在C中将char转换为字符串?

如何在Typescript中将字符串转换为字符串文字类型?

如何在C#中将字符串转换为整数数组

如何在c#中将json格式字符串转换为json

如何在C#中将等号“ =”的字符串转换为json

如何在C#中将System.Guid强制转换为字符串

如何在C#中将输入字符串转换为大写

如何在C#中将unicode字符串转换为int?

如何在C#中将字典转换为JSON字符串?

如何在C#模型而不是控制器中将布尔转换为字符串

如何在C#中将字符串转换为Datetime

如何在C#中将字符串转换为HTTP响应?

如何在Lazor C#中将lambda表达式的结果转换为字符串?

如何在C#中将Json字符串转换为List

如何在C#中将字符串变量转换为double