Не знаю, почему это не работает.
У меня есть простая форма с некоторыми текстовыми полями и выпадающими списками. Отображает профиль сотрудника. Пользователи должны иметь возможность вручную редактировать поля и нажимать «Сохранить». Когда они нажимают сохранить, я продолжаю получать ошибки.
Вопрос 1. Как обработать вставку значений Null для типов данных SmallDateTime?
Q2: Что я делаю неправильно с TinyInt (SqlServer 2005) в JobGrade?
Option Explicit On
Imports System
Imports System.Data
Imports System.Data.SqlClient
Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
Dim sqlJobsDB As New SqlConnection(ConfigurationManager.ConnectionStrings("JobsDB").ConnectionString)
Dim sqlCmdUpdate As SqlCommand = sqlJobsDB.CreateCommand()
Try
sqlJobsDB.Open()
sqlCmdUpdate.CommandText = _
"UPDATE tblEmployee " + _
"SET Firstname = @Firstname, LastName = @LastName, HiredLastName = @HiredLastName, " + _
"DateHired = @DateHired, Role = @Role, CADate = @CADate, CAType = @CAType, " + _
"JobDate = @JobDate, JobGrade = @JobGrade " + _
"WHERE EUID = '" & Session("sProfileEUID") & "';"
sqlCmdUpdate.Parameters.Add("@FirstName", SqlDbType.VarChar)
sqlCmdUpdate.Parameters.Add("@LastName", SqlDbType.VarChar)
sqlCmdUpdate.Parameters.Add("@HiredLastName", SqlDbType.VarChar)
sqlCmdUpdate.Parameters.Add("@DateHired", SqlDbType.SmallDateTime)
sqlCmdUpdate.Parameters.Add("@Role", SqlDbType.VarChar)
sqlCmdUpdate.Parameters.Add("@CADate", SqlDbType.SmallDateTime)
sqlCmdUpdate.Parameters.Add("@CAType", SqlDbType.VarChar)
sqlCmdUpdate.Parameters.Add("@JobDate", SqlDbType.SmallDateTime)
sqlCmdUpdate.Parameters.Add("@JobGrade", SqlDbType.TinyInt)
sqlCmdUpdate.Parameters("@FirstName").Value = txtFirstName.Text
sqlCmdUpdate.Parameters("@LastName").Value = txtLastName.Text
sqlCmdUpdate.Parameters("@HiredLastName").Value = txtHiredLastName.Text
sqlCmdUpdate.Parameters("@DateHired").Value = txtDateHired.Text
sqlCmdUpdate.Parameters("@Role").Value = ddlRole.SelectedValue.ToString
If txtCADate.Text = "" Then
sqlCmdUpdate.Parameters("@CADate").Value = 0
Else
sqlCmdUpdate.Parameters("@CADate").Value = txtCADate.Text
End If
sqlCmdUpdate.Parameters("@CAType").Value = ddlCAType.SelectedValue
If txtJobDate.Text = "" Then
sqlCmdUpdate.Parameters("@JobDate").Value = 0
Else
sqlCmdUpdate.Parameters("@JobDate").Value = txtJobDate.Text
End If
sqlCmdUpdate.Parameters("@JobGrade").Value = CByte(txtJobGrade.Text)
sqlCmdUpdate.ExecuteNonQuery()
Catch ex As Exception
'Debugging
lblErrMsg.Text = ex.ToString
lblErrMsg.Visible = True
Finally
sqlJobsDB.Close()
End Try
End Sub</code>
I open the form and fill it out correctly. I'll enter something like "4" (no quotes) for JobGrade. It still says "conversion from strink ''" like its not even seeing when I input items on the form.
Ошибки ниже:
System.InvalidCastException: преобразование строки "" в тип "Byte" недопустимо. ---> System.FormatException: Входная строка имеет неверный формат. в Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat) в Microsoft.VisualBasic.CompilerServices.Conversions.ToByte(String Value) --- Конец внутренней трассировки стека исключений --- в Microsoft.VisualBasic.CompilerServices. Conversions.ToByte (строковое значение) в Profile.btnSave_Click (отправитель объекта, EventArgs e) в
Обновить
Проблема DBNull.Value решена. JobGrade и Role все еще остаются проблемами. При создании некоторых точек останова он не извлекает содержимое текстового поля или раскрывающегося списка.
** Updated Code **
Protected Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click Session("sProfileEUID") = Nothing Response.Redirect("~/Management/EditUsers.aspx") End Sub Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click Dim sqlJobsDB As New SqlConnection(ConfigurationManager.ConnectionStrings("JobsDB").ConnectionString) Dim sqlCmdUpdate As SqlCommand = sqlJobsDB.CreateCommand() Try sqlJobsDB.Open() sqlCmdUpdate.CommandText = _ "UPDATE tblEmployee " + _ "SET FirstName = @FirstName, LastName = @LastName, HiredLastName = @HiredLastName, " + _ "DateHired = @DateHired, Role = @Role, CADate = @CADate, CAType = @CAType, " + _ "JobDate = @JobDate, JobGrade = @JobGrade " + _ "WHERE EUID = '" & Session("sProfileEUID") & "';" sqlCmdUpdate.Parameters.Add("@FirstName", SqlDbType.VarChar) sqlCmdUpdate.Parameters.Add("@LastName", SqlDbType.VarChar) sqlCmdUpdate.Parameters.Add("@HiredLastName", SqlDbType.VarChar) sqlCmdUpdate.Parameters.Add("@DateHired", SqlDbType.SmallDateTime) sqlCmdUpdate.Parameters.Add("@Role", SqlDbType.VarChar) sqlCmdUpdate.Parameters.Add("@CADate", SqlDbType.SmallDateTime) sqlCmdUpdate.Parameters.Add("@CAType", SqlDbType.VarChar) sqlCmdUpdate.Parameters.Add("@JobDate", SqlDbType.SmallDateTime) sqlCmdUpdate.Parameters.Add("@JobGrade", SqlDbType.TinyInt) sqlCmdUpdate.Parameters("@FirstName").Value = txtFirstName.Text sqlCmdUpdate.Parameters("@LastName").Value = txtLastName.Text sqlCmdUpdate.Parameters("@HiredLastName").Value = txtHiredLastName.Text sqlCmdUpdate.Parameters("@DateHired").Value = txtDateHired.Text sqlCmdUpdate.Parameters("@Role").Value = ddlRole.SelectedValue.ToString If txtCADate.Text <> "" Then sqlCmdUpdate.Parameters("@CADate").Value = CDate(txtCADate.Text) If txtCADate.Text = "" Then sqlCmdUpdate.Parameters("@CADate").Value = DBNull.Value If ddlCAType.Text <> "" Then sqlCmdUpdate.Parameters("@CAType").Value = ddlCAType.SelectedValue If ddlCAType.Text = "" Then sqlCmdUpdate.Parameters("@CAType").Value = DBNull.Value If txtJobDate.Text <> "" Then sqlCmdUpdate.Parameters("@JobDate").Value = CDate(txtJobDate.Text) If txtJobDate.Text = "" Then sqlCmdUpdate.Parameters("@JobDate").Value = DBNull.Value If txtJobGrade.Text <> "" Then sqlCmdUpdate.Parameters("@JobGrade").Value = CInt(txtJobGrade.Text) If txtJobGrade.Text = "" Then sqlCmdUpdate.Parameters("@JobGrade").Value = DBNull.Value sqlCmdUpdate.ExecuteNonQuery() Catch ex As Exception lblErrMsg.Text = ex.ToString lblErrMsg.Visible = True Finally sqlJobsDB.Close() End Try End Sub
Редактировать 2:
Поэтому я в значительной степени отказался от этого и вместо этого переместил таблицу в FormView ItemTemplate, а также в EditTemplate. Я изменил его, как описано в следующей ссылке. http://www.beansoftware.com/ASP.NET-Tutorials/FormView-Control.aspx