Получение ошибок с параметризованным обновлением Sub - PullRequest
1 голос
/ 26 августа 2011

Понятия не имею, почему это не работает.

У меня есть простая форма с некоторыми текстовыми полями и выпадающими списками.Он отображает профиль сотрудника.Пользователи должны иметь возможность вручную редактировать поля и нажимать Сохранить.Когда они нажимают «Сохранить», я продолжаю получать ошибки.

Q1: Как я могу справиться со вставкой нулевых значений для типов данных SmallDateTime?

Q2: Что я делаю неправильно с TinyInt (SqlServer 2005) вJobGrade?

</p> <pre><code>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

Я открываю форму и заполняю ее правильно.Я введу что-то вроде «4» (без кавычек) для JobGrade.Он по-прежнему говорит «преобразование из strink», как будто он даже не видит, когда я вводю элементы в форму.

Ниже приведены ошибки:

System.InvalidCastException: преобразование из строки «» в тип«Байт» недействителен.---> System.FormatException: входная строка была в неправильном формате.в Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble (строковое значение, NumberFormatInfo NumberFormat) в Microsoft.VisualBasic.CompilerServices.Conversions.ToByte (строковое значение) --- Конец внутренней трассировки стека исключений --- в Microsoft.VisualBasic.CompilerServices.Conversions.ToByte (String Value) в Profile.btnSave_Click (Отправитель объекта, EventArgs e) в

Обновление

Устранена проблема DBNull.Value.JobGrade и роль по-прежнему проблемы.При создании некоторых точек останова он не извлекает содержимое текстового поля или раскрывающегося списка.

** Обновленный код ** </p> <pre>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

Edit 2:

Так что я в значительной степени разочаровался в этом и вместо этого переместил таблицу в FormView ItemTemplate, также с EditTemplate.Я изменил его, как описано в следующей ссылке.http://www.beansoftware.com/ASP.NET-Tutorials/FormView-Control.aspx

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Q1: убедитесь, что в структуре таблицы разрешены значения NULL, и установите для параметра значение DBNull.Value.

Q2:

If IsNumeric(txtJobGrade.Text) Then

sqlCmdUpdate.Parameters("@JobGrade").Value = CInt(txtJobGrade.Text) 

Else

sqlCmdUpdate.Parameters("@JobGrade").Value = 0 'Or Default Value

End If

Вы всегда можете сделать это выпадающим списком, чтобы предотвратить ввод открытых данных.

1 голос
/ 31 августа 2011

Немного странно видеть, как вы настроили параметры.Как правило, я ожидал бы увидеть что-то более похожее на это:

With sqlCmdUpdate.Parameters
   .clear()
   .addWithValue("@parm1", mytextbox1.text)
   .addWithValue("@parm2", mytextbox2.text)
End With

Для одного, .add устарело - все еще работает, но следует знать о некоторых проблемах (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx).

Во-вторых, всегда лучше позвонить .clear().

Также - вы можете подумать о более стандартном подходе к проверке значений - например:

If txtJobGrade.Text <> "" Then...

Было бы лучшезаписано как

If NOT string.isnullorempty(me.txtJobGrade.text) Then...

Попробуйте внести некоторые из этих изменений и посмотрите, какие (если они есть) ошибки, которые вы все еще получаете.

...