Member 10261487 Ответов: 1

MSSQL server 2005-проблема в типе данных (smalldatetime), в то время как его поле имеет 5 smalldatetime


Дорогие все,
В моей таблице с именем tbltest есть 5 столбцов с типом данных smalldatetime и другие столбцы. И у меня возникла очень интересная проблема, когда я вставляю значение datetime.
Имя полей моего столбца Датировано, Начальное Время, Конечное Время, OnAirStartTime, OnAirEndTime.
И в моем коде операции вставки нет никаких проблем:
db.Adapter("INSERT INTO tbltest (Dated,StartTime,EndTime,OnAirStartTime,OnAirEndTime,DurationStart,DurationOnAir,DeviceType,UnitName,VendorName,ActiveNetwork,SIM,ProfileUsed,Bitrate,ServerPort,CameraType,EventName,Division,Location,Stutus,Remarks,ReporterName,CameramanName,TechnicianName) VALUES ('" + Convert.ToDateTime(this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["Dated"].ToString()).ToString() + "',"
                        + "'" + Convert.ToDateTime(this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["StartTime"].ToString()).ToString() + "',"
                        + "'" + Convert.ToDateTime(this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["EndTime"].ToString()).ToString() + "',"
                        + "'" + Convert.ToDateTime(this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["OnAirStartTime"].ToString()).ToString() + "',"
                        + "'" + Convert.ToDateTime(this.mysql.dataSet.Tables["liveoperation7"].Rows[i][5].ToString()).ToString() + "',"
                        + "'" + Convert.ToInt32(this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["DurationStart"].ToString()) + "',"
                        //+ "'" + Convert.ToDateTime(this.mysql.dataSet.Tables["liveoperation7"].Rows[i][5].ToString()).ToString() + "',"
                        + "'" + Convert.ToInt32(this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["DurationOnAir"].ToString()) + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["DeviceType"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["UnitName"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["VendorName"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["ActiveNetwork"].ToString() + "',"
                        + "'" + Convert.ToInt32(this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["SIM"].ToString()) + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["ProfileUsed"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["Bitrate"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["ServerPort"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["CameraType"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["EventName"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["Division"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["Location"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["Stutus"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["Remarks"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["ReporterName"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["CameramanName"].ToString() + "',"
                        + "'" + this.mysql.dataSet.Tables["liveoperation7"].Rows[i]["TechnicianName"].ToString() + "')");


Передача 5 значений datetime:

Дата = 2016-10-05 00: 00:00
StartTime = 2016-10-05 13:53:00
EndTime = 2016-10-05 13:55:00
OnAirStartTime = 2016-10-05 13:53:00
OnAirEndTime = 10/5/2016 13:54:30

>Но есть вставка в файл OnAirEndTime значения поля EndTime.
Есть ли какие-либо проблемы с совпадением имен полей ?
Или есть ли какое-либо ограничение в MSSQL 2005, что не должно быть более 4 полей с smalldatetime типы данных ?

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

Я просто изменил тип данных OnAirEndTime как varchar, чем его точное значение вставки. Но почему я должен менять тип данных ?

Пожалуйста, помогите мне сохранить smalldatatime в качестве типа данных, сколько мне нужно в таблице.

Спасибо.

[no name]

Использование правильного параметризованного запроса может помочь вам отследить вашу ошибку.

Dave Kreskowiak

Ваш код представляет собой серьезную проблему безопасности, поскольку он подвержен атакам SQL-инъекций. Преобразуйте это в параметризованный запрос вместо мусора конкатенации строк, который у вас есть сейчас.

Это также позволит вам иметь гораздо больше контроля над тем, как ваши данные передаются на сервер, и одновременно решить вашу проблему.

1 Ответов

Рейтинг:
2

OriginalGriff

Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.
В этом конкретном коде это не опасно , но симптоматично, что остальная часть вашего кода такова: так что идите и проверьте и измените все это, прежде чем какой-то пользователь сделает это за вас, набрав текстовое поле...
А затем передайте значения DateTime непосредственно в SQL в качестве параметров, и ваша проблема почти наверняка исчезнет - потому что в данный момент значение, которое вы отправляете в SQL, отформатировано в локале для машины, выполняющей этот код, который вряд ли будет ISO-форматом yyyy-MM-dd, и, скорее всего, будет MM-dd-yyyy или dd-MM-yyyy, и это вызывает его собственный набор проблем.
Кроме того, это будет чертовски легко читать...