Member 13714562 Ответов: 2

Почему я не могу отправить данные на SQL server?


I am trying make an application which when installed in other system, has to collect details and send to my SQL server.

In SQL Server, I have made all columns as varchar(70).
I thought the problem was with datatypes, so I decided to remove OSInstallDate and  
LastBootUpTime in the below code and check. But still other data are not being inserted.
There is no problem with sql connection as I have checked it already.

If there's any other way of collecting all these data and sending to my database, I would be interested.


Что я уже пробовал:

SelectQuery Sq1 = new SelectQuery("Win32_OperatingSystem");
                ManagementObjectSearcher objOSDetails1 = new ManagementObjectSearcher(Sq1);
                foreach (ManagementObject mo1 in objOSDetails1.Get())
                {
                    OperatingSystem = mo1["caption"].ToString();
                    ServicePack = mo1["csdversion"].ToString();
                    OSVersion = mo1["version"].ToString();
                    OSArchitecture = mo1["OSArchitecture"].ToString();
                   OSSno = mo1["serialnumber"].ToString();
                   OSInstallDate = mo1["InstallDate"].ToString();
                    OSDescription = mo1["Description"].ToString();
                    LastBootUpTime = mo1["LastBootUpTime"].ToString();
                    SPMajorVersion = mo1["ServicePackMajorVersion"].ToString();
                    RegUser = mo1["RegisteredUser"].ToString();
                    OSStatus = mo1["status"].ToString();
                }
                cmd1 = new SqlCommand("INSERT INTO [dbo].[OSInfo]([LastUpdatedOn],[IPAddress],[OperatingSystem],[ServicePack],[OSVersion],[OSArchitecture],[OSSno],[OSInstallDate],[Description],[LastBootUpTime],[SPMajorVersion],[RegUser],[OSStatus]) VALUES (getdate(),'" + IPA + "','" + OperatingSystem + "','" + ServicePack + "','" + OSVersion + "','" + OSArchitecture + "','" + OSSno + "','" + OSInstallDate + "','" + OSDescription + "','" + LastBootUpTime + "','" + SPMajorVersion + "','" + RegUser + "','" + OSStatus + "')", con);
                
                int numrows1 = cmd1.ExecuteNonQuery();

2 Ответов

Рейтинг:
2

Patrice T

cmd1 = new SqlCommand("INSERT INTO [dbo].[OSInfo]([LastUpdatedOn],[IPAddress],[OperatingSystem],[ServicePack],[OSVersion],[OSArchitecture],[OSSno],[OSInstallDate],[Description],[LastBootUpTime],[SPMajorVersion],[RegUser],[OSStatus]) VALUES (getdate(),'" + IPA + "','" + OperatingSystem + "','" + ServicePack + "','" + OSVersion + "','" + OSArchitecture + "','" + OSSno + "','" + OSInstallDate + "','" + OSDescription + "','" + LastBootUpTime + "','" + SPMajorVersion + "','" + RegUser + "','" + OSStatus + "')", con);

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Member 13714562

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

Рейтинг:
1

lw@zi

Вы выполняете команду за пределами foreach цикл таким образом, только последняя запись будет сохранена в базе данных. Если вы хотите сохранить все записи, вы можете поместить выполнение команды в цикл.


Member 13714562

Я попробовал и это тоже. Но его не вставляют.

lw@zi

Вы получаете какие-нибудь исключения? Если да, обновите вопрос с этой детализацией. Если нет, проследите точный запрос, выполненный в базе данных с помощью SQL profiler, и посмотрите, есть ли там какие-либо проблемы

Member 13714562

Ни одно исключение. Теперь я попробую использовать SQL profiler и посмотрю.

Rajat-Indiandotnet

Что пришло в Profiler?

Member 13714562

На самом деле, не было никакой необходимости использовать профилировщик вообще. Я совершил глупую ошибку, указав неверный тип данных для одного из столбцов в моей таблице. Теперь все работает нормально.