我有一种方法可以将来自Datagridview
的数据插入到数据库中的表中,如果Datagridview
中的所有单元格都不是Null
,则可以正常工作,但如果某些单元格为空或空,则会引发错误:
参数化查询需要未提供的参数
事实上,有些单元格可以为null,而db将接受这一事实,我需要的所需单元格已经被用户强制填充,因此可选单元格可以为null。
我的方法:
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();
}
}
}
本部分:
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;
}
抛出错误:
对象引用未设置为对象实例
我也试过这个:
if (String.IsNullOrEmpty(Remarks.ToString()))
{
cmd.Parameters["@Remarks"].Value = DBNull.Value;
}
else
{
cmd.Parameters["@Remarks"].Value = DGV1.Rows[i].Cells["Remarks"].Value;
}
但是会导致原来的错误,好像根本不存在一样。感谢你的帮助,谢谢
发布于 2022-05-05 13:11:08
这很有用,不需要使用字符串方法就可以进行简单的空检查。
if (DGV1.CurrentRow.Cells["BalanceAfter"].Value == null)
{
cmd.Parameters["@BalanceAfter"].Value = DBNull.Value;
}
else
{
cmd.Parameters["@BalanceAfter"].Value = DGV1.Rows[i].Cells["BalanceAfter"].Value;
}
谢谢大家
https://stackoverflow.com/questions/72126248
复制相似问题