C# 获取最近的ID并将其插入到ASP.NET中的另一个表中

C# 获取最近的ID并将其插入到ASP.NET中的另一个表中,c#,asp.net,sql-server,C#,Asp.net,Sql Server,请帮助-我正在创建一个简单的注册表,我正在尝试获取用户ID,并将用户表中的用户ID插入员工表中。我在线路上出错了 newID = (int)cmd.ExecuteScalar(); 我的User表有一个主键UserID,Employee表有一列UserID作为外键 提前谢谢你 这是我的注册表 // instantiate using (SqlConnection con = new SqlConnection(Helper.GetCon())) { int newID;

请帮助-我正在创建一个简单的注册表,我正在尝试获取
用户ID
,并将
用户
表中的
用户ID
插入
员工
表中。我在线路上出错了

newID = (int)cmd.ExecuteScalar();
我的
User
表有一个主键
UserID
Employee
表有一列
UserID
作为外键

提前谢谢你

这是我的注册表

 // instantiate 
 using (SqlConnection con = new SqlConnection(Helper.GetCon()))
 {
     int newID;

     string query = @"INSERT INTO Users VALUES (@TypeID, @EmployeeId, @Username, @Password, @SecurityQuestion1, @SecurityAnswer1, @SecurityQuestion2, @SecurityAnswer2, @DateModified);SELECT CAST(scope_identity() AS int";

     con.Open();

     using (SqlCommand cmd = new SqlCommand(query, con))
     {
         cmd.Parameters.AddWithValue("@TypeID", ddlUserTypes.SelectedValue);
         cmd.Parameters.AddWithValue("@Username", txtUsername.Text);
         cmd.Parameters.AddWithValue("@Password", Helper.CreateSHAHash(txtPW.Text));
         cmd.Parameters.AddWithValue("@SecurityQuestion1", ddlSec1.SelectedValue);
         cmd.Parameters.AddWithValue("@SecurityAnswer1", txtSecAns1.Text);
         cmd.Parameters.AddWithValue("@SecurityQuestion2", ddlSec2.SelectedValue);
         cmd.Parameters.AddWithValue("@SecurityAnswer2", txtSecAns2.Text);
         cmd.Parameters.AddWithValue("@DateModified", DateTime.Now);

         cmd.ExecuteNonQuery();

         newID = (int)cmd.ExecuteScalar();
         con.Close();
     }

     string query2 = @"INSERT INTO Employees VALUES (@FirstName, @MiddleName, @LastName, @EmployeeNumber, @Gender, @Birthdate, @Birthplace, @Nationality, @CivilStatus, @PermamentAddress, @PresentAddress, @ContactNumber, @Email, @Position, @Department, @Designation, @DateHired, @EmploymentStatus, @TIN, @SSS, @HDMF, @PHIC, @Supervisor, @Remarks, @Photo, @Attachments, @DateModified)";

     using (SqlCommand cmd = new SqlCommand(query2, con))
     {
         cmd.Parameters.AddWithValue("@FirstName", txtFN.Text);
         cmd.Parameters.AddWithValue("@MiddleName", txtMD.Text);
         cmd.Parameters.AddWithValue("@LastName", txtLN.Text);
         cmd.Parameters.AddWithValue("@EmployeeNumber", txtEmpNo.Text);
         cmd.Parameters.AddWithValue("@Gender", ddlGender.SelectedValue);
         cmd.Parameters.AddWithValue("@Birthdate", txtbdate.Text);
         cmd.Parameters.AddWithValue("@Birthplace", txtBP.Text);
         cmd.Parameters.AddWithValue("@Nationality", txtNat.Text);
         cmd.Parameters.AddWithValue("@CivilStatus", ddlCIv.SelectedValue);
         cmd.Parameters.AddWithValue("@PermamentAddress", txtPermAdd.Text);
         cmd.Parameters.AddWithValue("@PresentAddress", txtPreAdd.Text);
         cmd.Parameters.AddWithValue("@ContactNumber", txtContactNo.Text);
         cmd.Parameters.AddWithValue("@Email", txtEmail.Text);
         cmd.Parameters.AddWithValue("@Position", txtPosi.Text);
         cmd.Parameters.AddWithValue("@Department", txtDept.Text);
         cmd.Parameters.AddWithValue("@Designation", txtDesig.Text);
         cmd.Parameters.AddWithValue("@DateHired", txtdateh.Text);
         cmd.Parameters.AddWithValue("@EmploymentStatus", txtEmpl.Text);
         cmd.Parameters.AddWithValue("@TIN", txtTin.Text);
         cmd.Parameters.AddWithValue("@SSS", txtSSS.Text);
         cmd.Parameters.AddWithValue("@HDMF", txtPhilH.Text);
         cmd.Parameters.AddWithValue("@PHIC", txtPag.Text);
         cmd.Parameters.AddWithValue("@Supervisor", txtSuper.Text);
         cmd.Parameters.AddWithValue("@Remarks", txtRemarks.Text);

         string fileName = DateTime.Now.ToString("yyyyMMddHHmmss-") + fuImage.FileName;
         cmd.Parameters.AddWithValue("@Photo", fileName);

         fuImage.SaveAs(Server.MapPath("~/EmployeeData/Images/" + fileName));
         string attachments = DateTime.Now.ToString("yyyyMMddHHmmss-") + fuAttach.FileName;
         cmd.Parameters.AddWithValue("@Attachments", attachments);

         fuAttach.SaveAs(Server.MapPath("~/EmployeeData/Attachments/" + attachments));
         cmd.Parameters.AddWithValue("@DateModified", DateTime.Now);

         cmd.ExecuteNonQuery();

         con.Close();
    }
}

我不确定这段代码是如何在您所说的那一行出错的,因为我预计会在前面提到的那一行出错。这里有各种各样的提示,太长了,无法评论。我希望他们能解决问题,如果他们没有,那么第一点将帮助你找到答案

  • 在请求有关错误的帮助时,请张贴您收到的错误。这是诊断错误最重要的一点
  • 错误前的行是
    cmd.ExecuteNonQuery()
    ,它将执行命令,插入记录。然后执行
    cmd.ExecuteScalar()
    ,它将再次执行该命令,插入另一条记录。删除
    cmd.ExecuteNonQuery()
    ,因为您需要从
    ExecuteScalar
    返回标识值
  • 我不确定
    cmd.ExecuteNonQuery()
    是如何工作的(它必须这样做,除非您在下一行错误地告诉我们它崩溃了),因为查询中有一个输入错误,在
    选择CAST(scope\u identity()AS int
    结尾缺少右括号
  • 求你了
  • 无需
    关闭
    连接,因为它位于
    使用
    块中。当它退出该块时,隐式
    处理
    将调用
    关闭
  • 考虑添加一个事务。您正在执行两个单独的插入。如果第二个插入失败,您将保留数据库中的第一条记录。如果在两个命令周围使用事务,则它们要么都进入,要么都不进入
  • 您正在传递
    @DateModified
    DateTime。现在
    ,这是一个“本地”时间(请查看
    种类
    属性)。从SQL读回该值时,除非调用SpecifyKind,否则该值不会是本地时间,从而导致差异。始终以UTC格式存储和读取该值更安全(在此处使用
    DateTime.UtcNow
    ,并在读取时指定kind UTC)或切换到使用DateTimeOffset

  • 发布错误消息。尝试删除第一个命令中的cmd.ExecuteNonQuery();执行第一个sql命令后删除
    con.Close();
    。无需关闭连接,因为我看不到您在执行第二个sql命令之前打开连接。
    选择CAST(scope_identity()由于int
    =>缺少一个括号,这是语法错误。请尝试
    选择强制转换(SCOPE_IDENTITY()AS int)
    。您最好在或中进行这一复合查询