2016-08-30 5 views
0

Это в основном метод вставки записи в таблицу. Он отлично работал, прежде чем я решил добавить, чтобы проверить, существует ли идентификатор клиента в базе данных. Я получаюОшибка SqlException при вставке в базу данных

«System.Data.SqlClient.SqlException» произошло в System.Data.dll, но не был обработан в пользовательском коде

Дополнительная информация: Процедура или функция InsertCustomer имеет слишком много аргументов, указанных.

на линии

command.ExecuteNonQuery(); 

Я не понимаю, что это неправильно.

public void add() 
{ 
    lblMessage.Text = ""; 
    command.Connection = conn; 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "CheckDetails"; 
    command.Parameters.AddWithValue("@CustID", txtCID.Text); 
    conn.Open(); 
    int check = (int)command.ExecuteScalar(); 

    if (check == 0) 
    { 
     command.CommandText = "InsertCustomer"; 
     command.Parameters.Add("@CustID", SqlDbType.Int).Value = txtCID.Text; 
     command.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFName.Text; 
     command.Parameters.Add("@Surname", SqlDbType.VarChar).Value = txtLName.Text; 
     command.Parameters.Add("@Gender", SqlDbType.VarChar).Value = rdoGender.Text; 
     command.Parameters.Add("@Age", SqlDbType.Int).Value = txtAge.Text; 
     command.Parameters.Add("@Address1", SqlDbType.VarChar).Value = txtAdd1.Text; 
     command.Parameters.Add("@Address2", SqlDbType.VarChar).Value = txtAdd2.Text; 
     command.Parameters.Add("@City", SqlDbType.VarChar).Value = txtCity.Text; 
     command.Parameters.Add("@Phone", SqlDbType.VarChar).Value = txtPhone.Text; 
     command.Parameters.Add("@Mobile", SqlDbType.VarChar).Value = txtMobile.Text; 
     command.Parameters.Add("@Email", SqlDbType.VarChar).Value = txtEmail.Text; 

     command.ExecuteNonQuery(); 

     lblMessage.Text = "Customer Details Added."; 
    } 
    else 
    { 
     lblMessage.Text = "Customer ID already exists."; 
    } 

    conn.Close(); 
} 

ответ

3

Вы добавляете один и тот же параметр дважды:

command.Parameters.AddWithValue("@CustID", txtCID.Text); 
// .... 
command.Parameters.Add("@CustID", SqlDbType.Int).Value = txtCID.Text; 

Вы можете использовать command.Parameters.Clear();. Но я бы предпочел использовать два разных SqlCommands для двух процедур CheckDetails и InsertCustomer, чтобы избежать таких проблем.

Боковое примечание: не позволяйте базе данных использовать значение для вас. Используйте int.TryParse.

+0

чем причина вы не хотите, база данных, чтобы попытаться бросить его? Извините, если это глупый quesiton. Я все еще начинающий программист. – Anon

+0

@ Невозможно: по крайней мере с помощью AddWithValue база данных должна угадать тип параметра, который может привести к неправильным планам. Но также безопаснее проверить, является ли данная строка допустимым целым числом в C#. Вы можете сразу показать сообщение об ошибке без выполнения запроса. –

0

Удалить ниже параметра из вашего заявления, вы уже добавить параметр в команде:

command.Parameters.Add("@CustID", SqlDbType.Int).Value = txtCID.Text; 
Смежные вопросы