Запрос SQL Insert выполняется дважды - PullRequest
1 голос
/ 22 июля 2010

Я использую adapter.InsertCommand для вставки некоторых данных в таблицу.

Единственная проблема заключается в том, что они выполняются дважды, что дает мне двойные записи в БД.Я попытался следовать примеру в документации adapter.InsertCommand и моего собственного кода, но получить тот же результат.

Это мой код:

public class nokernokDAL
{
    SqlConnection connection = new SqlConnection();
    SqlDataAdapter adapter = new SqlDataAdapter();

    public nokernokDAL()
    {
        connection.ConnectionString = EPiServer.Global.EPConfig["EPsConnection"].ToString();
        connection.Open();
    }

    public void addNewComment(int userID, int pageID, string title, string comment)
    {
        string query = "INSERT INTO dbo.nokernok_kommentarer (userID, pageID, commentTitle, comment) " +
                       "VALUES ("+ userID +", "+ pageID +", '"+ title +"', '"+ comment +"')";

        adapter.InsertCommand = new SqlCommand(query, connection);
        adapter.InsertCommand.ExecuteNonQuery();

    }
}

Любые предложения о том, как яможно ли этого избежать?

ОБНОВЛЕНИЕ

Прямо после некоторой отладки я обнаружил, что моя функция newWallComplaint_Click была запущена дважды.Это произошло потому, что у меня был следующий код:

    protected void Page_Load(object sender, EventArgs e)
    {
            btnNewWallComplaint.Click += new EventHandler(this.newWallComplaint_Click);
    }

Не проверяя PostBack, эта функция также выполняет мою функцию после отправки.Поэтому, чтобы избежать запуска моей функции дважды, я добавил проверку PostBack.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            btnNewWallComplaint.Click += new EventHandler(this.newWallComplaint_Click);
        }

    }

Теперь мой запрос не запускается дважды.

Ответы [ 3 ]

2 голосов
/ 22 июля 2010

Я не вижу в вашем коде ничего, что могло бы выполнить его дважды.Я бы предположил, что он вызывается дважды.Установите точку останова на addNewComment и, если она вызывается дважды, посмотрите на трассировки стека, чтобы увидеть, откуда она вызывается в обоих случаях.

Возможно, у вас есть событие, которое вызывается, например, дважды.Это может произойти в ASP.NET, если вы оба включили автоматическое связывание событий и явным образом связали событие.

Кстати, вам определенно следует использовать параметризованные запросы без конкатенации строк.Я предполагаю, что комментарий предоставлен пользователем?В этом случае вы настраиваете себя для атаки с использованием SQL-инъекции с помощью показанного вами кода.

1 голос
/ 16 мая 2011

Я обнаружил, что у меня есть и набор данных, и набор данных, но мне нужен был только набор данных ...

из-за того, что они выполнялись рядом друг с другом в одной команде, был создан дубликат ...

убедитесь, что вы используете все в команде, и вы понимаете, что делает каждый из них, даже если вы проснулись в течение 2 дней, как я был ...

            DataSet dataset = new DataSet();

            data.Fill(dataset, "data");

            // Populate a new data table and bind it to the BindingSource.
            DataTable datatable = new DataTable();
            data.Fill(datatable);

как видите, у меня было два источника, заполняющих один MySqlDataAdapter ...

            //removing the following two lines fixed my duplicates issue...
            //DataSet dataset = new DataSet();
            //data.Fill(dataset, "data");

            // Populate a new data table and bind it to the BindingSource.
            DataTable datatable = new DataTable();
            data.Fill(datatable);

надеюсь, это кому-нибудь поможет ...

0 голосов
/ 22 июля 2010

Вам действительно нужен DataAdapter для этого?Может быть, вы можете попробовать это.

 public class nokernokDAL
 {
     string connectionString;

     public nokernokDAL()
     {
         ConnectionString = EPiServer.Global.EPConfig["EPsConnection"].ToString();
     }

     public void addNewComment(int userID, int pageID, string title, string comment)
     {
         string query = "INSERT INTO dbo.nokernok_kommentarer (userID, pageID, commentTitle, comment) " +
                        "VALUES ("+ userID +", "+ pageID +", '"+ title +"', '"+ comment +"')";

         using (SqlConnection conn = new SqlConnection(_connString))
         {
             SqlCommand cmd = conn.CreateCommand();
             cmd.CommandText = Query;
             conn.Open();
             cmd.ExecuteNonQuery();
         }
     }
 }
...