为什么一些用户数据没有在C#winform中使用SQL进行更新?
我有10列,但只有最后3列可以编辑/更新。 我正在使用C#Winform和SQL Server 这是我的密码为什么一些用户数据没有在C#winform中使用SQL进行更新?,c#,sql-server,winforms,sql-update,C#,Sql Server,Winforms,Sql Update,我有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 I
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的数据类型为varchar(50)
第8列是价格,数据类型为十进制(18,2)
。它将使用NumericUpDown
获取用户输入,然后转换为double
double eprice = Convert.ToDouble(numEPrice.Value);
第9列是库存,数据类型为int
参数基于用户从DataGridView
中选择的行,该行由数据库填充。但在编辑/更新数据时,仅更新第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"));
cmd.Parameters.AddWithValue(“@EItem”,row.IsNull(“Item”)?(object)DBNull.Value:row.Field(“Item”);
cmd.Parameters.AddWithValue(“@EBrand”,row.IsNull(“品牌”)?(对象)DBNull.Value:row.Field(“品牌”);
cmd.Parameters.AddWithValue(“@EPart”,row.IsNull(“零件号”)(object)DBNull.Value:row.Field(“零件号”);
cmd.Parameters.AddWithValue(“@EDesc”,row.IsNull(“Description”)?(object)DBNull.Value:row.Field(“Description”);
cmd.Parameters.AddWithValue(“@EManu”,row.IsNull(“制造商”)?(对象)DBNull.Value:row.Field(“制造商”);
cmd.Parameters.AddWithValue(“@ECar”,row.IsNull(“Car”)?(object)DBNull.Value:row.Field(“Car”);
cmd.Parameters.AddWithValue(“@EYear”,row.IsNull(“年”)?(object)DBNull.Value:row.Field(“年”);
小建议:您可以通过编写cmd.Parameters.AddWithValue(“@EItem”,row[“Item”]”。ToString()==string.Empty?(object)DBNull.Value:row[“Item”].ToString())来简化代码
(如果需要,您可以添加新行以使其更具可读性)。或者,如果它包含NULL
(来自数据库),您可以这样写:cmd.Parameters.AddWithValue(“@EItem”,row.IsNull(“Item”)?(object)DBNull.Value:row.Field(“Item”)代码>@SeM,这将缩短我的if-else条件,对吗?谢谢你的建议。Jepher yeap,不客气。这里问题的根源是对NULL如何工作的误解。零永远等于零。即使将NULL与自身进行比较也永远不会通过相等性检查。因此,当where子句中的任何列包含NULL时,where谓词将不会更新您期望的所有行。您需要将列包装在ISNULL中。