powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ошибка преобразования даты или времени из символьной строки
25 сообщений из 50, страница 1 из 2
Ошибка преобразования даты или времени из символьной строки
    #39963381
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу сразу прощения если вопрос покажется кому-то примитивным, опыта пока маловато, а на просторах инета пока найдёшь что-то действительно нужное столько ненужного найдёшь, что голова кругом.

Вообщем вопрос в названии, при компиляции выдаёт, если проигнорить и всё равно запустить то работает, смысл простой, есть грид и комбик, в комбике выбираем дату и грид перестаривается:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public string conn = "Data Source=Abon;Initial Catalog=Abon;Integrated Security=True";

        private void Form1_Load(object sender, EventArgs e)
        {
            string query = "SELECT DateV FROM Dop2018 group by DateV order by DateV";
            SqlDataAdapter da = new SqlDataAdapter(query, conn);
            DataSet ds = new DataSet();
            da.Fill(ds);
            tDateV.DataSource = ds.Tables[0];
            tDateV.DisplayMember = "DateV";

            query = "SELECT * FROM Dop2018 where DateV=convert(date,'" + tDateV.Text + "',104)";
            SqlDataAdapter daGrid = new SqlDataAdapter(query, conn);
            DataSet dsGrid = new DataSet();
            daGrid.Fill(dsGrid);
            GridDop2018.DataSource = null;
            GridDop2018.DataSource = dsGrid.Tables[0];
        }

        private void tDateV_SelectedIndexChanged(object sender, EventArgs e)
        {
            string query = "SELECT * FROM Dop2018 where DateV=convert(date,'" + this.Text + "',104)";
            SqlDataAdapter daGrid = new SqlDataAdapter(query, conn);
            DataSet dsGrid = new DataSet();
            daGrid.Fill(dsGrid);
            GridDop2018.DataSource = null;
            GridDop2018.DataSource = dsGrid.Tables[0];

        }



Модератор: Учимся использовать тэги оформления кода - FAQ
Красным выделил строку где возникает данная ошибка
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963383
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делай сразу нужную строку даты в формате YYYYMMDD и подставляй, но намного правильней делать это через SQL параметр с нужным типом данных, так как это защита от инъекций
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963387
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One, Там проблема даже не с тем что он преобразовать не может, если обратитет внимание на Load всё работает нормально, а вот когда в коде меняешь значение здесь ругается, типа он на этапе компиляции пытается туда что-то подставить, но у него не получается это сделать, а явно я указать дату не могу, весь смысл как раз в том чтобы дату выбирали из списка и весь грид перестраивался. В целом то код работает, но вот почему ругается на этапе сборки и как ему объяснить что там обязательно будет значение и оно его точно устроит, пока понять не могу
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963390
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где сама ошибка компиляции? И если ошибка на выделенной строке, то причем тут вообще вопросы про дату?
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963398
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, То есть вы не поняли, ок, давайте распишу подробнее

Выше я написал всего 2 метода, первый происходит при загруке формы, а второй при изменении значения в ComboBox

Код прям один в один, но именно в изменение компилятор не может или не хочет подставлять значение и поэтому даёт ошибку и я не могу понять, как же ему объяснить чтобы он понимал что там обязательно будет нужное значение и при том при всём в методе Load компилятор всё устраивает, хотя там точно такой же код
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963456
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй в текстовое поле c датой вбить что-нибудь типа:

Код: sql
1.
; drop database <имя БД> --


все тут же должно заработать
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963475
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKES
давайте распишу подробнее
Подробнее не увидел. Какая конкретно ошибка компиляции? Или компилятор прям так и пишет "не хочу подставлять значение"?
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963480
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Попробуй в текстовое поле c датой вбить что-нибудь типа:
У него там не текстовое поле, походу, он обрадается к свойству Form1.Text в котором лежит "Form1", после чего получает исключение, а вовсе не ошибку компиляции, как утверждает
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963486
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
после чего получает, исключение а вовсе не ошибку компиляции, как утверждает

Возможно у него на форме объявлено свойство или поле "Text". А если это текстбокс, то строка соберется с его значением "Text.ToString()" - скорее всего подставится что-нибудь типа "System.Windows.Forms.TextBox" или я не знаю, как там для него ToString() реализован. Ошибки компиляции не будет по любому - на сервер уйдет корявый запрос, что и происходит.

Но, лично я вообще против, чтобы автору как-либо помогать, пока он не перестанет собирать SQL конкатенацией вместо использования параметров.
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963495
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Возможно у него на форме объявлено свойство или поле "Text"
Оно в базовом классе Control объявлено ))

fkthat
Но, лично я вообще против, чтобы автору как-либо помогать, пока он не перестанет собирать SQL конкатенацией вместо использования параметров.
Пусть сначала хотя бы разберется, чем отличается компиляция от выполнения программы.
Хотя, судя по всему, человек пришел с какого-то скриптового языка, скорее всего с яваскрипта, отсюда такое непонимание (добро пожаловать в мир статического анализа и строгой типизации) ))

А потом дашь ему ссылку на статью про инъекции
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963496
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значение из текстбокса не соответствует маске 104 SQL-ной функции convert, вот и всё. За конкатенацию вместо параметров бить.
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963501
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
А потом дашь ему ссылку на статью про инъекции

Там не только инъекции, там ещё нюансы производительности - при новом значении параметра, отличного от предыдущего, на сервере будет рекомпиляция запроса вместо получения плана из кэша. Если запрос сложный, или часто вызывается, это может вылиться в ощутимый удар по производительности. На одном моем бывшем месте работы именно ввиду этого нюанса за конкатенацию депремировали :)
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963502
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Shocker.Pro
А потом дашь ему ссылку на статью про инъекции

Там не только инъекции, там ещё нюансы производительности - при новом значении параметра, отличного от предыдущего, на сервере будет рекомпиляция запроса вместо получения плана из кэша. Если запрос сложный, или часто вызывается, это может вылиться в ощутимый удар по производительности. На одном моем бывшем месте работы именно ввиду этого нюанса за конкатенацию депремировали :)
А ещё за "SELECT *" по рукам бить.... я ж говорю, дайте человеку сначала в основах разобраться
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963505
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Значение из текстбокса не соответствует маске 104 SQL-ной функции convert, вот и всё. За конкатенацию вместо параметров бить.
Еще раз, там нет текстбокса, он берет значение из this.Text
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963506
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
при новом значении параметра, отличного от предыдущего, на сервере будет рекомпиляция запроса вместо получения плана из кэша.

Давно уже не будет. Если еще не с 2005, то с 2008 версии это точно, сиквел (если у автора сиквел) умеет сам перед компиляцией перестраивать запрос, заменяя литералы на параметры.
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963507
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
он берет значение из this.Text

Я про это и забыл, но мне простительно, я формсами вообще не занимаюсь. Значит там будет выполняться что-нибудь типа
Код: sql
1.
SELECT * FROM Dop2018 where DateV=convert(date, 'Form1',104)
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963545
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблему решил, просто добавил проверку на null

всем спасибо за участие, очень радует такая активность, это значит что я правильно выбрал направление, будем копать дальше
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963548
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Shocker.Pro
он берет значение из this.Text

Я про это и забыл, но мне простительно, я формсами вообще не занимаюсь. Значит там будет выполняться что-нибудь типа
Код: sql
1.
SELECT * FROM Dop2018 where DateV=convert(date, 'Form1',104)



Ну я же вроде и выбрал топик WinForms или что-то нет?

авторУ него там не текстовое поле, походу, он обрадается к свойству Form1.Text в котором лежит "Form1", после чего получает исключение, а вовсе не ошибку компиляции, как утверждает

Ну я же вроде выше описал, что есть грид и комбик, та не сильно много букв было в самом вопросе, можно было бы и прочитать
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963567
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вангование
Автор сделал свой контрол, напрямую унаследовав его от комбобокса, не учел работу контрола в дизайн-тайме. но запихнув внутрь работу с БД. А приведенный в первом посте код на самом деле относится к разным классам, а не к одному, о чем автор сказать забыл, отсюда разночтение.
В итоге, ошибку он получает в дизайнере форм (в общем, это не ошибка компиляции, а ошибка рантайма самого контрола в дизайнере формы), потому что не проверяет, в дизайн-тайме или в ран-тайме запускается код контрола.
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963578
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Автор сделал свой контрол, напрямую унаследовав его от комбобокса, не учел работу контрола в дизайн-тайме. но запихнув внутрь работу с БД.

Жесть прямо какая-то... Оказывается, что сиквельный инжекшен это тут еще не самое страшное.
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963596
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Давно уже не будет. Если еще не с 2005, то с 2008 версии это точно, сиквел (если у автора сиквел) умеет сам перед компиляцией перестраивать запрос, заменяя литералы на параметры.

Странно.
Код: sql
1.
2.
3.
use master
go
dbcc freeproccache


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public static void Main()
{
  using (var cnn = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True"))
  {
    cnn.Open();
    using (var cmd = new SqlCommand("select object_id from sys.all_objects where name=@name", cnn))
    {
      var p = cmd.Parameters.Add("@name", SqlDbType.NVarChar, 128);
      p.Value = "sp_addrolemember";
      using (cmd.ExecuteReader()){ }
    }
    using (var cmd = new SqlCommand("select object_id from sys.all_objects where name=@name", cnn))
    {
      var p = cmd.Parameters.Add("@name", SqlDbType.NVarChar, 128);
      p.Value = "sp_droprolemember";
      using (cmd.ExecuteReader()) { }
    }
    using (var cmd = new SqlCommand("select object_id from sys.all_objects where name=@name", cnn))
    {
      var p = cmd.Parameters.Add("@name", SqlDbType.NVarChar, 128);
      p.Value = "sp_helplogins";
      using (cmd.ExecuteReader()) { }
    }
    using (var cmd = new SqlCommand("select object_id from sys.all_objects where name='sp_addsrvrolemember'", cnn))
    {
      using (cmd.ExecuteReader()) { }
    }
    using (var cmd = new SqlCommand("select object_id from sys.all_objects where name='sp_dropsrvrolemember'", cnn))
    {
      using (cmd.ExecuteReader()) { }
    }
  }
}


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
  ecp.refcounts,
  ecp.usecounts,
  ecp.cacheobjtype,
  ecp.objtype,
  st.[text]
from sys.dm_exec_cached_plans ecp 
cross apply sys.dm_exec_sql_text(ecp.plan_handle) st
where st.dbid=db_id()
select @@version;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
refcounts   usecounts   cacheobjtype    objtype     text
----------- ----------- --------------- ----------- ----------------------------------------------------------------------------------
2           1           Compiled Plan   Adhoc       select ecp.refcounts, ecp.usecounts, ecp.cacheobjtype, ecp.objtype, st.[text] ....
2           1           Compiled Plan   Adhoc       select object_id from sys.all_objects where name='sp_dropsrvrolemember'
2           1           Compiled Plan   Adhoc       select object_id from sys.all_objects where name='sp_addsrvrolemember'
2           3           Compiled Plan   Prepared    (@name nvarchar(128))select object_id from sys.all_objects where name=@name

(4 row(s) affected)
-----------------------------------------------------------------------------------
Microsoft SQL Server 2014 (SP2-CU17-GDR) (KB4505419) - 12.0.5659.1 (X64) 
  May 24 2019 19:09:40 
  Copyright (c) Microsoft Corporation
  Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


(1 row(s) affected)
Т.е. на 5 запросов из клиентского приложения - 3 кэшированных плана. Именно 3, не 5, и не 1.
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963610
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
dbcc freeproccache

use Northwind

select * from Categories where CategoryID = 1
select * from Categories where CategoryID = 2

select t.[text] from sys.dm_exec_query_stats s
  cross apply  sys.dm_exec_sql_text(s.plan_handle) t


Крайний запрос возвращает:

Код: sql
1.
(@1 tinyint)SELECT * FROM [Categories] WHERE [CategoryID]=@1


Ктулху его знает, но, как видишь, для user tables работает. Лучше у проф. ДВАшников спросить - я все-таки по этой теме просто "за что купил, за то и продаю".
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963626
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Ктулху его знает, но, как видишь, для user tables работает.

Тут получается такая вот петрушка:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public static void Main()
{
  using (var cnn = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True"))
  {
    cnn.Open();
    using (var cmd = new SqlCommand("SELECT [object_id] FROM [sys].[all_objects] WHERE [object_id]=@1", cnn))
    {
      var p = cmd.Parameters.Add("@1", SqlDbType.TinyInt);
      p.Value = 5;
      using (cmd.ExecuteReader()) { }
    }
    using (var cmd = new SqlCommand("SELECT [object_id] FROM [sys].[all_objects] WHERE [object_id]=@1", cnn))
    {
      var p = cmd.Parameters.Add("@1", SqlDbType.TinyInt);
      p.Value = 6;
      using (cmd.ExecuteReader()) { }
    }
    using (var cmd = new SqlCommand("SELECT [object_id] FROM [sys].[all_objects] WHERE [object_id]=@1", cnn))
    {
      var p = cmd.Parameters.Add("@1", SqlDbType.TinyInt);
      p.Value = 7;
      using (cmd.ExecuteReader()) { }
    }
    using (var cmd = new SqlCommand("select object_id from sys.all_objects where object_id=8", cnn))
    {
      using (cmd.ExecuteReader()) { }
    }
    using (var cmd = new SqlCommand("select object_id from sys.all_objects where object_id=9", cnn))
    {
      using (cmd.ExecuteReader()) { }
    }
  }
}


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
  ecp.refcounts,
  ecp.usecounts,
  ecp.cacheobjtype,
  ecp.objtype,
  st.[text]
from sys.dm_exec_cached_plans ecp 
cross apply sys.dm_exec_sql_text(ecp.plan_handle) st
where st.dbid=db_id()



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
refcounts   usecounts   cacheobjtype    objtype     text
----------- ----------- --------------- ----------- ---------------------------------------------------------------------------------
2           2           Compiled Plan   Adhoc       select ecp.refcounts, ecp.usecounts, ecp.cacheobjtype, ecp.objtype, st.[text] ...
2           1           Compiled Plan   Adhoc       select object_id from sys.all_objects where object_id=9
2           1           Compiled Plan   Adhoc       select object_id from sys.all_objects where object_id=8
4           2           Compiled Plan   Prepared    (@1 tinyint)SELECT [object_id] FROM [sys].[all_objects] WHERE [object_id]=@1
2           3           Compiled Plan   Prepared    (@1 tinyint)SELECT [object_id] FROM [sys].[all_objects] WHERE [object_id]=@1

(5 row(s) affected)
т.е. да, вижу, что в итоге запрос отпрепарировался, и использовался параметризованный план. Однако к этому мы имеем ещё 2 записи с типом Adhoc, которые тоже закэшировались. И это может быть проблемой - кэш планов от таких Adhoc распухает, ему начинает не хватать ресурсов - тут вот человек разбирался с этой проблемой.
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963653
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Такое подозрение, что это связано либо с тем, что sys.all_objects это вьюха, либо с тем, что она системная.
...
Рейтинг: 0 / 0
Ошибка преобразования даты или времени из символьной строки
    #39963657
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Да, попробовал, по ходу дела, на вьюхах это не срабатывает - для каждого литерального значения план в кеше другой.
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ошибка преобразования даты или времени из символьной строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]