首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在datagridview单元格中使用DBNull.Value?

如何在datagridview单元格中使用DBNull.Value?
EN

Stack Overflow用户
提问于 2022-05-05 11:14:49
回答 1查看 95关注 0票数 0

我有一种方法可以将来自Datagridview的数据插入到数据库中的表中,如果Datagridview中的所有单元格都不是Null,则可以正常工作,但如果某些单元格为空或空,则会引发错误:

参数化查询需要未提供的参数

事实上,有些单元格可以为null,而db将接受这一事实,我需要的所需单元格已经被用户强制填充,因此可选单元格可以为null。

我的方法:

代码语言:javascript
运行
复制
private void InsertAll()
{
    using (var cn = new SqlConnection(Cn.ConnectionString)) // Using block around the connection
    using (var cmd = new SqlCommand("", cn))
    {

        cmd.CommandText = @" INSERT INTO Transactions ( DocNum, Code, QtyIn, QtyOut, BalanceAfter, Remarks, Unit )
                     Values (@DocNum, @Code, @QtyIn, @QtyOut, @BalanceAfter, @Remarks,@Unit);";

        cmd.Parameters.Add("@DocNum", SqlDbType.NVarChar, 50);
        cmd.Parameters.Add("@Code", SqlDbType.NVarChar, 50);
        cmd.Parameters.Add("@QtyIn", SqlDbType.Int).Value = 0;
        cmd.Parameters.Add("@QtyOut", SqlDbType.Int).Value = 0;
        cmd.Parameters.Add("@BalanceAfter", SqlDbType.Int);
        cmd.Parameters.Add("@Remarks", SqlDbType.NVarChar, 50);
        cmd.Parameters.Add("@Unit", SqlDbType.NVarChar, 10);

        var qtyKey = (txtTransType.Text == "Release") ? "@QtyOut" : "@QtyIn";

        for (int i = 0; i < DGV1.Rows.Count; i++)
        {
            // These are 3 key fields which can't be null and I force the user to fill .
            // So no need to check if null cause it always will have some value .
            
            cmd.Parameters["@DocNum"].Value = txtDocNum.Text;
            cmd.Parameters["@Code"].Value = DGV1.Rows[i].Cells["Code"].Value;
            cmd.Parameters[qtyKey].Value = DGV1.Rows[i].Cells["Qty"].Value;

            // The rest is the optional cells that the db accepts to be null

            // Then I need to check if they are null and pass the DBNull.Value .            

            // Try DBValue.Null
            if (String.IsNullOrEmpty(DGV1.CurrentRow.Cells["BalanceAfter"].Value.ToString()))
            {
                cmd.Parameters["@BalanceAfter"].Value = DBNull.Value;
            }
            else
            {
                cmd.Parameters["@BalanceAfter"].Value = DGV1.Rows[i].Cells["BalanceAfter"].Value;
            }
            // Another Try

            if (String.IsNullOrEmpty(Remarks.ToString()))
            {
                cmd.Parameters["@Remarks"].Value = DBNull.Value;
            }
            else
            {
                cmd.Parameters["@Remarks"].Value = DGV1.Rows[i].Cells["Remarks"].Value;
            }
            if (String.IsNullOrEmpty(Unit.ToString()))
            {
                cmd.Parameters["@Unit"].Value = DBNull.Value;
            }
            else
            {
                cmd.Parameters["@Unit"].Value = DGV1.Rows[i].Cells["Unit"].Value;
            }

            cn.Open();
            cmd.ExecuteNonQuery();

        }
    }
}

本部分:

代码语言:javascript
运行
复制
  if   (String.IsNullOrEmpty(DGV1.CurrentRow.Cells["BalanceAfter"].Value.ToString()))
                    {
                        cmd.Parameters["@BalanceAfter"].Value = DBNull.Value;
                    }
                    else
                    {
                        cmd.Parameters["@BalanceAfter"].Value = DGV1.Rows[i].Cells["BalanceAfter"].Value;
                    }

抛出错误:

对象引用未设置为对象实例

我也试过这个:

代码语言:javascript
运行
复制
 if (String.IsNullOrEmpty(Remarks.ToString()))
                {
                    cmd.Parameters["@Remarks"].Value = DBNull.Value;
                }
                else
                {
                    cmd.Parameters["@Remarks"].Value = DGV1.Rows[i].Cells["Remarks"].Value;
                }

但是会导致原来的错误,好像根本不存在一样。感谢你的帮助,谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-05 13:11:08

这很有用,不需要使用字符串方法就可以进行简单的空检查。

代码语言:javascript
运行
复制
  if (DGV1.CurrentRow.Cells["BalanceAfter"].Value == null)
                    {
                        cmd.Parameters["@BalanceAfter"].Value = DBNull.Value;
                    }
                    else
                    {
                        cmd.Parameters["@BalanceAfter"].Value = DGV1.Rows[i].Cells["BalanceAfter"].Value;
                    }

谢谢大家

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72126248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档