SELECT @@ IDENTITY给出Specified Cast无效?

时间:2015-07-13 20:28:22

标签: c# guid

希望有人可以帮助解决这个问题

我试图将一行数据插入表[问题]然后立即从问题的ID列中获取Guid,这样它就可以插入到另一个表中的Actions中,在两者之间创建一个链接。关系是[问题]一对多[行动]。

当我运行此代码时,它会导致Specified Cast无效错误: Guid lastID =(Guid)sel.ExecuteScalar();

lastID是我想要分配最后创建的Guid的变量,因此可以将其传递到表操作的另一个表INSERT。

如果有人能提供帮助那就太棒了!感谢

我正在使用C#2010 Express

//This is declared at the top of the form
public Guid lastID;

        private void pbSaveIssue_Click(object sender, EventArgs e)
        {
        SqlCeConnection ArcBaseConn = new SqlCeConnection(@"Data Source=|DataDirectory|\ArcBase.sdf");

        try
        {
            string cmdIssueSubmit = "INSERT INTO Issues (Type,Description,Dateraised,Site,Reportedby,Status) VALUES (@Type,@Description,@Dateraised,@Site,@Reportedby,@Status)";
            string TypeSubmit = cbIssueType.Text;
            string DescriptionSubmit = rtbDescription.Text;
            string SiteSubmit = cbIssueSite.Text;
            string ReportedbySubmit = cbReportedBy.Text;
            string DateraisedSubmit = dtpDateRaised.Text;

            SqlCeCommand sel = new SqlCeCommand();
            sel.Connection = ArcBaseConn;
            sel.CommandType = CommandType.Text;
            sel.CommandText = cmdIssueSubmit;
            sel.Parameters.AddWithValue("@Type", TypeSubmit);
            sel.Parameters.AddWithValue("@Description", DescriptionSubmit);
            sel.Parameters.AddWithValue("@Dateraised", DateraisedSubmit);
            sel.Parameters.AddWithValue("@Site", SiteSubmit);
            sel.Parameters.AddWithValue("@Reportedby", ReportedbySubmit);
            sel.Parameters.AddWithValue("@Status", lbStatus.Text);

            ArcBaseConn.Open();
            sel.ExecuteNonQuery();


            //Here is the problem

            // Grab the last Unique ID for the Issue just entered and assign to a variable so that it can be entered with the Actions below.
            string cmdGetlastID = "SELECT @@IDENTITY";
            sel.CommandText=cmdGetlastID;

            Guid lastID = (Guid)sel.ExecuteScalar();
            ArcBaseConn.Close();
        }
        catch (SqlCeException ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            Application.ExitThread();
        }

1 个答案:

答案 0 :(得分:0)

假设您插入的表已定义了标识列,

  • 标识列必须是整数类型(tinyintsmallintintbigint),而不是Guid,因此转换为{{1}将无法正常工作(正如您所发现的那样)。
  • 您可能希望使用Guid代替@@SCOPE_IDENTITY,以免发现种族条件造成的痛苦。

从代码的外观来看,你不是这样做的,而是......

如果您尝试获取定义为@@IDENTITY的列的值(并且这样做,以便您没有竞争条件),则需要执行以下操作:

uniqueid

然后使用declare @my_guid uniqueid = newid() INSERT Issues ( Type , Description , Dateraised , Site , Reportedby , Status , Unique_Guid_Column ) VALUES ( @Type , @Description , @Dateraised , @Site , @Reportedby , @Status , @my_guid ) select case @@ERROR when 0 then @myguid else null end 执行该操作。