Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ошибка преобразования даты или времени из символьной строки / 25 сообщений из 50, страница 1 из 2
28.05.2020, 14:35
    #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
28.05.2020, 14:43
    #39963383
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка преобразования даты или времени из символьной строки
делай сразу нужную строку даты в формате YYYYMMDD и подставляй, но намного правильней делать это через SQL параметр с нужным типом данных, так как это защита от инъекций
...
Рейтинг: 0 / 0
28.05.2020, 14:52
    #39963387
AngelOKES
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка преобразования даты или времени из символьной строки
Konst_One, Там проблема даже не с тем что он преобразовать не может, если обратитет внимание на Load всё работает нормально, а вот когда в коде меняешь значение здесь ругается, типа он на этапе компиляции пытается туда что-то подставить, но у него не получается это сделать, а явно я указать дату не могу, весь смысл как раз в том чтобы дату выбирали из списка и весь грид перестраивался. В целом то код работает, но вот почему ругается на этапе сборки и как ему объяснить что там обязательно будет значение и оно его точно устроит, пока понять не могу
...
Рейтинг: 0 / 0
28.05.2020, 14:57
    #39963390
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка преобразования даты или времени из символьной строки
Где сама ошибка компиляции? И если ошибка на выделенной строке, то причем тут вообще вопросы про дату?
...
Рейтинг: 0 / 0
28.05.2020, 15:10
    #39963398
AngelOKES
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка преобразования даты или времени из символьной строки
Shocker.Pro, То есть вы не поняли, ок, давайте распишу подробнее

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

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

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


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

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

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

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

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

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

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

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

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

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

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



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

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

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

Жесть прямо какая-то... Оказывается, что сиквельный инжекшен это тут еще не самое страшное.
...
Рейтинг: 0 / 0
28.05.2020, 19:52
    #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
28.05.2020, 20:26
    #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
28.05.2020, 21:02
    #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
28.05.2020, 21:42
    #39963653
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка преобразования даты или времени из символьной строки
Сон Веры Павловны,

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

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


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