pravin9455 Ответов: 2

Вставить дату в столбец SQL с типом данных date in VB.NET


я пытаюсь вставить дату в таблицу SQL со столбцом типа данных date из текстового поля, отформатированного в "DD/MM/YYYY"

1. если дата 01/11/2018, то она отображается в таблице sql как 2018-01-11

2. если дата равна 16/11/2018, то это дает ошибку преобразования не удалось при преобразовании даты и /или времени из символьной строки.

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

&низкотемпературный;
pre>Private Sub ButTest_Click(sender As Object, e As EventArgs) Handles ButTest.Click
        Dim ErrorMsg As String

        Try

            Call DBCnConnection()

            Dim Cmd As New SqlClient.SqlCommand

            Cmd.Connection = DBCnCommon

            Cmd.CommandText = " Insert Into TblTest(Entno,Posdate)" &
                "Values('" & 1 & "','" & TbxPostDate.Text & "')"

            Cmd.ExecuteNonQuery()
            DBCnClose()
        Catch ex As Exception
            ErrorMsg = ex.Message
            System.IO.File.AppendAllText("d:\Log\Log.text", ex.ToString & vbNewLine & vbNewLine)
            MsgBox(ErrorMsg)
        End Try

        DBCnClose()

    End Sub

2 Ответов

Рейтинг:
4

MadMyche

SQL-инъекция была идентифицирована более 20 лет назад, почему мы все еще видим код, который восприимчив каждый день?

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

Тогда использовать параметризованный запрос чтобы добавить эти значения в вашу команду SQL. Бонус к этому заключается в том, что когда вы добавляете значения таким образом, ADO будет знать, какие типы значений, чтобы он мог правильно отформатировать команду.

// you will need to transpose to VB

DateTime Posdate = (DateTime)TbxPostDate.Text; // I would validate this prior

Cmd.CommandText = "INSERT TblTest(Entno,Posdate) VALUES (1, @Posdate)";
Cmd.Paramaters.AddWithValue("@Posdate", Posdate);


Richard Deeming

Википедия утверждает, что он был впервые упомянут в статье от декабря 1998 года, так что это все еще пара недель до 20 лет. :)

MadMyche

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

Я не могу припомнить ни одного случая, когда бы я обнаружил проблему в продукте MS, исследовал ее, проконсультировался и поговорил с группой отдела MS, а затем написал статью об этом и опубликовал ее в течение нескольких месяцев

Richard Deeming

SQLi не является проблемой в продукте MS; он влияет на каждую СУБД и каждый язык, используемый для доступа к ним.

Вероятно, потребовалось еще некоторое время, чтобы написать и опубликовать статью. Но я не думаю, что он должен был бы сначала пройти мимо Microsoft. :)

Рейтинг:
0

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Поэтому используйте DateTime.Попробуйте преобразовать текстовое поле в реальный объект DateTime, сообщив о любой проблеме пользователю, а затем передать DateTime в БД непосредственно через параметр запроса.
Dim postDate As DateTime

If Not DateTime.TryParse(TbxPostDate, postDate) Then
    ... report problem to user
    Return
End If

Using con As New SqlConnection(strConnect)
    con.Open()
    Using com As New SqlCommand("INSERT INTO myTable (myColumn1, myColumn2) VALUES (@C1, @C2)", con)
        com.Parameters.AddWithValue("@C1", myValueForColumn1)
        com.Parameters.AddWithValue("@C2", myValueForColumn2)
        com.ExecuteNonQuery()
    End Using
End Using