Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么一些用户数据没有在C#winform中使用SQL进行更新?_C#_Sql Server_Winforms_Sql Update - Fatal编程技术网

为什么一些用户数据没有在C#winform中使用SQL进行更新?

为什么一些用户数据没有在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

我有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的
数据类型为
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中。