【问题标题】:How do I convert the result of ExecuteScalar() to int?如何将 ExecuteScalar() 的结果转换为 int?
【发布时间】:2017-11-25 20:24:01
【问题描述】:

我实际上是在尝试使用ExecuteScalar() 在插入后获取主键。因为它返回插入后第一行的第一列。但我得到了 0。我不知道为什么会这样。请帮帮我。

query = "Insert into Admissions(Admission_date, Student_name, Father_name, Mother_name, DOB, Gender, Address, State, City, Pincode, Admission_for, Previous_school, Fees) values ('" + txtAdmDate.Text + "','" + txtStudentName.Text + "','" + txtFatherName.Text + "','" + txtMotherName.Text + "','" + dob + "','" + gender + "','" + txtAddress.Text + "','" + txtState.Text + "','" + txtCity.Text + "','" + txtPincode.Text + "','" + cmbClass.Text + "','" + txtPreviousSchool.Text + "','" + txtFees.Text + "')";

cmd = new SqlCommand(query, con);
con.Open();

int admid = Convert.ToInt32(cmd.ExecuteScalar());

【问题讨论】:

标签: c#


【解决方案1】:

您的代码/问题存在一些问题。

  1. 您的代码容易受到SQL Injection 攻击。您需要参数化查询

  2. INSERT 语句的设计并不意味着返回任何内容,如果您想返回刚刚插入的内容的主键,您需要在查询中添加一个输出参数(更好的是,一个存储过程)。

  3. “在 sql insert c# 上返回主键”的快速 google 会为您提供大量结果。几乎逐字询问您的问题here。事实上,我的回答基本上是最佳答案代码(为您使用而修改)。

这是我的答案

//Create an Admission class that represents your data
public static int Save(Admission admission)
{
    var conn = DbConnect.Connection();
    const string sqlString = "Admissions(Admission_date, Student_name, Father_name, Mother_name, DOB, Gender, " +
        "Address,   State, City, Pincode, Admission_for, Previous_school, Fees) values (@AdmissionDate, @StudentName, " + 
        "@FatherName, @MotherName, @DOB, @Gender, @Address, @State, @City, @Pincode, @AdmissionFor, @PreviousSchool, " +
        "@Fees) SELECT SCOPE_IDENTITY()";

    using (conn)
    {
        using (var cmd = new SqlCommand(sqlString, conn))
        {
            cmd.Parameters.AddWithValue("@AdmissionDate", admission.AdmissionDate);
            cmd.Parameters.AddWithValue("@StudentName", admission.StudentName);
            cmd.Parameters.AddWithValue("@FatherName", admission.FatherName);
            cmd.Parameters.AddWithValue("@MotherName", admission.MotherName);
            cmd.Parameters.AddWithValue("@DOB", admission.DOB);
            cmd.Parameters.AddWithValue("@Gender", admission.Gender);
            cmd.Parameters.AddWithValue("@Address", admission.Address);
            cmd.Parameters.AddWithValue("@State", admission.State);
            cmd.Parameters.AddWithValue("@City", admission.City);
            cmd.Parameters.AddWithValue("@Pincode", admission.Pincode);
            cmd.Parameters.AddWithValue("@AdmissionFor", admission.AdmissionFor);
            cmd.Parameters.AddWithValue("@PreviousSchool", admission.PreviousSchool);
            cmd.Parameters.AddWithValue("@Fees", admission.Fees);

            cmd.CommandType = CommandType.Text;
            conn.Open();
            return (int)(decimal)cmd.ExecuteScalar();
        }
    }
}

【讨论】:

    【解决方案2】:

    尝试在您的 SQL 命令中使用 OUTPUT 子句以返回有关您的命令的信息。

    【讨论】:

    • ExecuteScalar() 执行查询并返回查询返回的结果集中第一行的第一列。为什么我得到 0?
    • @SATYA 尝试在 SQL 中执行查询。您希望返回什么?
    【解决方案3】:
    public int NewProperty(PropertyData propertyData)
        {
            using (SqlConnection con = new SqlConnection(CS))
            {
                SqlCommand cmd = new SqlCommand("InsertUpdateProperty", con);
    
                cmd.CommandType = CommandType.StoredProcedure;
    
                cmd.Parameters.AddWithValue("@id", propertyData.ID);
                cmd.Parameters.AddWithValue("@ListPropertyFor", propertyData.ListPropertyFor);
                cmd.Parameters.AddWithValue("@PropertyTypeId", propertyData.PropertyTypeId);
                cmd.Parameters.AddWithValue("@PropertyLoction", propertyData.PropertyLocation);
                cmd.Parameters.AddWithValue("@Locality", propertyData.Locality);
                cmd.Parameters.AddWithValue("@ProjectName", propertyData.ProjectName);
                cmd.Parameters.AddWithValue("@PropertyDescription", propertyData.PropertyDescription);
                cmd.Parameters.AddWithValue("@SuperBulidupArea", propertyData.SuperBulidupArea);
                cmd.Parameters.AddWithValue("@SuperBulidupId", propertyData.SuperBulidupAreaId);
                cmd.Parameters.AddWithValue("@BulidupArea", propertyData.BulidupArea);
                cmd.Parameters.AddWithValue("@BulidupAreaId", propertyData.BulidupAreaId);
                cmd.Parameters.AddWithValue("@CarpetArea", propertyData.CarpetArea);
                cmd.Parameters.AddWithValue("@CarpetAreaId", propertyData.CarpetAreaId);
                cmd.Parameters.AddWithValue("@Bathrooms", propertyData.Bathrooms);
                cmd.Parameters.AddWithValue("@Bedrooms", propertyData.Bedrooms);
                cmd.Parameters.AddWithValue("@Balconies", propertyData.Balconies);
                cmd.Parameters.AddWithValue("@FurnishedId", propertyData.FurnishedId);
                cmd.Parameters.AddWithValue("@TotalFloors", propertyData.TotalFloors);
                cmd.Parameters.AddWithValue("@PropertyOnFloors", propertyData.PropertyOnFloor);
                cmd.Parameters.AddWithValue("@Parking", propertyData.Parking);
                cmd.Parameters.AddWithValue("@AvalibiltyId", propertyData.AvalibiltyId);
                cmd.Parameters.AddWithValue("@AgeOfProperty", propertyData.AgeOfProperty);
                cmd.Parameters.AddWithValue("@OwnerShip", propertyData.OwenerShip);
                cmd.Parameters.AddWithValue("@Price", propertyData.Price);
                cmd.Parameters.AddWithValue("@IsActive", propertyData.IsActive);
    
                con.Open();
    
                int i = Convert.ToInt32(cmd.ExecuteScalar()); 
    
                con.Close();
                return i;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多