2014-01-16 2 views
0

У меня проблема, и я не знаю, где проблема. Моя визуальная студия выдает исключение, когда я ввожу детали и нажимаю кнопку отправки на моей странице REGISTER. Я не знаю, проблема заключается в моем SQL запросе или мой code.So я отправляю какОшибка преобразования типа данных nvarchar в int

Это мой Sql запрос:

 Create proc spRegisteredUsers 

     @Name nvarchar(100), 
     @UserName nvarchar(100), 
     @Password nvarchar(200), 
     @ContactNo int, 
     @Email nvarchar(200) 
     as 
     Begin 

     Declare @Count int 
     Declare @ReturnCode int 

     Select @Count = COUNT(UserName) 
     from tblRegisteredUsers where [email protected] 
     if @Count>0 
     Begin 
     Set @ReturnCode= -1 
     End 
     Else 
     Begin 
     Set @ReturnCode= 1 
     Insert into tblRegisteredUsers values(@Name,@UserName,@Password,@ContactNo,@Email) 
     End 
     Select @ReturnCode as ReturnValue 
     End 

тогда я получаю исключение на линии ниже:

  protected void btnRegSubmit_Click(object sender, EventArgs e) 
      { 
     if (Page.IsValid) 
      { 
      string CS = ConfigurationManager.ConnectionStrings["AK"].ConnectionString; 
      using (SqlConnection con = new SqlConnection(CS)) 
      { 
      SqlCommand cmd = new SqlCommand("spRegisteredUsers", con); 
      cmd.CommandType = CommandType.StoredProcedure; 

      SqlParameter Name = new SqlParameter("@Name", txtRegName.Text); 
      SqlParameter UserName = new SqlParameter("@UserName", txtRegUsername.Text); 
      SqlParameter Password = new SqlParameter("@Password", txtRegPassword.Text); 
      SqlParameter ContactNo = new SqlParameter("@ContactNo", txtRegContact.Text); 
      SqlParameter Email = new SqlParameter("@Email", txtRegEmail.Text); 

      cmd.Parameters.Add(Name); 
      cmd.Parameters.Add(UserName); 
      cmd.Parameters.Add(Password); 
      cmd.Parameters.Add(ContactNo); 
      cmd.Parameters.Add(Email); 

      con.Open(); 
      int ReturnCode = Convert.ToInt32(cmd.ExecuteScalar().ToString()); 
      if (ReturnCode == -1) 
      { 
       lblMessage.Text = "UserName already exists."; 
      } 
      else 
      { 
       Response.Redirect("~/Login.aspx"); 
      } 
     } 
    } 

} 

Одна забавная вещь, которую я видел. Когда я удаляю поля Name и ContactNo из таблицы, хранимую процедуру и cs code.IT WORKS.

+1

Какая ошибка? – Amit

+1

Не так много полезного, сообщите полную ошибку и как вы добавляете параметры в свою команду? –

+0

Ошибка преобразования типа данных nvarchar в int. – Mash

ответ

2

попробуйте вместо этого:

using (SqlConnection con = new SqlConnection(CS)) 
      { 
      SqlCommand cmd = new SqlCommand("spRegisteredUsers", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      //use long instead... 
      long Contact = Convert.ToInt64(txtRegContact.Text); //convert to long here 

      SqlParameter Name = new SqlParameter("@Name", txtRegName.Text); 
      SqlParameter UserName = new SqlParameter("@UserName", txtRegUsername.Text); 
      SqlParameter Password = new SqlParameter("@Password", txtRegPassword.Text); 

      SqlParameter ContactNo = new SqlParameter("@ContactNo", Contact); 

      SqlParameter Email = new SqlParameter("@Email", txtRegEmail.Text); 
      ...... 

вы передаете строку и SQL процедура ожидает Int для ContactNo.

+0

Теперь я получаю совсем другую ошибку «Значение было слишком большим или слишком маленьким для Int32». поэтому я изменил contactno от int до bigint в таблицах и хранимых процедурах. Однако я не изменил код. – Mash

+0

есть ли ошибка после изменения bigint? Может быть, лучше иметь «varchar» для контактной информации? – Milen

+0

Я получаю такое же сообщение об ошибке после изменения bigint – Mash

0

Возможно, вы столкнетесь с ошибкой в ​​первой строке. Попробуйте это:

int ReturnCode = Convert.ToInt32(cmd.ExecuteScalar().ToString()); 
+0

Это не помогло. Я получаю то же самое старое сообщение об ошибке, когда я пытаюсь отправить детали. – Mash

+0

ExecuteScalar() возвращает то, что нельзя отличить от int, и, следовательно, вы видите ошибку. Итак, первое, что вы можете проверить, это то, что ExecuteScalar() действительно возвращается. Вы можете использовать отладчик или вывести «ExecuteScalar(). GetType(). ToString()», и это даст вам тип возвращаемого. – Zafua

+0

ok будет делать это. В то же время я опубликовал весь код. Проверьте, полезен ли он. – Mash

Смежные вопросы