INSERTINTOFirebird如何自动增加主键?INSERTINTOFirebird如何自动增加主键?对于表单字段,我有:fstPriorityVARCHAR(30)、fstInfoVARCHAR(100)、fstDateCreatedVARCHAR(30)、fstDateModifiedVARCHAR(30)、fiKeyIDINTEGERPRIMARYKEYINSERTINTO我有:FbConnectionfbConn=newFbConnection(stOpenConn))fbConn。打开();...FbTransactionfbTransaction=fbConn.BeginTransaction();FbCommandfbCmd=newFbCommand("INSERTINTO"+stTableName+"("+stFieldNames+")VALUES(@p0,@p1,@p2,@p3,@p4)RETURNINGfiKeyID",fbConn,fbTransaction);但我不确定fbCmd.Parameters.AddWithValue应该使用什么fbCmd.Parameters.AddWithValue("@p0","1stvalue");fbCmd.Parameters.AddWithValue("@p1","第二个值");fbCmd.Parameters.AddWithValue("@p2","第三值");fbCmd.Parameters.AddWithValue("@p3","第四个值");所以呢?对于fiKeyID,我应该添加吗?fbCmd.Parameters.AddWithValue("@p4","");另外,我在http://www.firebirdfaq.org/faq29/上看到创建了一个自动增量列,但我不确定在C#中如何做到这一点...FirebirdADO.NET...FirebirdClient.5.8.0...VisualStudio2013创建生成器...;设置生成器...;规定期限!;CREATETRIGGER...VisualStudio编译器无法识别。重要的是SETTERM不是Firebird语句语法的一部分,而是在ISQL等查询工具中设置语句终止符的客户端功能。这个终结器必须知道语句何时完成并可以发送到服务器。默认情况下,工具使用分号(;)执行此操作,但这不适用于PSQL(存储过程、触发器),因为PSQL代码也使用分号。为了解决这个问题,这些工具有SETTERM来切换这个终止符。但是,使用FirebirdADO.net提供程序,您一次执行一个语句,因此语句终止符是无关紧要的。为了能够生成一个主键,你可以使用这个解决方案:Firebird3有标识类型的列,所以你不需要创建一个序列并自己触发它:createtablewithgeneratedid(idintegergeneratedbydefaultasidentityprimarykey,column2varchar(100))对于Firebird2.5及更早版本,您需要创建一个序列和触发器:createtablewithgeneratedid(idintegerprimarykey,column2varchar(100));创建序列seq_withgeneratedid;设置术语#;createtriggerwithgeneratedid_bibeforeinsertonwithgeneratedidasbeginif(new.idisnull)thennew.id=nextvalueforseq_withgeneratedid;end#setterm;#当向表中插入值并希望生成键时,id列不应包含在列列表中。包括id列允许您覆盖键值,但这可能导致未来的插入生成重复的键!如果确实包含id列,则在Firebird3示例中不会生成任何键,在Firebird2.5示例中,如果该列的值为空,则会生成一个键,否则将采用提供的值。在ADO.net中,您通常需要单独执行语句(而不是使用setterm)。或者,您可以使用FbScript来解析DDL脚本并执行解析后的语句。请注意,FbScript确实支持(甚至需要)setterm。要使用FirebirdADO.net提供程序执行此操作,您需要执行类似于以下示例的操作。我包含了三个用于创建表Firebird3、Firebird2_5和FbScriptFB2_5的FbScript(与Firebird2_5相同,但使用FbScript)。它还显示了如何检查生成的密码:namespaceFbGeneratedKeys{classProgram{privatestaticSolutionTypesolutionType=SolutionType.FbScriptFB2_5;staticvoidMain(string[]args){varconnectionString=newFbConnectionStringBuilder{Database=@"D:tempgeneratedkey.fdb",ServerType=FbServerType.Default,UserID="SYSDBA",Password="masterkey",}.ToString();FbConnection.CreateDatabase(connectionString,pageSize:8192,overwrite:true);使用(FbConnectionconnection=newFbConnection(connectionString))使用(FbCommandcmd=newFbCommand()){connection.Open();cmd.Connection=连接;switch(solutionType){caseSolutionType.Firebird3:Firebird3Example(cmd);休息;caseSolutionType.Firebird2_5:Firebird2_5Example(cmd);休息;caseSolutionType.FbScriptFB2_5:FbScriptFB2_5Example(cmd);休息;}cmd.CommandText=@"insertintowithgeneratedid(column2)values(@column2)returningid";cmd.Parameters.AddWithValue("@column2","一些值");命令.Parameters.Add(newFbParameter(){Direction=System.Data.ParameterDirection.Output});cmd.ExecuteNonQuery();Console.WriteLine("Id:"+cmd.Parameters[1].Value);控制台.ReadLine();}}privatestaticvoidFirebird3Example(FbCommandcmd){//Firebird3身份列cmd.CommandText=@"createtablewithgeneratedid(默认生成的id整数作为身份主键,column2varchar(100))";cmd.ExecuteNonQuery();}privatestaticvoidFirebird2_5Example(FbCommandcmd){//Firebird2.5和更早版本的普通主键触发生成键//Tablecmd.CommandText=@"createtablewithgeneratedid(idintegerprimarykey,column2varchar(100))";cmd.ExecuteNonQuery();//序列cmd.CommandText="创建序列seq_withgeneratedid";cmd.ExecuteNonQuery();//触发器cmd.CommandText=@"createtriggerwithgeneratedid_bibeforeinsertonwithgeneratedidasbeginif(new.idisnull)thennew.id=nextvalueforseq_withgeneratedid;end";cmd.ExecuteNonQuery();}privatestaticvoidFbScriptFB2_5Example(FbCommandcmd){stringscript=@"createtablewithgeneratedid(idintegerprimarykey,column2varchar(100));创建序列seq_withgeneratedid;设置术语#;createtriggerwithgeneratedid_bibeforeinsertonwithgeneratedidasbeginif(new.idisnull)thennew.id=nextvalueforseq_withgeneratedid;end#setterm;#";FbScriptfbScript=newFbScript(script);fbScript.Parse();FbBatchExecutionexec=newFbBatchExecution(cmd.Connection);exec.AppendSqlStatements(fbScript);exec.Execute();}}枚举SolutionType{Firebird3,Firebird2_5,FbScriptFB2_5}}定义:publicconststringstMAIN_TABLE_NAME="OrgTable";publicconststringstDELETED_TABLE_NAME="BackupTable";publicconststringstFIELD_DEFINITIONS="fstPriorityVARCHAR(30)"+",fstInfoVARCHAR(100)"+",fstDateCreatedVARCHAR(30)"+",fstDateModifiedVARCHAR(30)"+",fiKeyIDINTEGERGENERATEDBYDEFAULTASIDENTITYPRIMARYKEY";publicconststringstFIELD_NAMES="fstPriority"+",fstInfo"+",fstDateCreated"+",fstDateModified"+",fiKeyID";publicconststringstFIELD_NAMES_NO_KEY_ID="fstPriority"+",fstInf",fstDateCreated"+",fstDateModified";遵循—//----------------------------staticprivateboolboCreateDatabaseTables(stringstPathFilename,stringstUserID,stringstPassword,ListliststTableNames,列表liststFieldDefinitions){boolboErrorFlag=false;intiTablesCount=liststTableNames.Count();stringstOpenConn=newFbConnectionStringBuilder{Database=stPathFilename,UserID=stUserID,Password=stPassword,ServerType=FbServerType.Embedded,ClientLibrary_Library_stString();使用(FbConnectionfbConn=newFbConnection(stOpenConn)){try{fbConn.Open();FbTransactionfbTransaction=fbConn.BeginTran行动();对于(intii=0;iiliststFieldValuesNoKeyId){boolboErrorFlag=false;stringstOpenConn=newFbConnectionStringBuilder{Database=stPathFilename,UserID=stUserID,Password=stPassword,ServerType=FbServerType.Embedded,ClientLibrary=stCLIENT}_LIBRARY}_LIBRARY();使用(FbConnectionfbConn=newFbConnection(stOpenConn)){fbConn.Open();尝试{stringstValuesPlaceHolder="@p0";for(intiii=1;iii)本文采集自网络,不代表立场。侵权请点击右联系管理员删除如需转载请注明出处:
