【发布时间】:2017-03-25 18:31:40
【问题描述】:
如何插入 Firebird,主键自动递增?
对于我拥有的表格字段:
fstPriority VARCHAR(30), fstInfo VARCHAR(100), fstDateCreated VARCHAR(30), fstDateModified VARCHAR(30), fiKeyID INTEGER PRIMARY KEY
对于 INSERT INTO 我有:
FbConnection fbConn = new FbConnection(stOpenConn))
fbConn.Open();
...
FbTransaction fbTransaction = fbConn.BeginTransaction();
FbCommand fbCmd = new FbCommand("INSERT INTO " + stTableName + "(" + stFieldNames + ") VALUES ( @p0, @p1, @p2, @p3, @p4 ) RETURNING fiKeyID ", fbConn, fbTransaction);
但不确定应该使用什么 fbCmd.Parameters.AddWithValue
fbCmd.Parameters.AddWithValue("@p0", "1st value");
fbCmd.Parameters.AddWithValue("@p1", "2nd value");
fbCmd.Parameters.AddWithValue("@p2", "3rd value");
fbCmd.Parameters.AddWithValue("@p3", "4th value");
然后呢?对于fiKeyID,我是否添加
fbCmd.Parameters.AddWithValue("@p4", "");
另外,我在 http://www.firebirdfaq.org/faq29/ 看到创建了一个自动增量列,但我不确定如何在 C# ... Firebird ADO.NET ... FirebirdClient.5.8.0 ... Visual Studio 2013 中执行此操作。
CREATE GENERATOR ...;
SET GENERATOR ...;
set term !! ;
CREATE TRIGGER ...
Visual Studio 编译器无法识别。
【问题讨论】:
-
如果您有一列使用序列/生成器,您没有为该列指定值,它将自动分配序列中的下一个值。如果您正在执行任何类型的迁移,并且您需要为自动递增字段指定值,则需要先禁用序列/生成器,然后当您完成后,您需要将序列更新为新的结束值,并重新启用它。
-
您是否以编程方式定义表的结构?
-
是的,表是以编程方式创建的 --- FbTransaction fbTransaction = fbConn.BeginTransaction() --- for (int ii = 0; ii
-
当我起草我的 on-the-go 语句生成器时,列有标志,所以类似记录的对象有像
GetIDColumnsArray和GetDataColumnsArray这样的方法(实际上有点复杂,因为它们可以重叠,但这没关系)。所以我相信你必须有一个类似的结构来描述你的表,所以你的查询构建看起来像这样:`fbCmd = new FbCommand( tbl.InsertPrologue() + " ("+ tbl.getDataColumns().JoinString() + ") 值 (" + tbl.getDataColumns(),Substitutes().JoinString() + ") 返回 " + tbl.getIDColumns().JoinString(); -
这样您就可以集中结构声明,并创建一些可重用的例程来构建 SQL 语句。并且不会错误地为 ID-cortege 中的列赋值。
标签: c# ado.net firebird firebird-embedded