Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Почему работают методы явно не созданного объекта

Привет.
Беглый поиск не дал ответа на вопрос, почему работает нижеприведённый код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class SomeClass 
{
    public: 
        SomeClass::SomeClass(){}
        void doSomeThing(){}
}; 
 
int main(int argc, char* argv[])
{
    SomeClass someClass; 
    someClass.doSomeThing(); 
}
Ведь формально переменная только объявляется,
код не содержит явных инструкций инстанцировать объект.
Заранее спасибо.
Ответ: Спасибо.
Вопрос: Почему нужно 2 раза писать readln?

Почему нужно 2 раза писать readln? Читайте комментарий. Спасибо.

Код Pascal
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
end;
var
  c:chelovek;
begin
  c:=new chelovek;
  writeln('Привет, представься пожалуйста!');
  write('Имя: ');
  readln(c.imya);
  write('Фамилия: ');
  readln(c.familiya);
  write('Отлично ', c.imya,' ', c.familiya, ' очень приятно!');
  writeln('А сколько тебе лет?');
  write('Возраст: ');
  read(c.let);
  
    if (c.let<18) then
    writeln('Такая маленькая, зачем ты зашла на порно сайт?')
    else
    writeln('Я в твои годы вагоны разгружал, а ты....');
    readln(c.otvet); // почему работает только с двумя "readln(c.otvet)"
    write(c.imya, ': ');
    readln(c.otvet); // убрать одну из "readln(c.otvet)" и программа до конца не работает. Почему?
    
    
    if (c.otvet='а че я') then
    writeln('Ты капец(')
    else
    writeln(')))');
end.
Ответ:
Сообщение от keml
почему чтобы все было верно мне приходится 2 раза писать readln я не понимаю
Всё просто. Оператор read не считывает из буфера ввода символы перевода строки и возврата каретки. И, при следующем вызове оператора read считывается пустая строка (собственно, символы перевода строки и возврата каретки). Отсюда и "непонятное" поведение программы. Для того, чтобы считать данные из буфера ввода и очистить буфер ввода, предназначен оператор readln. Примеры:

Входные данные, числа:
1 2 3

Неверно:
Код Pascal
1
2
3
read(a);
read(b);
read(c);
Код Pascal
1
read(a, b, c)
Конец строки не был считан, и остался в буфере. Отсюда и берутся "лишние" readln.

Верно:
Код Pascal
1
2
3
4
read(a);
read(b);
read(c);
readln;
Код Pascal
1
2
3
read(a);
read(b);
readln(c);
Код Pascal
1
readln(a, b, c)
В этих примерах буфер ввода после ввода будет пуст (сорри за вынужденный каламбур).

Просто примите за правило всегда считывать данные, содержащие конец строки, оператором readln. Если данных в строке несколько, то считывайте их опрератором read, все, кроме последнего: его нужно считывать оператором readln. Однако, readln не панацея, пример для упомянутых входных данных:
Код Pascal
1
2
3
readln(a);
readln(b);
readln(c);
Здесь будет считано только a = 1. После чего первый readln почистит буфер, и остаток строки (2 3) в буфере ввода будет уничтожен. И программа будет честно ждать ещё два readln'а, когда же Вы введёте в неё данные, которые Вы уже ввели, а она их уничтожила.

Рекомендую Вам повнимательнее изучать теоретические материалы. Языки программирования (а паскаль - в особенности) неточности и разночтения "понимают" превратно. В программе важен каждый символ, в том числе, и непечатный (которого вроде как и не видно).
Вопрос: Почему нет сообщения "Access violation at."

Все "почему не работает", а он "почему работает" странные эти зелёные... сами не знают чего хотят.
Вместе посмеялись - теперь по существу вопроса.

Уважаемые форумчане, всё началось с банальной задачи. Динамически создать форму, а после окончания работы - полностью разрушить и освободить память. Обратился к библии (разработчика), переписал от туда нужные буквы, запустил.... Ура! Очередная маленькая победа!
Только вот.... решил проверить всё ли разрушилось, снеслось и удалилось. Повторно вызвал форму. "Access violation at....." Ожидаемый ответ. Тогда уж для верности, так сказать контрольный выстрел. Выел текст из заголовка.
Вот теперь вопрос. Почему вместо "Access violation at....." я увидел текст из заголовка???

Вот так создавал, обращался и уничтожал форму

Delphi
1
2
3
4
5
6
7
8
procedure TF_Start.mmNewClick(Sender: TObject);
begin
  F_New:= TF_New.Create(application);
  F_New.ShowModal;
  F_New.Release;
//  F_New.Close;
//  Label1.Caption:= F_New.Caption;
end;
Вот так проверял что осталось

Delphi
1
2
3
4
5
6
procedure TF_Start.mmViewClick(Sender: TObject);
begin
//  F_New.Show;
  Label1.Caption:= IntToStr(F_New.Top);
//  Label2.Caption:= IntToStr(F_New.FN);
end;
PS
Форма F_New пустая, ни одного компонента.
mm - MainMenu.
Закомментированы различные варианты экспериментов
Помогите разобраться в чём дело. Неправильно уничтожаю, или особенности Delphi
Ответ: Ну есть ещё непонимание более сложной проблемы - "Почему ошибки обращения по адресу в памяти процесса иногда вызывают AV, а иногда не вызывают?". Тут на досуге стоит почитать монументальный труд главного российского специалиста по отловле и обработке ошибок -
Вопрос: Почему работает метод

Имеется метод, и по нему задали вопрос - почему он работает. Ломаем голову уже несколько дней. Вопрос возможно сформулирован немного неправильно, но основная суть - почему он работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void randommetod(double[,] a)
{
random rand = new random()
for (int i = 0; a.GetLenght(0); i++)
{
for (int j = 0; a.GetLenght(1); j++)
{
a[i,j] = rand.Next(100);
Console.Write("{0}\t", a[i,j]);
}
}
}
Ответ: BillyDOS, потому что массивы в C# - ссылочные типы, передаются по ссылке, и потому внутри метода спокойно можно изменять элементы массива - то есть изменяется содержимое (состояние) объекта, а не сам объект.
Вопрос: почему работает код

Здравствуйте.

есть код

var
  f:TForm;
  s:string;
begin
  f:=TForm.Create(self);
  f.Caption:='ddddddd';
  s:=f.Caption;   {1}
  FreeAndNil(f);
  s:=f.Caption;  {2}
  Application.MessageBox(PChar(s),'');
  f.Free; {2-1}
  s:=f.Caption; {3}
  Application.MessageBox(PChar(s),'');


На строке {2} F равен nil. Однако, заголовок хоть и пустой, но присваивается S.
почему на строке {2} не получаю AV? и тоже самое на {2-1} и {3}
Ответ: Michael Longneck,

Собственно спросил , тк отлавливал плавающую ошибку.


R локальная переменная в процедуре. Она же передаётся в другую процедуру. Через параметр var.
В процедуре создаётся форма контейнер. В ней естьпанель и она становится parent этой самой r.
Когда контейнер уничтожается, то parent у r устанавливается в nil. Те чтобы r не уничтожилась вместе с контейнером.

И далее после выхода из процедуры идёт freeandnil(r)

И на этой строке периодически получаю AV . Причём что самое интересное запущена программа под отладчиком и тут же без него. В первом случае отрабатывает все ок. Во втором av
Вопрос: Почему работает без volatile?

Добрый день !

Есть переменная
C++
1
 bool l = false;
которая блокирует цикл в функции fun1

этой переменной управляет функция fun2

не могу понять почему цикл заканчивается, если я переменную bool l не объявил как volatile ?

по идеи должна быть оптимизация

C++
1
2
3
4
5
6
7
while (true)
    {
        
            cout<<"88888888888888888888888888"<<endl;
 
            Sleep(500);
    }

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
HANDLE hEvent[2],Event;
 
 
bool l = false;
 
 
DWORD WINAPI fun1(CONST LPVOID lpParam)
{
    while (!l)
    {
        
            cout<<"88888888888888888888888888"<<endl;
 
            Sleep(500);
    }
 
 
 SetEvent(hEvent[0]);
 return 0;
}
 
DWORD WINAPI fun2(CONST LPVOID lpParam)
{
 for (short i=0;i<10; i++) 
 {
     cout<<"777777777777777777777"<<endl;
     Sleep(500);
 }
 l = true;
 SetEvent(hEvent[1]);
 return 0;
}
 
 
 
int main()
{
    
    hEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
    hEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
    CreateThread(NULL, 0, fun1, 0, 0, 0);
    CreateThread(NULL, 0, fun2, 0, 0, 0);
    WaitForMultipleObjects(2,hEvent, TRUE,INFINITE);
 
    cout <<endl<< "***********************" << endl;
 
  system("pause");
  return 0;
 
  
}
Ответ: В Debug настройки оптимизации лучше вообще не трогать, это будет мешать отладке.
Лучше пересобрать в конфигурации Release и проверить результат.
Вопрос: Почему работает не корректно?

Есть большие списки ингредиентов, типа: для теста, для начинки, для крема...
они отображаются в блоге при наведении на фотографию блюда. Но из-за смены дизайна сайта, они теперь не влезают под фото, потому надо сократить список, оставив только основные ингредиенты. ,т.е. первые абзацы+первый список.
написал следующую регулярку, но она почему-то выводит все, не удаляя второе
Код
echo preg_replace('/(<div.*<\/ul>)(.*)/siuU', '$1</div>',$text);
если же написать так:
Код
echo preg_replace('/(<div.*<\/ul>)(.*)/siuU', '$2</div>',$text);
тогда выведет только второе. Как вытащить только первое?

Код
<?php
$text='<div class="игредиенты">
<p>
<strong>Ингредиенты</strong>
</p>
<p>
<i>Для теста:</i>
</p>
<ul>
<li itemprop="ingredients">ингредиент 1</li>
<li itemprop="ingredients">ингредиент 2</li>
<li itemprop="ingredients">ингредиент 3</li>
</ul>
<p>
<i>Для начинки (нужно убрать этот список):</i>
</p>
<ul>
<li itemprop="ingredients">ингредиент 4</li>
<li itemprop="ingredients">ингредиент 5</li>
</ul>
</div>
';
echo preg_replace('/(<div.*<\/ul>)(.*)/siuU', '$1</div>',$text);
?>
т.е на выходе должно быть:

Код
<div class="игредиенты">
<p>
<strong>Ингредиенты</strong>
</p>
<p>
<i>Для теста:</i>
</p>
<ul>
<li itemprop="ingredients">ингредиент 1</li>
<li itemprop="ingredients">ингредиент 2</li>
<li itemprop="ingredients">ингредиент 3</li>
</ul>
и все
Ответ:
PHP
1
2
preg_match("~<div.+?<\/ul>~si",$text,$m);
echo $m[0];
а с помощью preg_replace можно так
PHP
1
echo preg_replace("~(<div.*?<\/ul>)\\K.+~si",'',$text);
Вопрос: VS не "понимает" Using System.Web.Hosting

народ хелп.я новичок в asp.net
using System.Web.Hosting;-студия не видит и ругается,а без нее не создам
Код C#
1
 MyExeHost host = (MyExeHost)ApplicationHost.CreateApplicationHost(typeof(MyExeHost), "/", Directory.GetCurrentDirectory());
Добавлено через 8 часов 9 минут
пожалуйста очень нужно

Добавлено через 36 минут
Хостинг ASP.NET в консольном приложении.
вот полный код:
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System; using System.10; using System.Web; using System.Web.Hosting;
public class App {
public static void Main(string[ ] args)
{
if (args.length != 0)
{
// Предметная область AppDomain. обрабатывающая запрос.
MyExeHost host =
(MyExeHost)ApplicatlonHost.CreateApplicatlonHost (typeof(MyExeHost),
Di rectory.GetCurrentDirectory{));
// Обращение к новой области AppDomain. host.ProcessRequest(args[0]);
}
}
1
// наследование от MarshalByRefObject для разрешения удаленных вызовов через // AppDomains.oublic class MyExeHost : MarshalByRefObject {
public vuid ProcessRequest(string page)
{
// Создание запроса исполнителя.
HttpworkerRequest hwr = new SimpleWorkerR<3<iuest(page, null. Console. Out):
// Передача запроса в ASP.NET для обработки.
HttpRuntime.ProcessRequest(hwr):
»
} 
Таким образом, если вы с помощью аргумента командной строки переладите запрос для файла
Код HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ Page Language="C#" %>
<html>
<body>
<h1>Hello ASPX!</h1>
<br />
<h2><%= DateTime. Now. ToShortTimeStringO %></h2>
</bocy>
</ntml>
то получите приблизительно такой результат:
<htmi>
<head>
</head>
<body>
<H1>Hello ASPX!</h1>
<Or />
<h2>09:06</h2>
</nody>
</htmi>
Добавлено через 2 минуты
создал консольное приложение c#,код написал,но не хочет работать.
ругается на using System.Web.Hosting; и на MyExeHost host
потом решил создать пустое приложение в asp.net результат тот же,ток ругается на MyExeHost host

Добавлено через 1 час 44 минуты
народ мне нужно исправлять код.
я не знаю где его запускать
может в студии проблема?у меня 2012.
Ответ: archar, берем вот такой C# код:
Кликните здесь для просмотра всего текста
Код 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
using System;
using System.IO;
using System.Web;
using System.Web.Hosting;
 
namespace cs_ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 0)
            {
                MyExeHost host = (MyExeHost)ApplicationHost.CreateApplicationHost(typeof (MyExeHost), "/", Directory.GetCurrentDirectory());
                host.ProcessRequest(args[0]);
            }
        }
    }
 
    public class MyExeHost : MarshalByRefObject
    {
        public void ProcessRequest(string page)
        {
            HttpWorkerRequest hwr = new SimpleWorkerRequest(page, null, Console.Out);
            HttpRuntime.ProcessRequest(hwr);
        }
    }
}

плюс такой файл test.aspx:
Кликните здесь для просмотра всего текста
Код HTML5
1
2
3
4
5
6
7
8
<%@ Page Language="C#" %>
<html>
<body>
<h1>Hello ASPX!</h1>
<br />
<h2><%= DateTime.Now.ToShortTimeString() %></h2>
</body>
</html>

Компилируем C# код. Создаем рядом с exe папку bin. Копируем туда свой exe. То есть у нас будет примерно такая структура каталогов:
Код Code
1
2
\bin\Debug\ConsoleApplication.exe
bin\Debug\bin\ConsoleApplication.exe
Запускаем первый exe с такой командной строкой:
Код Code
1
ConsoleApplication.exe test.aspx
И получаем искомый результат.
Вопрос: Using WriteFile() cause the error 5 - ERROR_ACCESS_DENIED

Win10, VS Community 2015.
Ребятушки, помогите, не могу записать данные на флешку.
Команда
C++ (QT)
1
result = WriteFile(hDevice, buffer, 512, dwBytesWritten, NULL);
вызывает ошибку.
Пробовал выставлять настройки манифеста в проекте, не получается, поставить уровень highestAvaible не помогает, а включить обход защиты - перестаёт запускаться программа.
Читаются данные нормально. Этот файл - microSD карточка вставленная в кардридер.

И да, флешка не заблочена! Я писал сектора на ней с помощью утилит. Примечательно что утилита то же не смогла записывать под управлением Win10, только в эмуляторе WinXP.

C++ (QT)
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <iostream>
#include <string>
#include <EasyBMP.h>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
 
using namespace std;
 
HANDLE GetHandle(int device);
 
int main(int argc, char*  argv[])
{
 
string  Name = "D:\\PNG\\Test_png_00005.bmp"; //First Input FIle name.
int namelen, intIndex, indexlen;
string  strIndex;
int width, height, w;
bool FileOpened = true;
BMP AnImage;
HANDLE hDevice;
 
 
    //std::string FirstArgument;
    //std::string Name0;
 
    //Name0 = argv[0];
    //FirstArgument = argv[1];
 
    //std::cout << Name0;
    //std::cout << "\n";
    //std::cout << FirstArgument;
 
    // Open BMP sequence
    //while (FileOpened) {
    //  FileOpened = AnImage.ReadFromFile(Name.c_str());
 
    //  if (FileOpened) {
    //      cout << "File opened!" << endl;
 
    //      cout << "File info:" << endl;
    //      height = AnImage.TellHeight();
    //      width = AnImage.TellWidth();
 
    //      cout << AnImage.TellWidth() << " x " << AnImage.TellHeight() << " at " << AnImage.TellBitDepth() << " bpp" << endl;
    //      cout << "colors: " << AnImage.TellNumberOfColors() << endl;
 
    //      //// show the color of pixel (14,18)
    //      //for (w = 0; w < height; w++) {
    //      //  RGBApixel Temp = AnImage.GetPixel(0, w);
    //      //  cout << "(" << (int)Temp.Red << ","
    //      //      << (int)Temp.Green << ","
    //      //      << (int)Temp.Blue << ","
    //      //      << (int)Temp.Alpha << ")" << endl;
 
    //      //}
 
    //      //Generate next index name      
    //      namelen = Name.length();
    //      strIndex = Name.substr(namelen - 9, namelen-4);// const
    //      intIndex = atoi(strIndex.c_str());
    //      intIndex++;
    //      strIndex = to_string(intIndex);
    //      indexlen = strIndex.length();
    //      while (strIndex.length() < 5) {   //Fill index with zeros. 00xxx.
    //          strIndex = "0" + strIndex;
    //      }
    //      Name = Name.replace(namelen - 9,  namelen - 4, strIndex);
    //      Name = Name + ".bmp";
    //  }
    //  else {
    //      cout << "File did not opened!" << endl;
    //      cout << Name << " Did not founded!" << endl;
    //  }
    //}
 
    FileOpened =  GetHandle(1);
    
    system("pause");
    
    return 0;
}
 
 
 
HANDLE GetHandle (int device) {
    HANDLE hDevice; 
    char _devicename[20];
    unsigned char buffer[512];
    int Sector;
    int numSec = 1;
 
    bool result = false;
    DWORD setPointErr;
 
    DWORD dwBytesRead;
    LPDWORD dwBytesWritten=0;
 
    sprintf_s(_devicename, "\\\\.\\PhysicalDrive%d", device);//Путь к физическому диску.
 
    // Creating a handle to disk drive using CreateFile () function .. 
    hDevice = CreateFile(_devicename, GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL, OPEN_EXISTING, 0, NULL);
 
 
    if (hDevice != INVALID_HANDLE_VALUE) {
        printf("device opened ok\n");
 
        // Setting the pointer to point to the start of the sector we want to read ..
        Sector = 315792;
        setPointErr = SetFilePointer(hDevice, (Sector * 512), NULL, FILE_BEGIN);
        //Считаем сектор.
        result = ReadFile(hDevice, buffer, 512 * numSec, &dwBytesRead, NULL);
        //Передвинем указатель файла на 1 сектор (512 байт)
        setPointErr = SetFilePointer(hDevice, ((Sector+1) * 512), NULL, FILE_BEGIN);
        //Не хочет записываться сектор(
        result = WriteFile(hDevice, buffer, 512, dwBytesWritten, NULL);
        
        if (result != true) {
            cout << "Fail to write sec" << endl;
        }
 
        setPointErr = GetLastError(); //Return 5 ERROR_ACCESS_DENIED
        CloseHandle(hDevice);
    }
    else {
        printf("Cannot open device specified\n");
        return INVALID_HANDLE_VALUE;
    }
 
    return hDevice;
}
Ответ: Убежденный, Дело в том что не хочу работать с файлами. Эта штука выполняется на микроконтроллере и сырые данные двигаются быстрее.

В принципе, свою проблему я решил. Утилитой "Low level format" удалил файловую систему. Windows работать с флешкой отказывается, но моя программа нормально записывает сектора.
Вопрос: Insert data into table(from select) using 2 DataGridView

Всем привет

Ребята, помогите разобраться где у меня ошибка. 2 DataGridView, в первом DGV я храню Услуги во втором Cписок Заказов. Когда я нажимаю кнопку «Сохранить», этот код выполняет:

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
public void insert_sales_list()
    {
        conn.Open();
        foreach (DataGridViewRow row in dgvService.SelectedRows)
        {               
            SQLiteCommand cmd = new SQLiteCommand("insert into sales_list (sales_created_date, sales_created_name, emp_name, cust_phone, cust_name, planned_date, planned_time, service_name, discount, price, order_id) values (@ocd, @ocn, @emp, @c_phone, @c_name, @p_date, @p_time, @sn, @disc, @price, @o_id)", conn);             
            cmd.Parameters.AddWithValue("@ocd", DateTime.Now);
            cmd.Parameters.AddWithValue("@ocn", lblLoginUser.Text);
            cmd.Parameters.AddWithValue("@emp", dgvOrderList.CurrentRow.Cells[1].Value.ToString());
            cmd.Parameters.AddWithValue("@c_phone", dgvOrderList.CurrentRow.Cells[2].Value.ToString());
            cmd.Parameters.AddWithValue("@c_name", dgvOrderList.CurrentRow.Cells[3].Value.ToString());
            cmd.Parameters.AddWithValue("@p_date", dgvOrderList.CurrentRow.Cells[5].Value);
            cmd.Parameters.AddWithValue("@p_time", dgvOrderList.CurrentRow.Cells[6].Value.ToString());
            cmd.Parameters.AddWithValue("@sn", row.Cells[0].Value.ToString());
            cmd.Parameters.AddWithValue("@disc", dgvOrderList.CurrentRow.Cells[4].Value.ToString());
            cmd.Parameters.AddWithValue("@price", row.Cells[1].Value.ToString());
            cmd.Parameters.AddWithValue("@o_id", dgvOrderList.CurrentRow.Cells["order id"].Value);
            cmd.ExecuteNonQuery();
 
            string sql = "update order_list set status = 'Saved' where id = '" + dgvOrderList.CurrentRow.Cells["order id"].Value + "'";
            cmd = new SQLiteCommand(sql, conn);
            cmd.ExecuteNonQuery();
        }
        conn.Close();
Тут все просто, я вставляю данные из Списка Заказов в Список Продаж, пользователь выбирает сервис или сервисы из DataGridView.Service, он может использовать любую услугу из списка. Этот код работает великолепно.

Далее. У меня есть еще одна табличка, в которой у каждой Услуги есть свои Материалы, например - Мужская Стрижка(Услуга) содержит мыло, шампунь и салфетку по нормам. И мне нужно вставить эти данные в таблицу SalesMaterials. И я думаю, что код неправильный, пожалуйста, помогите мне найти эту ошибку? код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
public void insert_sales_materials()
    {
        conn.Open();
        foreach (DataGridViewRow row in dgvService.SelectedRows)
        {               
            string Query = "insert into sales_list_materials(order_id, material_id, norma, created_name, creation_date) " +
                "values( select '" + dgvOrderList.CurrentRow.Cells["order id"].Value + "', a.material_id, a.norma, '" + lblLoginUser.Text + "', '" + DateTime.Now + "'  from service_materials a where a.service_id = '" + row.Cells[2].Value + "')";
            SQLiteCommand cmd = new SQLiteCommand(Query, conn);
            cmd.ExecuteNonQuery();
        }
        conn.Close();
    }
Ошибка:

Additional information: SQLite error

near "select": syntax error

P.S. использую C# windows Forms и SQLite

Добавлено через 10 минут
Все я разобрался ))
тупая ошибка, при insert из select не используйте слово VALUES

Правильный код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
public void insert_sales_materials()
        {
            conn.Open();
            foreach (DataGridViewRow row in dgvService.SelectedRows)
            {               
                string Query = "insert into sales_list_materials(order_id, material_id, norma, created_name, creation_date) " +
                    "select '" + dgvOrderList.CurrentRow.Cells["номер заказа"].Value + "', a.material_id, a.norma, '" + lblLoginUser.Text + "', '" + DateTime.Now + "'  from service_materials a where a.service_id = '" + row.Cells[2].Value + "'";
                SQLiteCommand cmd = new SQLiteCommand(Query, conn);
                cmd.ExecuteNonQuery();
            }
            conn.Close();
        }
Ответ: контрол - это собственно инструмент взаимодействия между данными (что в программе) и пользователем, т.е. простыми словами - интерфейсная часть программы. В Вашем случае гриды, комбобоксы, текстбоксы - это всё контролы.
Они отображают значения, что находятся в полях/свойствах Ваших объектов (например, классов).
Так вот - если учились работать в консольке - то там Вы работали именно с полями, вот тут тоже - работайте с сущностями внутри программы, а интерфейс нужно использовать только для взаимодействия с пользователем, и никак не для вычислений.
Для начала - почитайте вот - очень много будет полезной информации, и собрана как раз вместе.