Member 13410460 Ответов: 2

Как добавить месяцы между двумя timedatepickers в VB.NET -что ?


У меня есть код, который я вводю данные в свой SQL, вот этот код :
<pre>   
Dim db As ADODB.Connection
        Dim connstr As String
        Dim adoRS As ADODB.Recordset
        Dim sqlstr As String


        If (DateTimePickerFixCosts1.Text = "" Or Val(DateTimePickerFixCosts1.Text) = 0) Then
            Call MsgBox("Please insert Date")
            Exit Sub
        End If
        If (TxtIDFixCosts.Text = "") Then
            TxtIDFixCosts.Text = ""
        End If


        If (TxtItemDescFixCosts.Text = "") Then
            TxtItemDescFixCosts.Text = 0
        End If
        If (TxtPaymentFixCosts.Text = "") Then
            TxtPaymentFixCosts.Text = 0
        End If
        If (txtPriceFixCosts.Text = "") Then
            txtPriceFixCosts.Text = 0
        End If


        If (txtNumberofMonths.Text = "") Then
            txtNumberofMonths.Text = 0
            Exit Sub
        End If


        db = New ADODB.Connection
        db.ConnectionTimeout = 10
        connstr = "Provider = sqloledb;Data Source=ELVIS\SQLEXPRESS;Initial Catalog=Expenses;Trusted_Connection=yes;"
        db.ConnectionString = connstr
        db.Open()
        sqlstr = "Select * from Test_Table where ID = '" & Val(TxtIDFixCosts.Text) & "'"
        adoRS = New ADODB.Recordset
        adoRS.Open(sqlstr, db, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)

        If (adoRS.EOF = True) Then
            ' insert
            adoRS.AddNew()
            adoRS.Fields("Date").Value = DateTimePickerFixCosts1.Value

            adoRS.Fields("Department").Value = TxtFixCosts.Text
            adoRS.Fields("Description").Value = TxtItemDescFixCosts
            adoRS.Fields("Payment").Value = TxtPaymentFixCosts.Text
            adoRS.Fields("Price").Value = txtPriceFixCosts.Text
            MsgBox("Your Record has been inserted")
            adoRS.Update()

        Else
            If (MsgBox("This item in this date is already inserted " & vbCrLf & "Would you like to overwrite it?", MsgBoxStyle.YesNo, "This Item exist") = vbYes) Then
                ' overwrite
                adoRS.Fields("Date").Value = DateTimePickerFixCosts1.Value
                adoRS.Fields("Department").Value = TxtFixCosts.Text
                adoRS.Fields("Description").Value = TxtItemDescFixCosts.Text
                adoRS.Fields("Payment").Value = TxtPaymentFixCosts.Text
                adoRS.Fields("Price").Value = txtPriceFixCosts.Text

                MsgBox("Your data has been overwrited")
                adoRS.Update()
            End If
        End If
        adoRS.Close()
        db.Close()
Поле вниз-это то, что я пытался, я также пытался соединить их, но безуспешно, если есть кто-то, кто может мне помочь, я был бы очень великодушен.

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

' Dim originDate As DateTime = DateTime.Parse(DateTimePickerFixCosts1.Text)
       ' Dim result1 As DateTime = originDate.AddMonths(MonthssToAdd)
       ' MessageBox.Show(result1.ToLongDateString())

Maciej Los

Пользуетесь ли вы VB.NET или VB?
Если это так VB.nET пожалуйста, прекратите использовать ADODB! Использование ADO.NET вместо этого.

Member 13410460

Спасибо за ваш ответ, это VB:NET, и да, я действительно использую ADODB, потому что я более знаком с ним.

Laxmidhar tatwa technologies

Дим результат1 как datetime = DateTimePickerFixCosts1.Значение.AddMonths(1)

2 Ответов

Рейтинг:
15

Maciej Los

Попробовать это:

Dim originDate As DateTime = DateTimePickerFixCosts1.Value
Dim result1 As DateTime = originDate.AddMonths(MonthssToAdd)


КСТАТИ:
1) Не используйте ADODB внутри VB.NET-да. Воспользуйся ADO.NET[^] вместо этого!
2) Не используйте сцепленный текст для построения запроса. Воспользуйся параметризованный запрос[^] вместо этого, потому что ваш код SQL-инъекция[^] уязвимый!

Окончательно:
Dim dt As DataTable = New DataTable()
Try
    Using connection As New SqlConnection("ConnectionStringHere")
        conection.Open()
        Using command As New SqlCommand("commandTextHere", connection)
            Using reader As SqlDataReader = command.ExecuteReader()
                dt.Load(reader)
            End Using
        End Using
    End Using
Catch Ex As Exception
    Console.WriteLine(Ex.Message)
End Try
If dt.Rows.Count=0 Then
    'something went wrong!
End If


Удачи вам!


Member 13410460

Спасибо вам за Ваш ответ Мацей Лос, я попробую это сделать и дам вам знать о результатах.
Рекорды

Maciej Los

Всегда пожалуйста!

Member 13410460

Привет еще раз, я провел некоторое исследование того, что вы сказали, и я увидел, что "параметризованные запросы" используют команды SQL, которые я тоже не очень хорошо знаю, я знаю основы, но я не знаю, как соединить 5 значений, которые должны быть вставлены с текстовым полем чисел ('result1').

Maciej Los

Не могли бы вы уточнить? Я не понимаю эту часть: "как соединить 5 значений, которые нужно вставить с текстовым полем чисел ('result1')."

Member 13410460

Извините, если я не понимаю, что английский не является моим родным языком, поэтому, когда я заглянул в коды, я понял, как я мог это сделать, и это код (sqlcommand) :
строка sqlText = "вставить в расходы" +
"SET Description = '" + txtItemDescFixCost.Текст + "', " +
"SET Payment = '" + txtPaymentFIxCost.Текст + "', " +
"SET Price = '" + txtPriceFixCost.Текст + "', " +
"Дата =" + datetimepicker1.Текст + "" +
"WHERE ID =" + Val(txtID.text);
А теперь в этой части, где или как я должен вставить "result1".

Еще раз благодарю вас за ваше терпение.

Maciej Los

Sql-запрос должен выглядеть так:

Dim sqlText As String = "UPDATE Expenses SET [Description] = @description, Payment = @payment, Price = @price, [Date] = @date WHERE ID = @id"

Далее вы должны добавить параметры в команду:
command.Parameters.Add(new SqlParameter("@description", txtItemDescFixCost.Text))
command.Parameters.Add(new SqlParameter("@payment", txtItemDescFixCost.Text))
command.Parameters.Add(new SqlParameter("@price", txtPriceFixCost.Text ))
command.Parameters.Add(new SqlParameter("@date", datetimepicker1.Value))
command.Parameters.Add(new SqlParameter("@id", txtID.text))


Наконец, вы должны позвонить command.ExecuteNonQuery() метод обновления вашей базы данных.
Dim rowsafected = command.ExecuteNonQuery()If rowsafected = 0 Then
    'update failed!
Else
    'success!
End If

Maciej Los

Кроме того, вы можете использовать: AddWithValue() метод добавления нового параметра со значением. Видеть: Коллекции sqlparametercollection.Метод AddWithValue(String, Object) (System.Data.SqlClient) | Microsoft Docs[^]

Member 13410460

Спасибо вам за то, что вы написали код, очень любезно с вашей стороны, но этот код, который вы написали, делает то же самое, что и тот, который написал Я, но делает это в ado.net путь, но это не ответит на мой первоначальный вопрос, который заключается в том, как я могу вставлять эти значения каждый месяц в течение 5 лет автоматически.

Maciej Los

Вам нужно использовать цикл ;)

Dim startdate As DateTime = datetimepicker1.Value
Dim enddate As DateTime  = startdate.AddYears(5);
Do While (startdate<=enddate)
    'your insert code here
    'query = "INSERT INTO TableName (Field1, Field2,... FieldN) VALUES (@param1, @param2, ... @paramN)"
    'add parameters here
    startdate = startdate.AddMonths(1)
Loop 

Member 13410460

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

Member 13410460

Это то, что я пытался сделать, и это не показывает мне вообще, даже ошибки:

Dim dt As DataTable = новый DataTable()
Дим начальная дата как datetime = DateTimePickerFixCosts1.Значение
Dim enddate As DateTime = startdate.AddMonths(txtNumberofMonths.Text)

Попробуй
Использование соединения в качестве нового SqlConnection("Provider = sqloledb;Data Source=ELVIS\SQLEXPRESS;Initial Catalog=Expenses;Trusted_Connection=yes;")
соединение.Открыть()
Делать пока (начальная дата &ЛТ;= конечная дата)
Используя команду как новая команда sqlcommand("обновление Test_Table набор [описание] = @Описание, оплата = @оплата, цена = @цена, [дата] = @дата где ID = @ID в", соединения)
Использование reader в качестве команды SqlDataReader=.Метода executereader()
команда.Параметры.Добавить(новый SqlParameter ("@description", TxtItemDescFixCosts.Text))
команда.Параметры.Добавить(новый SqlParameter ("@payment", TxtPaymentFixCosts.Text))
команда.Параметры.Добавить(новый SqlParameter ("@price", txtPriceFixCosts.Text))
команда.Параметры.Add(New SqlParameter ("@date", DateTimePickerFixCosts1.Value))
команда.Параметры.Добавить(новый SqlParameter ("@id", TxtIDFixCosts.Text))
dt.Load(считыватель)

startdate = начальная дата.AddMonths(txtNumberofMonths.Text)
Dim rowsafected = команда.Метод executenonquery()
Если rowsafected = 0, то
- обновление не удалось!
Еще
- успех!
Конец, Если

Конец Использования

Конец Использования
Петля
Конец Использования

Поймать Ex Как Исключение
Приставка.WriteLine(Напр.Сообщение)
Конец Попытки


Если dt.строки.Количество = 0 Тогда
- что-то пошло не так!
Конец, Если

Maciej Los

Как я уже упоминал в своем предыдущем комментарии, чтобы вставить, обновить или удалить, вам нужно использовать метод ExecuteNonQuery. Пожалуйста, внимательно прочтите мои слова. Чтобы захватить данные (select), вы должны использовать метод ExecuteReader.

Member 13410460

Извините, я не очень хорошо знаком с этим ado.net-сегодня мой первый день, когда я это делаю. Я постараюсь все исправить. Спасибо

Member 13410460

например, я изменил на это, это метод Exectutenonquerry :
команда.Параметры.AddWithValue ("@description", TxtItemDescFixCosts.Text)

команда.Параметры.AddWithValue ("@payment", TxtPaymentFixCosts.Text)
команда.Параметры.AddWithValue ("@price", txtPriceFixCosts.Text)
команда.Параметры.AddWithValue ("@date", DateTimePickerFixCosts1.Value)
команда.Параметры.AddWithValue ("@id", TxtIDFixCosts.Text)

Все еще не работает

Maciej Los

Что значит "не работает"? Вы проверяли наличие записей?

Member 13410460

Да, я так и сделал. Может быть, есть другой способ ?

Maciej Los

Была ли ваша база данных обновлена или нет? Какая у вас строка подключения?
Есть много вещей, которые нужно проверить.

Maciej Los

Проверьте это, чтобы получить правильную строку подключения: Строки подключения SQL Server - ConnectionStrings.com[^]

Member 13410460

Здравствуйте, Итак, я изменил свой код, просто в качестве теста я попробовал этот, и он дает мне бесконечные записи в моей таблице данных, что я делаю не так?

Дим начальная дата как datetime = DateTimePickerFixCosts1.Текст
Dim enddate As DateTime = startdate.AddMonths(Конвертировать.ToInt32(txtNumberofMonths.Text))
'Dim enddate As DateTime = startdate.AddMonths(txtNumberofMonths.Text)

Const query As String = "вставить в Test_Table(дата,описание,оплата,Количество,Цена,отдел,статус) значения (@date,@description,@payment,@quantity,@price,@department,@status)"
Делать пока (начальная дата &ЛТ;= конечная дата)
Использование conn в качестве SqlConnection = New SqlConnection("источник данных=####\SQLEXPRESS;начальный каталог=расходы;Trusted_Connection=yes;")
Использование команды As SqlCommand = New SqlCommand(query, conn)
команда.Параметры.AddWithValue ("@description", TxtItemDescFixCosts.Text)
команда.Параметры.AddWithValue ("@payment", TxtPaymentFixCosts.Text)
команда.Параметры.AddWithValue ("@price", txtPriceFixCosts.Text)
команда.Параметры.AddWithValue ("@date", DateTimePickerFixCosts1.Value)
команда.Параметры.AddWithValue ("@status", ComboBox1.Text)
команда.Параметры.AddWithValue ("@quantity", TextBoxIDd.Text)
команда.Параметры.AddWithValue ("@department", TxtFixCosts.Text)

Коннектикут.Открыть()
команда.ExecuteNonQuery() ' NB: не используйте ExecuteReader, когда запрос ничего не возвращает!

Конец Использования

Конец Использования
Петля

Пожалуйста помочь,
Благословения

Рейтинг:
0

Otekpo Emmanuel

Я не знаю точно, что вы ищете, но с этим "тогда я попытался использовать текстовое поле, которое я вставляю 12( как 12 месяцев) и записываю все эти значения 12 раз в течение одного года", я даю вам решение, которое может удовлетворить ваши потребности, иначе дайте мне знать.

For i = 1 To 12
  'Place your insertion codes here
Next

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


Member 13410460

Спасибо Вам за ваш asnwer г-н Эммануэль, это будет записывать данные 12 раз в одну и ту же дату в моей базе данных, я хочу записывать их ежемесячно для exmaple;
На 01 января 2015 года все 5 записей должны быть вставлены затем
На 01.Февраль.2015 снова все 5 записей должны быть вставлены и так далее, так далее в течение 5 лет.
Избегайте формата данных, так как я взял его только для примера.