1

如何获取在策略表中创建的最后一个id并将其存储到一个变量中,以便可以将其用于名为backupspec表的另一个表。从SQL Server数据库表中检索最后一个id

System.Data.SqlClient.SqlConnection dataConnection = new SqlConnection(); 
      dataConnection.ConnectionString = 
       @"Data Source=JAGMIT-PC\SQLEXPRESS;Initial Catalog=SumooHAgentDB;Integrated Security=True"; 

      System.Data.SqlClient.SqlCommand dataCommand = new SqlCommand(); 
      dataCommand.Connection = dataConnection; 

      //tell the compiler and database that we're using parameters (thus the @first, @last, @nick) 
      dataCommand.CommandText = ("Insert Policies (PolicyName, PolicyDesc, TimeAdded,OSFlag, CreateVSSSnapshot, CreateAuditLogForRecoveries, AllowUsersToOverwriteFiles, AutoHandleEnvErrors, NotifyOnEnvErrorCount, NotifyOnFileFailure, NotifyOnFileFailureCount, NotifyOnLackOfPCContact, NotifyOnLackOfPCContactDays, NotifyOnRecoveryFailures, NotifyOnRecoveryFailureReason) values (@pn,@pd,@TimeAdded,@os,@vss,@al,@uow,@hee,@oeec,@off,@offc,@oloc,@olocd,@orf,@orfr)"); 




     dataCommand.Parameters.AddWithValue("@pn",pn); 
     dataCommand.Parameters.AddWithValue("@pd",pd); 
     dataCommand.Parameters.AddWithValue("@TimeAdded",TimeAdded); 
     dataCommand.Parameters.AddWithValue("@os",os); 
     dataCommand.Parameters.AddWithValue("@vss",vss); 
     dataCommand.Parameters.AddWithValue("@al",al); 
     dataCommand.Parameters.AddWithValue("@uow",uow); 
     dataCommand.Parameters.AddWithValue("@hee",hee); 
     dataCommand.Parameters.AddWithValue("@oeec",oeec); 
     dataCommand.Parameters.AddWithValue("@off",off); 
     dataCommand.Parameters.AddWithValue("@offc",offc); 
     dataCommand.Parameters.AddWithValue("@oloc",oloc); 
     dataCommand.Parameters.AddWithValue("@olocd",olocd); 
     dataCommand.Parameters.AddWithValue("@orf",orf); 
     dataCommand.Parameters.AddWithValue("@orfr",orfr); 

     dataConnection.Open(); 

     dataCommand.ExecuteNonquery(); 


     dataConnection.Close(); 


     ArrayList jaja = (ArrayList)Session["BackupSpecList"]; 


     for (int i = 0; i < jaja.Count; i++) 
     { 
      BackupSpecEntry bsp = (BackupSpecEntry)jaja[i]; 
      string path = bsp.path; 
      string inclExcl = bsp.inclExcl; 
      byte inclExclFlags = bsp.inclExclFlags; 
      bool indexContents = bsp.indexContents; 
      int serverBackupSpecId = bsp.serverBackupSpecId; 
      int freq = bsp.freq; 
      int retention = bsp.retention; 
      int policyID =DONT KNOW HOW TO GET THIS VALUE; 
      long specChangeTime = 0; 
      long backupTime = 0; 

      dataCommand.CommandText = ("Insert BackupSpec (PolicyID, Path, ServerBackupSpecID, Freq, Retention, InclExclFlags, InclExcl, IndexContents, SpecChangeTime, BackupTime) values (@policyID,@path,@serverBackupSpecId,@freq,@retention,@inclExclFlags,@inclExcl,@indexContents,@specChangeTime,@backupTime)"); 

      dataCommand.Parameters.AddWithValue("@policyID", policyID); 
      dataCommand.Parameters.AddWithValue("@path", path); 
      dataCommand.Parameters.AddWithValue("@serverBackupSpecId", serverBackupSpecId); 
      dataCommand.Parameters.AddWithValue("@freq", freq); 
      dataCommand.Parameters.AddWithValue("@retention", retention); 
      dataCommand.Parameters.AddWithValue("@inclExclFlags", inclExclFlags); 
      dataCommand.Parameters.AddWithValue("@inclExcl", inclExcl); 
      dataCommand.Parameters.AddWithValue("@indexContents", indexContents); 
      dataCommand.Parameters.AddWithValue("@specChangeTime", specChangeTime); 
      dataCommand.Parameters.AddWithValue("@backupTime", backupTime); 


      dataConnection.Open(); 
      dataCommand.ExecuteNonQuery(); 
      dataConnection.Close(); 

     } 

我收到错误带有标记ID ...

能约1分帮助我这个..?

我没有得到插入请帮后创建的最后一个策略ID ... 请帮助

+0

您是否首先创建了一个'INSERT INTO Policies'来创建新的“lastid”值?无法在您的代码中看到.... – 2009-10-12 05:53:53

回答

1

您可以使用SCOPE_IDENTITY@@ IDENTITY

SCOPE_IDENTITY:

strSQL = "INSERT INTO Policies (...) VALUES (@vals....);SELECT SCOPE_IDENTITY()"; 
SQLCommand.CommandText = strSQL; 
IdReturned = SQLCommand.ExecuteScalar(); 

@@ IDENTITY:

strSQL = "INSERT INTO Policies (...) VALUES (@vals....);SELECT @@Identity"; 
SQLCommand.CommandText = strSQL; 
IdReturned = SQLCommand.ExecuteScalar(); 

对于这两个建议阅读本article

+2

不,请使用Scope_identity()代替。 – erikkallen 2009-10-11 22:52:51

+0

这是没有得到执行...你可以告诉我如何把ID值在一个变量..然后我没有任何辫子.. – user175084 2009-10-11 22:56:02

+0

@ erikkallen ---你可以告诉我如何使用Scope_identity()并把值变成一个变量.. ?? – user175084 2009-10-11 22:57:07

7

使用SCOPE_IDENTITY之间的差异:

strSQL = "INSERT INTO Policies (...) VALUES (@vals....);SELECT @result = scope_identity()" 
SQLCommand.CommandText = strSQL; 
SQLCommand.Parameters.Add("@result", SqlDbType.Int); 
SQLCommand.ExecuteScalar(); 
int id = SQLCommand.Parameters["@result"].Value; 
+0

+1,你的回答比我的更好。不知道这个功能 – Amirshk 2009-10-11 23:00:10

+0

这是不是与我的代码上面的工作我已经尝试所有possibe方式...请帮助 – user175084 2009-10-12 02:40:25

0

如果你做了INSERT INTO Policies()调用首先,为了获得lastid,你可以做这样的事情:

int lastId = 0; 
using(SqlConnection Connection = new SqlConnection("(connection string)")) 
{ 
    string queryStatement = 
    "INSERT INTO dbo.Policies(fields) OUTPUT Inserted.LastID VALUES(....)"; 

    using(SqlCommand Command = new SqlCommand(queryStatement, Connection)) 
    { 
    Connection.Open(); 
    lastId = Command.ExecuteScalar(); 
    Connection.Close(); 
    } 
} 

使用OUTPUT .......子句返回新插入的lastId

然后继续并在主要查询中使用该值。

Marc

+0

只是一个问题,最后的ID只会是我输入的最后一个PolicyID或最后插入的所有值。 ..至于它是如何获得政策ID形式它创建..我已经修改我的代码请看看..谢谢 – user175084 2009-10-12 14:10:55

相关问题