У меня есть 10 столбцов, но только последние 3 можно редактировать / обновлять.Я использую C # Winform и SQL Server.
Вот мой код
DataRow row = (dataGridSrch.SelectedRows[0].DataBoundItem as DataRowView).Row;
using (SqlConnection conn = new SqlConnection(@"Server=" + ip + "," + port + "; Database=records; User ID=" + sqlid + "; Password=" + sqlpass + ""))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(@"UPDATE [dbo].[products]
SET Item = @UItem, Brand = @UBrand, [Part No.] = @UPart, Description = @UDesc, Manufacturer = @UManu, Car = @UCar, Year = @UYear
WHERE Item = @EItem AND Brand = @EBrand AND [Part No.] = @EPart AND Description = @EDesc AND Manufacturer = @EManu AND Car = @ECar AND Year = @EYear", conn))
{
cmd.Parameters.AddWithValue("@UItem", txtEItem.Text);
cmd.Parameters.AddWithValue("@UBrand", txtEBrand.Text);
cmd.Parameters.AddWithValue("@UPart", txtEPart.Text);
cmd.Parameters.AddWithValue("@UDesc", txtEDesc.Text);
cmd.Parameters.AddWithValue("@UManu", txtEMan.Text);
cmd.Parameters.AddWithValue("@UCar", txtECar.Text);
cmd.Parameters.AddWithValue("@UYear", txtEYr.Text);
if (String.IsNullOrEmpty(row["Item"].ToString()))
{
cmd.Parameters.AddWithValue("@EItem", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@EItem", row["Item"].ToString()); }
if (String.IsNullOrEmpty(row["Brand"].ToString()))
{
cmd.Parameters.AddWithValue("@EBrand", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@EBrand", row["Brand"].ToString()); }
if (String.IsNullOrEmpty(row["Part No."].ToString()))
{
cmd.Parameters.AddWithValue("@EPart", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@EPart", row["Part No."].ToString()); }
if (String.IsNullOrEmpty(row["Description"].ToString()))
{
cmd.Parameters.AddWithValue("@EDesc", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@EDesc", row["Description"].ToString()); }
if (String.IsNullOrEmpty(row["Manufacturer"].ToString()))
{
cmd.Parameters.AddWithValue("@EManu", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@EManu", row["Manufacturer"].ToString()); }
if (String.IsNullOrEmpty(row["Car"].ToString()))
{
cmd.Parameters.AddWithValue("@ECar", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@ECar", row["Car"].ToString()); }
if (String.IsNullOrEmpty(row["Year"].ToString()))
{
cmd.Parameters.AddWithValue("@EYear", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@EYear", row["Year"].ToString()); }
cmd.ExecuteNonQuery();
}
using (SqlCommand cmd = new SqlCommand(@"UPDATE [dbo].[products]
SET Price = @UPrice , Stock = @UStock , Unit = @UUnit
WHERE Item = @EItem AND Brand = @EBrand AND [Part No.] = @EPart", conn))
{
cmd.Parameters.AddWithValue("@UPrice", eprice);
cmd.Parameters.AddWithValue("@UStock", eqty);
cmd.Parameters.AddWithValue("@UUnit", eunit);
if (String.IsNullOrEmpty(row["Item"].ToString()))
{
cmd.Parameters.AddWithValue("@EItem", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@EItem", row["Item"].ToString()); }
if (String.IsNullOrEmpty(row["Brand"].ToString()))
{
cmd.Parameters.AddWithValue("@EBrand", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@EBrand", row["Brand"].ToString()); }
if (String.IsNullOrEmpty(row["Part No."].ToString()))
{
cmd.Parameters.AddWithValue("@EPart", DBNull.Value);
}
else { cmd.Parameters.AddWithValue("@EPart", row["Part No."].ToString()); }
int update = cmd.ExecuteNonQuery();
}
conn.Close();
}
База данных принимает нулевое значение от столбцов 1 до 10. Поэтому некоторые данные, а не вся строка, имеют null
значения в указанных столбцах
Столбцы 1 - 7 и 10, имеют DataType
из varchar(50)
.
Столбец 8 - это цена, имеют DataType
изdecimal(18,2)
.Который получит пользовательский ввод, используя NumericUpDown
, а затем будет преобразован в double
.
double eprice = Convert.ToDouble(numEPrice.Value);
Столбец 9 - Stock, имеет DataType
из int
.
Параметры основаны на выбранной пользователем строке из DataGridView
, которая заполняется Database
.Но при редактировании / обновлении данных обновляются только столбцы 8, 9 и 10.Я попытался изменить свою команду SQL на
using (SqlCommand cmd = new SqlCommand(@"UPDATE [dbo].[products]
SET Item = @UItem, Brand = @UBrand, [Part No.] = @UPart, Description = @UDesc, Manufacturer = @UManu, Car = @UCar, Year = @UYear
WHERE Item = @EItem AND Brand = @EBrand AND [Part No.] = @EPart AND Description = @EDesc AND Manufacturer = @EManu AND Car = @ECar AND Year = @EYear;
UPDATE [dbo].[products]
SET Price = @UPrice, Unit = @UUnit
WHERE Item = @EItem AND Brand = @EBrand AND [Part No.] = @EPart", conn))
Я также попытался удалить запрос на обновление столбцов 8, 9 и 10 и чередовать запрос Update
.
Но я могуобновить с помощью моего SQL Server
.
РЕДАКТИРОВАТЬ:
Что касается предложения SeM, я изменил мое условие if-else на это
cmd.Parameters.AddWithValue("@EItem", row.IsNull("Item") ? (object)DBNull.Value : row.Field<string>("Item"));
cmd.Parameters.AddWithValue("@EBrand", row.IsNull("Brand") ? (object)DBNull.Value : row.Field<string>("Brand"));
cmd.Parameters.AddWithValue("@EPart", row.IsNull("Part No.") ? (object)DBNull.Value : row.Field<string>("Part No."));
cmd.Parameters.AddWithValue("@EDesc", row.IsNull("Description") ? (object)DBNull.Value : row.Field<string>("Description"));
cmd.Parameters.AddWithValue("@EManu", row.IsNull("Manufacturer") ? (object)DBNull.Value : row.Field<string>("Manufacturer"));
cmd.Parameters.AddWithValue("@ECar", row.IsNull("Car") ? (object)DBNull.Value : row.Field<string>("Car"));
cmd.Parameters.AddWithValue("@EYear", row.IsNull("Year") ? (object)DBNull.Value : row.Field<string>("Year"));