Member 13857678 Ответов: 3

Что я должен исправить ?


Необработанное исключение типа "System.Data.SqlClient.SqlException" произошло в System.Data.dll

Дополнительная информация: Необходимо объявить скалярную переменную "@LastName".

Что я уже пробовал:

String ConnectionString, SQL;
ConnectionString = "Data Source=DESKTOP-411ATJG\\SQLEXPRESS; Initial Catalog=CarRental; Integrated Security=True";
SQL = "Update Customers SET LastName=@LastName,phone=@phone,Address=@Address where CustID=@CustID ";
SqlConnection conn = new SqlConnection(ConnectionString);
SqlCommand cmd = conn.CreateCommand();

cmd.CommandText = SQL;
cmd.Parameters.Add("@CustID", SqlDbType.Int).Value = Convert.ToInt32(cust.ToString());

if (ULN.Text != "")
{
    cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = ULN.Text;
}

if (UAddress.Text != "")
{
    cmd.Parameters.Add("@Address", SqlDbType.VarChar).Value = UAddress.Text;
}

if (UPhone.Text != "")
{
    cmd.Parameters.Add("@phone", SqlDbType.Int).Value = Convert.ToInt32(UPhone.ToString());
}

conn.Open();
cmd.ExecuteNonQuery();

cmd.Parameters.Clear();
conn.Close();

3 Ответов

Рейтинг:
1

Jochen Arndt

Вы должны всегда указывать параметры, определенные в строке запроса. Поскольку вы обновляете набор записей и не хотите изменять все поля, вам придется использовать разные командные строки SQL.

Для этого можно использовать подстроку:

SqlCommand cmd = conn.CreateCommand();
cmd.Parameters.Add("@CustID", SqlDbType.Int).Value = Convert.ToInt32(cust.ToString());
String queryParams;
if (ULN.Text != "")
{
    queryParams = "LastName=@LastName"; 
    cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = ULN.Text; 
}
if (UAddress.Text != "") 
{ 
    if (queryParams != "")
        queryParams += ","; 
    queryParams += "Address=@Address"; 
    cmd.Parameters.Add("@Address", SqlDbType.VarChar).Value = UAddress.Text; 
}
if (UPhone.Text != "") 
{ 
    if (queryParams != "")
        queryParams += ","; 
    queryParams += "phone=@phone"; 
    cmd.Parameters.Add("@phone", SqlDbType.Int).Value = Convert.ToInt32(UPhone.ToString());
}
cmd.CommandText = "UPDATE Customers SET " + queryParams + " WHERE CustID=@CustID";


Рейтинг:
0

Mehdi Gholam

Вы определили @LastName в вашем запросе, но вы условно предоставляете значение для него (не все время).


Рейтинг:
0

Nathan Minier

УЛЬН.Текст равен нулю, вот почему вы получаете эту ошибку. Вам нужно добавить значения по умолчанию к вашим параметрам или построить свой SQL-запрос во время выполнения. Я предлагаю оператор нулевого разрешения, а не операторы if.

Я также предлагаю ключевое слово" using", чтобы обеспечить правильную утилизацию и избежать утечек памяти.

var ConnectionString = "Data Source=DESKTOP-411ATJG\\SQLEXPRESS; Initial Catalog=CarRental; Integrated Security=True";
var SQL = "Update Customers SET LastName=@LastName,phone=@phone,Address=@Address where CustID=@CustID";

using(SqlConnection conn = new SqlConnection(ConnectionString)){
   using(SqlCommand cmd = conn.CreateCommand())
   {
      cmd.CommandText = SQL;
      cmd.Parameters.Add("@CustID", SqlDbType.Int).Value = 
Convert.ToInt32(cust.ToString());
      cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = ULN.Text ?? string.Empty; 
      cmd.Parameters.Add("@Address", SqlDbType.VarChar).Value = UAddress.Text ?? string.Empty; 
      cmd.Parameters.Add("@phone", SqlDbType.Int).Value = UPhone.Text != null ? Convert.ToInt32(UPhone.Text.ToString()) : 0; 
      conn.Open();
      cmd.ExecuteNonQuery();
   }
}


Member 13857678

Спасибо ребята но это не сработало я думаю что проблема в sql потому что я не могу выполнить ни одного запроса