Почему некоторые пользовательские данные не обновляются с использованием SQL в C # winform? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть 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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...