Почему мой tableadaptor вынуждает приведение строки в моем столбце даты

У меня есть таблица с датами и различными данными об этой дате.

WKDWKDDATE8 WKDDAYNM    WKDAGENO    WKDDAYNO    WKDDATE6    WEEKNO  WEEKRANGE       AWEEK
2019-05-15  WEDNESDAY   43580       3           AJ0515      384     05/12 - 05/18   NULL
2019-05-16  THURSDAY    43581       4           AJ0516      384     05/12 - 05/18   NULL

а вот как выглядит мой стол

CREATE TABLE [dbo].[WKD](
[WKDDATE8] [date] NOT NULL,
[WKDDAYNM] [varchar](10) NOT NULL,
[WKDAGENO] [int] NULL,
[WKDDAYNO] [int] NULL,
[WKDDATE6] [varchar](6) NOT NULL,
[WEEKNO] [int] NULL,
[WEEKRANGE] [varchar](20) NULL,
[AWEEK] [varchar](1) NULL,

как видите, мое поле WKDDATE8 равно Date. В моем приложении C# я использую tableadaptors для запроса этой таблицы с помощью WKDDATE8 с использованием SELECT * FROM WKD WHERE WKDDATE8 = @WKDDATE8, но по какой-то причине моей таблице требуется строка http://imgur.com/a/cO5FA .

теперь, это где это получает fustrating. Я могу вручную изменить конструктор со строки на дату и время и запустить, он работает нормально, но затем я запускаю его снова и получаю ошибку сборки, потому что запрос требует строку, ОДНАКО, если я позволю ему идти как строка, я получаю очевидно cannot convert from 'System.DateTime' to 'string'.

я совершенно ошеломлен и потерян, почему моя программа хочет строку.

E: это код, который вызывает у меня проблемы. я не писал этот код, он был сгенерирован. менять его бессмысленно, так как он изменится обратно во второй сборке, и я вижу, как он преобразует мой столбец в строку, когда на самом деле этого не должно быть.

        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
    [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Select, false)]
    public virtual CACTUSDataSet.WKDDataTable GetDataByWKD8(string WKDDATE8) {
        this.Adapter.SelectCommand = this.CommandCollection[1];
        if ((WKDDATE8 == null)) {
            throw new global::System.ArgumentNullException("WKDDATE8");
        }
        else {
            this.Adapter.SelectCommand.Parameters[0].Value = ((string)(WKDDATE8));
        }
        CACTUSDataSet.WKDDataTable dataTable = new CACTUSDataSet.WKDDataTable();
        this.Adapter.Fill(dataTable);
        return dataTable;
    }

person Multinerd    schedule 01.08.2016    source источник
comment
Где исходный код?   -  person Drew    schedule 01.08.2016
comment
Убедитесь, что для вашего столбца в TableAdaptor задан тип DateTime. Если вы используете визуальный редактор, просто щелкните имя столбца, и в окне свойств должен появиться параметр типа.   -  person Ben Abraham    schedule 01.08.2016
comment
@BenAbraham установлено как System.DateTime, как и должно быть   -  person Multinerd    schedule 01.08.2016
comment
@drew добавил код, хотя я его не писал   -  person Multinerd    schedule 01.08.2016
comment
Взгляните на свой TableAdapter, в GetDataByWKD8 в параметрах, если тип параметра @WKDDATE8 NVARCHAR или CHAR, измените его на DateTime.   -  person Reza Aghaei    schedule 01.08.2016
comment
@RezaAghaei я установил его на Date, подумал, что я изменил его на DateTime, как вы упомянули, и кажется, что это было причиной. Обрабатывает ли VS Date как строку? как-то странно, если это так. если вам нужна репутация, пожалуйста, сделайте репост в качестве ответа. Спасибо за вашу помощь   -  person Multinerd    schedule 01.08.2016
comment
@Multinord Я проверил это, и кажется, что конструктор набора данных создает строковый аргумент для параметров даты.   -  person Reza Aghaei    schedule 01.08.2016


Ответы (1)


Конструктор набора данных создает строковый аргумент для параметров даты.

Взгляните на свой DataSet для адаптера таблицы и команды GetDataByWKD8. В параметрах проверьте, является ли DbType из @WKDDATE8 строковым типом, например AnsiString, затем измените Dbtype на Date и ProviderType на DateTime, тогда ваша команда заполнения примет ввод типа DateTime.

Выделите запрос в конструкторе и посмотрите на вкладку свойств, чтобы сделать это. Просто нажмите на коллекцию свойств, и вы получите диалоговое окно, в котором для DbType установлено значение AnsiString. Вы найдете DateTime2 в нижней части списка, если он вам нужен.

введите здесь описание изображения

person Reza Aghaei    schedule 01.08.2016
comment
Это не решает проблему дизайнера - я думаю, это недавнее изменение, потому что у меня возникла эта проблема с устаревшими XSD, которые были в порядке. Теперь это происходит со всеми столбцами DateTime2 независимо от того, что я могу сделать вручную. Это раздражает. - person Richard Griffiths; 08.11.2016
comment
Неважно: этот ответ прояснил это - stackoverflow.com/questions/33888920/ - person Richard Griffiths; 08.11.2016
comment
Конечно, вы не должны менять код xml или c #, я также имею в виду использование дизайнера :) - person Reza Aghaei; 08.11.2016
comment
Я согласен - я достаточно взломал XSD, чтобы действительно не рекомендовать его. Я немного добавил к вашему ответу, так как мне нужна была эта помощь, для меня это было неочевидно :). - person Richard Griffiths; 08.11.2016
comment
Ой! Я думал это очевидно! Прости за это :) - person Reza Aghaei; 08.11.2016
comment
@RichardGriffiths Спасибо за отзыв и редактирование, чтобы сделать его более понятным :) - person Reza Aghaei; 08.11.2016
comment
Кстати, я заметил, что если ваш запрос делает что-то вроде isnull(somefield, someotherfield) = SomeParameter, тогда разработчик XSD не может определить, какой тип SomeParameter является, следовательно, отказоустойчивым AnsiString. - person Richard Griffiths; 15.11.2016