简体   繁体   English

C#未将数据保存到SQL Server

[英]C# is not saving data to SQL Server

When I replaced my concatenated insert with parameters, INSERT stopped saving to database. 当我用参数替换串联插入时, INSERT停止保存到数据库。

I use: 我用:

Int32 rowsAffected = cmd.ExecuteNonQuery();                          
var totalRecords = (new SqlCommand("SELECT COUNT(*) FROM dbo.EmpInfo", cmd.Connection)).ExecuteNonQuery();

MessageBox.Show("RowsAffected: " + rowsAffected.ToString());
MessageBox.Show("Total Records: " + totalRecords);

but then, the return value is 1 for RowsAffected , and -1 for totalRecords . 但随后,返回值是1 RowsAffected ,和-1 totalRecords

if (Status == RegistrationStatus.r_OK)
{
    String query = "INSERT INTO dbo.EmpInfo(EmpYear, EmpStatus, LName, FName, JobTitle, EmpPay, EmpDoB, EmpSex, EmpAddr, EmpCity, EmpState, EmpZIP, EmpCountry, EmpEAddr, EmpTelNo, EmpMobileNo, EmpDate) VALUES (@EmpYear, @EmpStatus, @LName, @FName, @JobTitle, @EmpPay, @EmpDoB, @EmpSex, @EmpAddr, @EmpCity, @EmpState, @EmpZIP, @EmpCountry, @EmpEAddr, @EmpTelNo, @EmpMobileNo, getdate())";

    using (SqlConnection conn = new SqlConnection("Data Source=RB-DESKTOP;Initial Catalog=TimeDB;Persist Security Info=True;User ID=sa;Password=bautista7"))
    {
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            using (SqlTransaction transaction = conn.BeginTransaction())
            {
                cmd.Connection = conn;
                cmd.Transaction = transaction;

                ParameterName = "@EmpYear", Value = EmpYear });
                cmd.Parameters.AddWithValue("@EmpYear", EmpYear);
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpStatus", Value = "Active" });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@LName", Value =   regLname_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@FName", Value =   regFname_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@JobTitle", Value = "NULL" });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpPay", Value =   PayType_cb.SelectedItem.ToString()});
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpDoB", Value =   regDob_dtp.Value.Date  });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpSex", Value =   gender });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpAddr", Value =   regAddr_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpCity", Value =   regCity_text.Text  });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpState", Value =   regState_text.Text  });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpZIP", Value =  regZip_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpCountry", Value = regCountry_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpEAddr", Value = regEmail_text.Text  });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpTelNo", Value =   regTel_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpMobileNo", Value =   regMob_text.Text});

                cmd.ExecuteNonQuery();
                transaction.Commit();

SqlCommand.ExecuteNonQuery返回受影响的行数,您需要的是SqlCommand.ExecuteScalar ,它将执行查询并返回第一行的第一列

You're not using the ExecuteNonQuery in the right place and you need to use ExecuteScalar in the other place. 您没有在正确的地方使用ExecuteNonQuery ,而您需要在其他地方使用ExecuteScalar Also rowsAffected will always be 1 since you're inserting just one record. 另外,由于您仅插入一条记录,所以rowsAffected始终为1。

if (Status == RegistrationStatus.r_OK)
{
    String query = "INSERT INTO dbo.EmpInfo(EmpYear,EmpStatus,LName,FName,JobTitle,EmpPay,EmpDoB,EmpSex,EmpAddr,EmpCity,EmpState,EmpZIP,EmpCountry,EmpEAddr,EmpTelNo,EmpMobileNo,EmpDate) values(@EmpYear,@EmpStatus,@LName,@FName,@JobTitle,@EmpPay,@EmpDoB,@EmpSex,@EmpAddr,@EmpCity,@EmpState,@EmpZIP,@EmpCountry,@EmpEAddr,@EmpTelNo,@EmpMobileNo,getdate())";
    using (SqlConnection conn = new SqlConnection("Data Source=RB-DESKTOP;Initial Catalog=TimeDB;Persist Security Info=True;User ID=sa;Password=bautista7"))
    {
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            using (SqlTransaction transaction = conn.BeginTransaction())
            {
                cmd.Connection = conn;
                cmd.Transaction = transaction;
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpYear", Value = EmpYear });
                cmd.Parameters.AddWithValue("@EmpYear", EmpYear);
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpStatus", Value = "Active" });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@LName", Value =   regLname_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@FName", Value =   regFname_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@JobTitle", Value = "NULL" });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpPay", Value =   PayType_cb.SelectedItem.ToString()});
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpDoB", Value =   regDob_dtp.Value.Date  });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpSex", Value =   gender });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpAddr", Value =   regAddr_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpCity", Value =   regCity_text.Text  });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpState", Value =   regState_text.Text  });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpZIP", Value =  regZip_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpCountry", Value = regCountry_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpEAddr", Value = regEmail_text.Text  });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpTelNo", Value =   regTel_text.Text });
                cmd.Parameters.Add(new SqlParameter() { ParameterName = "@EmpMobileNo", Value =   regMob_text.Text});

                Int32 rowsAffected = cmd.ExecuteNonQuery();
                transaction.Commit();                        
                var totalRecords = (new SqlCommand("SELECT COUNT(*) FROM dbo.EmpInfo", cmd.Connection)).ExecuteScalar();
                MessageBox.Show("RowsAffected: " + rowsAffected.ToString());
                MessageBox.Show("Total Records: " + totalRecords);
           }
        }
   }
}

You could always cut n paste your sql into its own file and let QueryFirst generate all the parameter code. 您总是可以剪切n将您的sql粘贴到它自己的文件中,然后让QueryFirst生成所有参数代码。 Your sql syntax will be validated, you won't have to worry about the types of parameters. 您的sql语法将被验证,您不必担心参数的类型。 Your maintenance will be simplified, and if ever your db schema changes, you'll see straight away if your sql is broken. 您的维护将得到简化,并且如果您的数据库架构发生了更改,那么如果您的sql损坏了,您将立即看到。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM