2015-01-23 2 views
1

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

на этой линии

cmd1.ExecuteNonQuery();

Пожалуйста, смотрите код для справки: -

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultCSRConnection"].ConnectionString); 
      using (SqlCommand cmd = conn.CreateCommand()) 
      { 
       conn.Open(); 
       SqlCommand cmd1 = new SqlCommand("Insert into tbl_expense_category (NgoId,expense_category_name,expense_category_description,active) values(@NgoId,@expense_category_name, @expense_category_description,@active)", conn); 
       cmd1.Parameters.Add("@NgoId", SqlDbType.Int).Value = ddlNgoName.SelectedValue; 
       cmd1.Parameters.Add("@expense_category_name", SqlDbType.Int).Value = txtExpenseCat.Text; 
       cmd1.Parameters.Add("@expense_category_description", SqlDbType.NVarChar).Value = txtEspenseDesc.Text; 
       cmd1.Parameters.Add("@active", SqlDbType.Bit).Value = chkActive.Checked; 
       cmd1.ExecuteNonQuery(); 
       conn.Close(); 
       ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('Expenses added sucessfully');window.location ='csrexpensecategorylist.aspx';", true); 
      } 

Пожалуйста, укажите, где я неправильно.

+0

Соответствует ли ваш SqlDbType типом в БД? – Aaron

+0

вам нужно разобрать значения до их правильных типов, а не использовать текстовые значения и т. Д. – Ric

+0

Запустите его в отладчике и посмотрите, что такое значение 'ddlNgoName.SelectedValue' и' txtExpenseCat.Text'. Действительно ли 'account_category_name'' int'? –

ответ

1

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

cmd1.Parameters.Add("@NgoId", SqlDbType.Int).Value = 
        ddlNgoName.SelectedValue; 
cmd1.Parameters.Add("@expense_category_name", SqlDbType.Int).Value = 
        txtExpenseCat.Text; 

Например это представляется более целесообразным, учитывая имена полей

cmd1.Parameters.Add("@NgoId", SqlDbType.Int).Value = 
        Convert.ToInt32(ddlNgoName.SelectedValue); 

cmd1.Parameters.Add("@expense_category_name", SqlDbType.NVarChar, 255).Value = 
        txtExpenseCat.Text; 
+0

На самом деле мне нужно изменить тип DB для '@ cost_category_name', как в таблице, указанной как« nvarchar ». –

+0

Ну, если вам нужно целое число, вы возвращаете SqlDbType.Int и добавляете преобразование в TextBox. – Steve

+1

Да, вы правы, но мне не нужно целое число. Моя логика заключалась в том, чтобы добавить текст для этой колонки. Большое спасибо. –

0

Прежде всего, кажется, что вы используете два SqlCommand. Вы не нуждаетесь в них обоих; попробуйте использовать один, как это:

conn.Open(); 
using (SqlCommand command = new SqlCommand(
     "Insert into tbl_expense_category (NgoId, expense_category_name, expense_category_description, active) values (@NgoId, @expense_category_name, @expense_category_description, @active)", 
     conn)) 
     { 
       command.Parameters.Add("@NgoId", SqlDbType.Int).Value = Convert.ToInt32(ddlNgoName.SelectedValue); 
       command.Parameters.Add("@expense_category_name", SqlDbType.Int).Value = Convert.ToInt32(txtExpenseCat.Text); 
       command.Parameters.Add("@expense_category_description", SqlDbType.NVarChar).Value = txtEspenseDesc.Text; 
       command.Parameters.Add("@active", SqlDbType.Bit).Value = chkActive.Checked; 
       command.ExecuteNonQuery(); 
     } 
conn.Close(); 

Во-вторых, вы должны знать, что это хорошая практика, открыть соединение перед using директивы, особенно при отправке более 1 команды в базе данных.

В-третьих, вы должны правильно использовать типы значений. Если вы используете целые числа, присвойте целочисленные значения параметрам.

Я отредактировал код для вас.

Надеюсь, это ответит на ваш вопрос.

+0

Хорошая привязка к дополнительной команде, но вам не нужно открывать соединение до 'using'. –

+0

Вы правы, я думаю, что это хорошая практика. Я заменил «must» на «хорошо» :) –

+0

Почему вы думаете, что это хорошая практика? Лучшие практики, которые я видел (и что делают примеры в MSDN), - это открыть соединение непосредственно перед выполнением команды. –