Кто бросает (и ловит), этот MySQL Exception?

я использую Python с MySQL и Django. Я продолжаю видеть эту ошибку, и я не могу выяснить, где исключение выдается:

Exception _mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now") in <bound method Cursor.__del__ of <MySQLdb.cursors.Cursor object at 0x20108150>> ignored

Я имею, многие "пробуют" и блоки "исключения" в моем коде - если бы исключение произошло в одном из тех, то я видел бы свои собственные сообщения отладки. Вышеупомянутое Исключение, очевидно, поймано где-нибудь, так как моя программа не прерывается, когда Исключение выдается.

Я являюсь очень озадаченным, кто-то может выручить меня?

8
задан Mu Mind 24 August 2012 в 10:58
поделиться

3 ответа

Аннотированный тэг фактически является объектом тэга. Имеет автора, описание, метку времени и указывает на фиксацию.

Облегченный тэг указывает на фиксацию и не содержит никакой другой информации. У него больше общего с ветвлением, чем с маркированием.

-121--2418398-

Для того, чтобы любой человек, исследующий этот вопрос в будущем, вот решение, которое я в конечном итоге реализовал. Это основано на ответе Джона Боуэна, который я выбрал как лучшее решение проблемы.

Сначала я создал стиль для прозрачного списка, содержащего переключатели, как предметы. Затем я создал кнопки для перехода в поле списка - мои кнопки исправлены, а не считываются в приложение как данные, поэтому я жестко закодировал их в разметку.

Я использую перечисление ListButtons в модели представления, чтобы представить кнопки в списке, и я использую свойство Тэгов каждой кнопки, чтобы передать последовательности значение перечисления для этой кнопки. Свойство ListBox.SelectedStartPath позволяет указать свойство Тэгов в качестве источника для выбранного значения, которое связывается с моделью представления с помощью свойства SelectedValue . Я думал, что мне понадобится конвертер значений для преобразования между последовательностью и его значением перечисления, но встроенные конвертеры WPF справились с преобразованием без проблем.

Вот полная разметка для Window1.xaml :

<Window x:Class="RadioButtonMvvmDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">

    <!-- Resources -->
    <Window.Resources>
        <Style x:Key="RadioButtonList" TargetType="{x:Type ListBox}">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="ItemContainerStyle">
                <Setter.Value>
                    <Style TargetType="{x:Type ListBoxItem}" >
                        <Setter Property="Margin" Value="5" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                    <Border BorderThickness="0" Background="Transparent">
                                        <RadioButton 
                                            Focusable="False"
                                            IsHitTestVisible="False"
                                            IsChecked="{TemplateBinding IsSelected}">
                                            <ContentPresenter />
                                        </RadioButton>
                                    </Border>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Setter.Value>
            </Setter>
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBox}">
                        <Border BorderThickness="0" Padding="0" BorderBrush="Transparent" Background="Transparent" Name="Bd" SnapsToDevicePixels="True">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <!-- Layout -->
    <Grid>
        <!-- Note that we use SelectedValue, instead of SelectedItem. This allows us 
        to specify the property to take the value from, using SelectedValuePath. -->

        <ListBox Style="{StaticResource RadioButtonList}" SelectedValuePath="Tag" SelectedValue="{Binding Path=SelectedButton}">
            <ListBoxItem Tag="ButtonA">Button A</ListBoxItem>
            <ListBoxItem Tag="ButtonB">Button B</ListBoxItem>
        </ListBox>
    </Grid>
</Window>

Модель представления имеет единственное свойство SelectedButton, которое использует перечисление ListButtons для отображения выбранной кнопки. Свойство вызывает событие в базовом классе, который я использую для моделей просмотра, которое вызывает событие PropertyChanged :

namespace RadioButtonMvvmDemo
{
    public enum ListButtons {ButtonA, ButtonB}

    public class Window1ViewModel : ViewModelBase
    {
        private ListButtons p_SelectedButton;

        public Window1ViewModel()
        {
            SelectedButton = ListButtons.ButtonB;
        }

        /// <summary>
        /// The button selected by the user.
        /// </summary>
        public ListButtons SelectedButton
        {
            get { return p_SelectedButton; }

            set
            {
                p_SelectedButton = value;
                base.RaisePropertyChangedEvent("SelectedButton");
            }
        }

    }
} 

В производственном приложении установщик SelectedButton вызовет метод класса обслуживания, который выполнит действие, требуемое при выборе кнопки.

И чтобы быть полным, вот базовый класс:

using System.ComponentModel;

namespace RadioButtonMvvmDemo
{
    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Protected Methods

        /// <summary>
        /// Raises the PropertyChanged event.
        /// </summary>
        /// <param name="propertyName">The name of the changed property.</param>
        protected void RaisePropertyChangedEvent(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
                PropertyChanged(this, e);
            }
        }

        #endregion
    }
}

Надежда, которая помогает!

-121--962293-

Ошибка Python.

См. http://eric.lubow.org/2009/python/pythons-mysqldb-2014-error-commands-out-of-sync/

Похоже, возникла проблема с запросом MySQLdb.

3
ответ дан 5 December 2019 в 11:24
поделиться

Я считаю, что эта ошибка может возникнуть, если вы используете одно и то же соединение / курсор из нескольких потоков. Однако я не думаю, что создатели Django совершили такую ​​ошибку, но если вы делаете что-то самостоятельно, это легко может произойти.

2
ответ дан 5 December 2019 в 11:24
поделиться

Еще в 1997 году я делал это на TI-83 калькуляторах, когда учился в школе и не имел доступа к канальному кабелю.

Обычно в это время вы просто пишете программу сборки, используете TASM для ее построения, а затем переносите ее в калькулятор по кабелю ссылки. Но если мне было скучно и хотелось собрать что-то маленькое вместе, я запомнил достаточно байтовых инструкций, чтобы иметь возможность вводить их для определенных вещей.

Побочное примечание Конечно, это было интересно, если в программе была ошибка, потому что она могла легко повредить всю оперативную память калькулятора. Таким образом, вам придется удерживать кнопку ON и/или удалить батареи AAA и надеяться, что этого будет достаточно, чтобы восстановить calc (sans любые программы, которые были в памяти). В противном случае для жесткого сброса потребуется отвертка, чтобы открутить специальный резервный аккумулятор. Хорошие времена...

-121--1884483-

Другие ответы, опубликованные до сих пор, сосредоточены на единицах/функциях/производительности/и т.д. тестирование, и все они разумны.

Однако один из ключевых вопросов, который вы должны задать: «Насколько эффективным является мое тестирование?».

На это часто отвечают с помощью тестового покрытия , которые определяют, какие части вашего приложения на самом деле выполняются некоторым набором тестов. Идеальный инструмент проверки покрытия позволяет протестировать приложение любым способом (включая все стандартные ответы выше) и затем сообщить, какая часть и какой процент кода был выполнен. Самое главное, он расскажет вам, какой код вы не использовали . Затем вы можете проверить этот код и принять решение о необходимости дополнительного тестирования или о том, что вам все равно. Если непроверенный код имеет отношение к «полной обработке ошибок диска» и вы считаете, что 1TB диски являются общими, вы можете принять решение игнорировать это. Если непроверенный код является логикой проверки ввода, ведущей к запросам SQL, можно решить, что необходимо протестировать эту логику, чтобы гарантировать отсутствие атак SQL injection.

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

Инструменты тестового покрытия могут быть получены из различных источников. SD предоставляет семейство инструментов тестового покрытия , которые обрабатывают C, C++, Java, C #, PHP и COBOL, все из которых используются для поддержки тестирования веб-сайта различными способами.

-121--1930368-

После печати множества материалов и отладки я выяснил проблему, которую я думаю. Одна из библиотек, которую я использовал, не закрыла соединение или курсор. Но эта проблема появляется, только если я повторяю большое количество данных. Проблема также очень прерывистая, и я до сих пор не знаю, кто выбрасывает исключение «команда вне синхронизации». Но теперь, когда мы закрыли и соединение, и курсор, я больше не вижу ошибок.

2
ответ дан 5 December 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: