Несколько операторов вставки в одной команде - PullRequest
0 голосов
/ 25 мая 2018

Я боролся с моим кодом.Когда я пытаюсь выполнить оператор вставки и хранимую процедуру сразу, значение текстового поля для хранимой процедуры становится пустым при сохранении в базе данных.Но когда я выполняю только хранимую процедуру, значение текстового поля содержит данные и сохраняется в базе данных.

Что я пропустил?Вот мой код:

private void recorduserlog()
        {           
            sqlcon.Open();
            cmd = new SqlCommand();
            cmd.CommandText = "userlogs";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = sqlcon;
            cmd.Parameters.Add(new SqlParameter("@id", Main.userid));
            cmd.Parameters.Add(new SqlParameter("@fullname", Main.passname));
            cmd.Parameters.Add(new SqlParameter("@activitydetails", txtfullname.Text));
            cmd.Parameters.Add(new SqlParameter("@userform", 1));
            cmd.Parameters.Add(new SqlParameter("@datelog", DateTime.Now.ToString("M/d/yyyy hh:mm:ss")));
            cmd.ExecuteNonQuery();
            sqlcon.Close();
        }

private void btnsave_Click(object sender, EventArgs e)
    {
       if (txtusername.Text != "" && txtaccesscode.Text != "" && txtfullname.Text != "" && cmbaccessleve.Text != "")  //validating the fields whether the fields or empty or not  
            {
                if (txtaccesscode.Text.ToString().Trim().ToLower() == txtconfirm.Text.ToString().Trim().ToLower()) //validating Password textbox and confirm password textbox is match or unmatch    
                {
                    string UserName = txtusername.Text;
                    string Password = adduser.Encrypt(txtaccesscode.Text.ToString());   // Passing the Password to Encrypt method and the method will return encrypted string and stored in Password variable.  
                    SqlConnection conn = new SqlConnection(Properties.Settings.Default.myconnectionstring);
                    sqlcon.Open();
                    SqlCommand cmd2 = new SqlCommand("insert into endusers(usern,passw,fullname,accesslevel,stats)values('" + UserName + "','" + Password + "','" + txtfullname.Text + "','" + ssfapclass + "',1)", conn);
                    cmd2.ExecuteNonQuery();
                    sqlcon.Close();
                    sqlcon.Dispose();
                    MessageBox.Show("Successfully Created a User Account for '" + txtfullname.Text + "'.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.Close();
                    recorduserlog();        
                }
                else
                {
                    MessageBox.Show("Access Code and Confirmation Code doesn't match!.. Please Check..", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);  //showing the error message if password and confirm password doesn't match  
                }
            }
            else
            {
                MessageBox.Show("Please fill all the fields!..", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);  //showing the error message if any fields is empty  
            }
        }
    }

Еще одна вещь: два SQL-запроса используют одно и то же значение TEXTBOX в качестве параметров.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Поскольку вы попросили дать некоторые пояснения о том, как обрабатывать SqlConnection, я постараюсь разбить его для вас.

SqlConnection использует неуправляемые ресурсы (открытые сокетные соединения с сервером базы данных).Сборщик мусора освобождает только память, а не неуправляемые ресурсы.Поэтому, когда сборщик мусора удаляет SqlConnection из памяти, он может оставить оборванные соединения.Со временем это может привести к исчерпанию количества подключений к серверу базы данных и затруднить диагностику проблем.

В .NET у нас есть шаблон для работы с неуправляемыми ресурсами.Объекты, которые имеют дело с неуправляемыми ресурсами, реализуют интерфейс IDisposable .С любыми IDisposable объектами следует обращаться осторожно. В большинстве случаев (есть несколько исключений) объект IDisposable должен быть удален в блоке finally или создан в операторе using.Любой из этих шаблонов обеспечит правильную утилизацию неуправляемых ресурсов.

SqlConnection реализует IDisposable (поскольку он наследуется от System.Data.Common.DbConnection).Поскольку хорошая идея иметь выделенный класс для обработки взаимодействия с базой данных, это часто оставляет нам код, который выглядит следующим образом:

public class SqlServerDatabaseRepository
{
    readonly string _connectionString;

    public SqlServerDatabaseRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public void ExecuteUserLogs(string userId, /* additional parameters */)
    {
        using(var connection = new SqlConnection(_connectionString)
        {
            //use your connection here to execute your command
        }   //here the connection falls out of scope so the using statement will handle disposing it for you
    }
}
0 голосов
/ 25 мая 2018

Я думаю, что это закроет приложение

this.Close();

Как указано в комментарии, вы не используете

SqlConnection conn = new SqlConnection(Properties.Settings.Default.myconnectionstring);

Вы должны использовать using blocks

...